我最近阅读了 LDDv3 书的第5.5.2节(自旋锁和原子上下文):
持锁时避免睡觉可能会更加困难;许多内核函数可以休眠,而且这种行为并不总是有据可查。将数据复制到用户空间或从用户空间复制数据就是一个明显的例子:在复制可以继续之前,可能需要从磁盘换入所需的用户空间页面,并且该操作显然需要休眠。几乎任何必须分配内存的操作都可以休眠;kmalloc 可以决定放弃处理器,并等待更多内存可用,除非明确告知不要这样做。睡眠可能发生在令人惊讶的地方;编写将在自旋锁下执行的代码需要注意您调用的每个函数。
我很清楚,自旋锁必须始终保持尽可能短的时间,而且我认为从头开始编写正确的使用自旋锁的代码相对容易。
然而,假设我们有一个广泛使用自旋锁的大型项目。我们如何确保从受自旋锁保护的关键部分调用的函数永远不会休眠?
提前致谢!