我正在尝试为网络连接的硬盘编写设备驱动程序。我想知道锁定/解锁请求队列的正确方法是什么以及在哪里?
澄清:
- 我使用创建队列
blk_init_queue
并将请求处理函数和我创建的锁(即信号量)传递给该函数。 我的请求处理函数如下所示:
struct request *req; int ret; while ((req = blk_fetch_request(q)) != NULL) { ret = rb_transfer(req); }
我
rb_transfer
启动了一个新的内核线程来处理请求。一旦处理了请求并完成了数据传输,
blk_end_request_cur
就会在该请求上调用。
现在,我的问题是如何在上面的循环中保护对请求队列的访问?在一般的驱动程序中?
我试过这样的事情:
struct request *req;
int ret;
while ((req = blk_fetch_request(q)) != NULL) {
spin_lock(&lock);
ret = rb_transfer(req);
spin_unlock(&lock);
}
但这失败并导致内核锁定。
还有其他想法吗?