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

标签 c linux-kernel kernel-module

我正在编写一个提供(虚拟) 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/

相关文章:

linux - 删除静态编译的设备驱动程序模块

kernel-module - 如何将 rpm 包固定到当前内核?

c - C (gcc) 代码中出现 SIGABRT 错误

python - Numpy数组切片转置内部数据

linux - ptrace 和线程

c - `#ifdef MODULE` 围绕 module_exit() 的用途?

Linux Kernel Module development compile for other kernel

c - 如何使我的高度模块化项目易于最终用户编译?

c - 如何使用C程序查找可移动设备的序列号

c - 内核空间和用户空间之间的大共享内存