如何知道内核空间中是否存在自旋锁

时间:2015-02-04 09:38:35

标签: concurrency linux-kernel linux-device-driver spinlock

我正在使用NVIDIA API编写Linux Devide驱动程序,我注意到如果我将其称为持有自旋锁,则会出现一个函数失败。我问自己,内核函数如何知道它是否被称为持有spinklock?

如果我使用伪代码示例,可能会更好:

spin_lock_irqsave(&my_lock,flags)
nvidia_p2p_get_pages(...)
spin_unlock_irqrestore(&my_lock, flags)

在这种情况下,函数p2p_get_pages会返回一个错误(但如果我在没有自旋锁的情况下使用它,它会起作用......无论如何这不是问题)。

该功能失败后会发生什么?也许它试图采取另一个螺旋锁?还是睡觉?或者它检查自旋锁...以及如何?怎么知道自旋锁?

谢谢你!

1 个答案:

答案 0 :(得分:1)

可以通过调用spin_is_locked()来检查特定锁是否被锁定。 但是,nvidia驱动程序不太可能知道您的my_lock

许多功能只关心他们(可能)需要睡觉的事实。 当在原子上下文中时(即,当禁用中断时),这会爆炸。 为了检测这一点,许多这样的函数调用might_sleep()在实际发生坏事之前记录警告。 (might_sleep()也不知道你的锁,它只是检查是否禁用了中断。)