我正在使用NVIDIA API编写一个Linux设备驱动程序,我注意到如果我调用一个持有自旋锁的函数,它就会失败。我在问自己,一个内核函数如何知道它是否被称为持有旋转锁?
如果我使用一个伪代码示例可能会更好:
spin_lock_irqsave(&my_lock,flags)
nvidia_p2p_get_pages(...)
spin_unlock_irqrestore(&my_lock, flags)这种情况下的函数p2p_get_pages返回一个错误(但如果我使用它时没有使用自旋锁,则它可以工作……无论如何,这不是问题所在)。
在失败的函数内部会发生什么?也许它想要另一个自旋锁?还是睡觉?或者它检查自旋锁..。又是如何做到的?它怎么会知道自旋锁的事?
谢谢!
发布于 2015-02-05 00:00:46
可以通过调用spin_is_locked()来检查特定的锁是否被锁定。但是,nvidia驱动程序不太可能知道您的my_lock。
许多函数只关心它们(可能)需要睡眠这一事实。当处于原子上下文中时(即,当中断被禁用时),这将会爆炸。为了检测到这一点,许多这样的函数调用might_sleep()来在实际发生坏事之前记录一个警告。
https://stackoverflow.com/questions/28318020
复制相似问题