我正在使用NVIDIA API编写Linux Devide驱动程序,我注意到如果我将其称为持有自旋锁,则会出现一个函数失败。我问自己,内核函数如何知道它是否被称为持有spinklock?
如果我使用伪代码示例,可能会更好:spin_lock_irqsave(&my_lock,flags)
nvidia_p2p_get_pages(...)
spin_unlock_irqrestore(&my_lock, flags)
在这种情况下,函数p2p_get_pages会返回一个错误(但如果我在没有自旋锁的情况下使用它,它会起作用......无论如何这不是问题)。
该功能失败后会发生什么?也许它试图采取另一个螺旋锁?还是睡觉?或者它检查自旋锁...以及如何?怎么知道自旋锁?
谢谢你!答案 0 :(得分:1)
可以通过调用spin_is_locked()
来检查特定锁是否被锁定。
但是,nvidia驱动程序不太可能知道您的my_lock
。
许多功能只关心他们(可能)需要睡觉的事实。
当在原子上下文中时(即,当禁用中断时),这会爆炸。
为了检测这一点,许多这样的函数调用might_sleep()
在实际发生坏事之前记录警告。
(might_sleep()
也不知道你的锁,它只是检查是否禁用了中断。)