我正在编写一个提供(虚拟)块设备的Linux内核模块(因此不会执行任何实际的硬件IO)。
目前我正在使用spin_lock_irqsave / spin_unlock_irqrestore来处理锁定。
在非进程上下文中只运行一个函数,这是块设备的make_request函数。
使用spin_lock_bh / spin_unlock_bh来处理锁是否安全?我想简单的spin_lock是不够的,因为make_request不是由进程运行的(这是正确的吗?)。
提前致谢。
答案 0 :(得分:2)
您的make_request函数实际上确实在进程上下文中运行。 q->make_request_fn
的唯一调用者是块层generic_make_request()
,它假设进程上下文(例如,查看它对current
的使用)。另一个例子是,drivers / md / md.c有md_make_request()
明确地在等待队列中休眠。
所以只要代码的其余部分都是流程上下文,使用普通spin_lock()
/ spin_unlock()
就完全安全了。