linux-在处理请求时将队列锁定在块设备驱动程序中的正确方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux-在处理请求时将队列锁定在块设备驱动程序中的正确方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1186字,纯文字阅读大概需要2分钟。
内容图文
![linux-在处理请求时将队列锁定在块设备驱动程序中的正确方法](/upload/InfoBanner/zyjiaocheng/946/ce5ebfc228234740889f59f1a6fb8a7c.jpg)
我正在尝试为网络连接的硬盘编写设备驱动程序.我想知道锁定/解锁请求队列的正确方法是什么?在哪里?
澄清:
>我使用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-在处理请求时将队列锁定在块设备驱动程序中的正确方法全部内容,希望文章能够帮你解决linux-在处理请求时将队列锁定在块设备驱动程序中的正确方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。