什么使blk_execute_rq_nowait排队的请求出列

时间:2014-11-12 23:40:19

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

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

问题的描述是我们通过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%肯定这一点,但看起来似乎有道理。我在这里向内核开发人员提出的问题是,我应该采取哪些措施来使这个请求出列?我没有在参考文献中找到任何说明的内容。

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

我有不正确的事吗?这样的请求是否只是由较低层采取的?我假设“不”,因为这似乎是中间层应该做的事情:把这些东西送到适当的地方。

1 个答案:

答案 0 :(得分:1)

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

下的设置
ls /sys/block/sda/queue/scheduler 

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