【问题标题】:make_request and queue limitsmake_request 和队列限制
【发布时间】:2011-11-23 15:27:02
【问题描述】:

我正在编写一个模拟块设备的 linux 内核模块。

有多种调用可用于将块大小告知内核,因此它会相应地对齐和调整每个对驱动程序的请求的大小。这在“Linux Device Drives 3”一书中有详细记录。

本书描述了两种实现块设备的方法:使用“request”函数,或使用“make_request”函数。

目前尚不清楚,当使用简约的“make_request”方法时,队列限制调用是否适用(如果底层设备确实没有从顺序 IO 中受益,这也是更有效的方法,这种情况就是我)。

我真的很想让内核使用 4K 块大小与我对话,但我看到较小的 bio-s 会影响我的 make_request 函数。

我的问题是使用 make_request 时 blk_queue_limit_* 是否会影响 bio 大小?

提前谢谢你。

【问题讨论】:

  • 看来问题出在 blk_queue_logical_block_size 和 blk_queue_make_request 的顺序上。后面的函数将每个块限制值设置为其默认值,逻辑扇区大小为 512 字节。我只发现了 make_request 只接收logical_block_size * k 大小的bios这一事实的经验证据,所以我真的很想看看内核中保证这一点的行。

标签: linux-kernel kernel-module


【解决方案1】:

我想我已经在内核代码中找到了足够的证据表明,如果您使用 make_request,您将获得正确大小和对齐的 bios。

答案是:

您必须先调用 blk_queue_make_request,因为它将队列限制设置为默认值。在此之后,根据需要设置队列限制。

似乎内核提交bios的每一部分都做有效性检查,并且由提交者来做这些检查。我在 submit_bio 和 generic_make_request 中发现了不完整的验证。不过只要没人耍花招就可以了。

由于提交正确的简历是一项政策,但由提交者负责,而中间没有人这样做,我认为我必须实施明确的检查并且不通过错误的简历。既然它是一个策略,那么违规失败也没关系,而且由于它不是由内核强制执行的,所以进行显式检查是一件好事。

如果您想了解更多关于这个故事的信息,请参阅http://tlfabian.blogspot.com/2012/01/linux-block-device-drivers-queue-and.html

【讨论】:

    猜你喜欢
    • 2010-12-05
    • 1970-01-01
    • 2014-06-29
    • 2014-11-21
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    相关资源
    最近更新 更多