linux 网络请求队列,linux-在处理请求时将队列锁定在块设备驱动程序中的正确方法...

我正在尝试为网络连接的硬盘编写设备驱动程序.我想知道锁定/解锁请求队列的正确方法是什么?在哪里?

澄清:

>我使用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);

}

但这失败并导致内核锁定.

还有其他想法吗?

解决方法:

传递给blk_init_queue的request_fn通过保持作为第二个参数传递的自旋锁并禁用中断来调用.因此,可以安全地假定没有正在运行的并行线程正在执行此request_fn.但是,如果您创建一个处理该请求的并行线程,则完全由您负责同步访问这些线程中的请求.

request_fn由__blk_run_queue_uncond调用,而__blk_run_queue_uncond又由函数__blk_run_queue和blk_execute_rq_nowait调用.如果您在Linux内核中搜索调用__blk_run_queue的函数,则可以通过持有q-> queue_lock(这是传递给函数blk_init_queue的自旋锁)来看到所有这些函数.

标签:linux-kernel,linux-device-driver,linux

来源: https://codeday.me/bug/20191122/2061264.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值