make_request中使用什么样的自旋锁?

时间:2011-11-17 14:53:14

标签: c linux-kernel kernel-module

我正在编写一个提供(虚拟)块设备的Linux内核模块(因此不会执行任何实际的硬件IO)。

目前我正在使用spin_lock_irqsave / spin_unlock_irqrestore来处理锁定。

在非进程上下文中只运行一个函数,这是块设备的make_request函数。

使用spin_lock_bh / spin_unlock_bh来处理锁是否安全?我想简单的spin_lock是不够的,因为make_request不是由进程运行的(这是正确的吗?)。

提前致谢。

1 个答案:

答案 0 :(得分:2)

您的make_request函数实际上确实在进程上下文中运行。 q->make_request_fn的唯一调用者是块层generic_make_request(),它假设进程上下文(例如,查看它对current的使用)。另一个例子是,drivers / md / md.c有md_make_request()明确地在等待队列中休眠。

所以只要代码的其余部分都是流程上下文,使用普通spin_lock() / spin_unlock()就完全安全了。