我正在编写一个提供(虚拟) block 设备的 linux 内核模块(因此没有执行实际的硬件 IO)。
目前我正在使用 spin_lock_irqsave/spin_unlock_irqrestore 来处理锁。
在非进程上下文中运行的函数只有一个,就是 block 设备的make_request函数。
使用 spin_lock_bh/spin_unlock_bh 来处理锁是否安全?我想简单的自旋锁是不够的,因为 make_request 不是由进程运行的(这是正确的吗?)。
提前致谢。
最佳答案
您的 make_request 函数实际上确实在进程上下文中运行。 q->make_request_fn
的唯一调用者是 block 层的 generic_make_request()
,它假定进程上下文(例如查看它对 current
的使用) .作为另一个示例,drivers/md/md.c 具有 md_make_request()
,它明确地在等待队列中休眠。
因此,只要您的所有其余代码也是进程上下文,您就可以完全安全地使用普通 spin_lock()
/spin_unlock()
。
关于c - 在 make_request 中使用什么样的自旋锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8169166/