我最近读部分5.5.2(自旋锁和原子上下文)LDDv3书:避免睡在持有自旋锁
避免睡在持有锁会更加困难;许多内核函数可以睡眠,并且这种行为并不总是记录得很好。将数据复制到用户空间或从用户空间复制数据是一个明显的例子:需要的用户空间页面可能需要在复制进行之前从磁盘交换,并且该操作显然需要休眠。几乎任何必须分配内存的操作都可以睡眠; kmalloc可以决定放弃处理器,并等待更多的内存变得可用,除非明确告知不要。睡觉可能发生在令人惊讶的地方;编写将在自旋锁下执行的代码需要注意您称为的每个函数。
我很清楚自旋锁必须始终保持最短时间,我认为从头开始编写正确的自旋锁代码是相对容易的。
但是,假设我们有一个大型项目,其中自旋锁被广泛使用。 我们如何确保从被自旋锁保护的关键部分调用的函数永远不会睡眠?
在此先感谢!
好点!不知道这一点。 – 2010-09-09 19:01:06
仅供参考,这个选项是'CONFIG_DEBUG_ATOMIC_SLEEP' – TheCodeArtist 2017-12-26 10:58:28