自旋锁的临界区都有哪些功能不能使用?

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 问题相关的信息更新了答案。

以上是关于自旋锁的临界区都有哪些功能不能使用?的主要内容,如果未能解决你的问题,请参考以下文章

linux 内核同步机制之自旋锁

Linux内核自旋锁

Linux设备驱动程序 之 自旋锁

高效编程之互斥锁和自旋锁的一些知识

内核同步机制

java锁的种类以及辨析:自旋锁