我有点困惑,什么类型的函数是不允许在自旋锁的临界区
我特别对可重入函数感到困惑。我认为在自旋锁的临界区使用所有可重入函数都是不安全的,但是看起来像kfree和memcpy这样的函数可以使用。
那么我们如何知道哪些函数是可以的,哪些是不可以的呢?我通常认为任何可能阻塞的东西都是不安全的,但不是所有可重入函数都有阻塞的能力/潜力吗?
中断处理程序对自旋锁的作用和关系是什么?
向后可重入:可重入函数是在持有自旋锁时可以安全使用的函数。
许多不可重入的函数也可以。
最主要的问题是调用一个函数,该函数直接或间接地试图获取当前持有的相同锁,从而导致死锁。
特定于kmalloc
,尽管您在问题中没有指定:
上面的一般答案是为什么您听说kmalloc
在自旋锁中使用可能不安全的原因:它在默认情况下也获得自旋锁。使用GFP_ATOMIC
标志控制kmalloc
是否尝试获取自旋锁:
GFP_ATOMIC分配是高优先级的,不能休眠。这是在中断处理程序中使用的标志,在底部一半,而持有自旋锁,以及在其他无法入睡的情况下
http://books.gigatux.nl/mirror/kerneldevelopment/0672327201/ch11lev1sec4.html