6

我正在编写一个 Linux 块设备驱动程序,它通过注册的函数接收请求blk_init_queue()

我的硬件设备对请求重新排序,因此为了避免读写冲突,需要write(lba x)在发出之前等待完成read(lba x)

我的问题:Linux 块层是否会跟踪 RaW 冲突,并且在收到前一个的请求完成(通过)之前它不会发出,还是我必须在我的驱动程序中这样做?read(lba x)__blk_end_request_all(req r)write(lba x)

4

1 回答 1

0

根据下面的文章,Linux 块设备驱动程序现在可以自由地对请求进行任意重新排序,文件系统层负责避免危险和实现障碍。 https://lwn.net/Articles/400541/

唯一的例外是对实现回写缓存的设备的 REQ_FLUSH 和 REQ_FUA 请求。如果设置了这些标志,则 blk 设备驱动程序需要强制执行某些排序要求。 https://www.kernel.org/doc/Documentation/block/writeback_cache_control.txt

特别是,存在以下订购要求:

  • 没有写入数据,REQ_FLUSH - 除了固有的 FLUSH 要求(之前完成的 WRITE 应该在 FLUSH 完成时出现在媒体上)之外,没有任何排序约束。

  • 写入数据,REQ_FLUSH - 必须在发出写入数据之前完成 FLUSH。IE。在所有先前的写入都在媒体上之前,不得将写入数据写入媒体。

  • 写入数据,REQ_FUA - 写入应在发出 FLUSH 之前完成 - 即。写入数据应与先前完成的生物完成写入一起在盘片上。

  • 写入数据,REQ_FLUSH | REQ_FUA - 在所有先前的写入都在媒体上之前,不得将写入数据写入媒体,并且写入数据必须在生物完成时在媒体上。这通常按 FLUSH 写入 FLUSH 的顺序排列。

[来自 linux-fsdevel 邮件列表:http://www.spinics.net/lists/linux-fsdevel/msg45616.html]

于 2016-08-31T17:04:41.703 回答