自旋锁的临界区都有哪些功能不能使用?
Posted
技术标签:
【中文标题】自旋锁的临界区都有哪些功能不能使用?【英文标题】:What kind of functions cannot be used in the critical section of the spin lock?自旋锁的临界区有哪些功能不能使用? 【发布时间】:2021-12-14 02:43:58 【问题描述】:我对自旋锁的临界区中不允许使用哪些类型的函数感到有点困惑。
特别是我对可重入函数感到困惑。我认为在自旋锁的关键部分使用所有可重入函数都是不安全的,但似乎 kfree 和 memcpy 之类的函数可以使用。
那么我们如何知道哪些功能正常或不正常呢?我通常认为任何可能阻塞的东西都是不安全的,但不是所有的可重入函数都有阻塞的能力/潜力吗?
还有中断处理程序对自旋锁的作用和关系是什么?
【问题讨论】:
你把事情搞混了:reentrant =/= can sleep. @MarcoBonelli 那么在自旋锁内你能做的唯一限制就是不睡觉? 是的,基本上就是这样。你必须小心不要调用任何可能休眠的函数。 【参考方案1】:您有向后可重入:可重入函数是在持有自旋锁时可以安全使用的函数。
许多不可重入函数也可以。
主要问题是调用一个函数,该函数直接或间接尝试获取您当前持有的相同锁,从而导致死锁。
特定于kmalloc
,尽管您没有在问题中指定这一点:
上面的一般答案是您听说kmalloc
在自旋锁中使用可能不安全的原因:默认情况下,它还获取自旋锁。使用标志GFP_ATOMIC
控制kmalloc
是否尝试获取自旋锁:
GFP_ATOMIC 分配是高优先级的,不能休眠。这 是在中断处理程序中使用的标志,在下半部分,而 持有自旋锁,以及其他无法入睡的情况。
http://books.gigatux.nl/mirror/kerneldevelopment/0672327201/ch11lev1sec4.html
【讨论】:
Malloc 是可重入的,在持有自旋锁时使用不安全,所以我认为这不是真的 @Shisui 你从哪里来的? 你的意思是kmalloc
?您的问题是否集中在 Linux 内核上? kmalloc
有一个 get_free_pages
风格的位掩码参数,它决定了它满足什么样的重入要求。例如。 GFP_ATOMIC
更可重入。
@Kaz 是的,kmalloc。
@Shisui 我已经用与您的kmalloc
问题相关的信息更新了答案。以上是关于自旋锁的临界区都有哪些功能不能使用?的主要内容,如果未能解决你的问题,请参考以下文章