linux - 什么使 blk_execute_rq_nowait 排队的请求出队

标签 linux linux-kernel linux-device-driver

我正在努力增加 Linux 中 SCSI 中间层驱动程序的超时时间。至少,这就是追求。我正在熟悉司机。事实证明这是一项艰巨的任务。 Linux 文档项目 似乎已经过时了(内核之旅是基于 v 1.0.9 ... 真的吗?)。我也是found this来自 kernel.org。我也不确定它是不是最新的。

问题的描述是我们通过sg发送SCSI命令。 sg_io_hdr_t 中指定的任何超时如果超过 30 秒,似乎都会被忽略。我没有在 sg 驱动程序代码中看到任何东西,如果请求的超时时间更长,它似乎可以用 30 胜过。一般情况下,我们通过sg使用write/poll/read方式提交命令。我已经跟踪了 sg 代码,我相信调用 write(2) 会采用以下路径:

sg_write()
   sg_common_write()
      blk_execute_rq_nowait()

我绝不是 100% 肯定这一点,但它看起来确实有道理。我在这里对内核开发人员的问题是,我应该为哪个调用 grep 来使该请求出队?我没有在我所拥有的引用资料中找到任何说明这一点的内容。

最终,我正在寻找在中间层的什么地方,像这样的请求被出队以传输到较低层。我的前提是,如果我知道什么调用使 blk_execute_rq_nowait() 中使用的队列中的请求出队,那么我可以通过 grep 查找相应的源文件并从那里移动。 (如果有人愿意告诉我第一个链接中列出的所有文件是否都是 Linux 中 SCSI 中间层的正确文件列表,我在此先感谢您。我的内核版本:2.6.32。)

我有什么地方不对吗?这样的请求只是被下层接受了吗?我假设“不”,因为这似乎是中间层应该做的:将这些东西路由到正确的位置。

最佳答案

blk_execute_rq() - 此调用在 I/O 调度程序队列的后面插入一个请求。因此,您应该查看使请求出列的 I/O 调度程序代码。您可能想开始查看您的系统正在运行的 I/O 调度程序,cat/sys/block/sda/queue/scheduler 和设置

ls /sys/block/sda/queue/scheduler 

(应该类似于 noop [deadline] cfq),然后查看调度程序代码。

关于linux - 什么使 blk_execute_rq_nowait 排队的请求出队,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26898768/

相关文章:

c - SIGCHLD信号处理

linux - 文件意外结束

linux-kernel - 内核 qdiscs 模块中的网络数据包缓冲

linux - 用于协处理外设的 Linux 设备驱动程序的良好接口(interface)是什么

编译 tpm 驱动程序给出 tpm_open() undefined

c - 如何编写驱动程序代码?

linux - `tce-load -wi stress` 不起作用?

linux - 使用wget获取谷歌翻译的结果

linux - "Kernel header files not in any of expected locations"编译ixgbe驱动时

c - 对 CLOCK_TAI 的 pthread 条件支持