使用 struct bio 的延迟

Latency using struct bio

我想为每个通过块层的 struct bio 绘制延迟信息。我有一个覆盖 make_request_fn 的模块。我想知道那个 bio 从那里到达请求队列并从那里到驱动程序等需要多长时间。

我试图将自定义结构附加到我在 make_request_fn 收到的简历,但由于我没有创建这些,所以我无法使用 bi_private 字段。有什么办法可以解决这个问题吗?

我有一个选择是制作一个 bio 包装器结构并将 bio 结构复制到其中,然后再将其传递给较低的函数,这样我就可以使用 container_of 来记录时间。

我已经阅读了有关 blktrace 和 btt 等工具的信息,但我需要在我的模块中使用这些信息。有什么办法可以实现吗?

谢谢。

一旦我在 drbd 块驱动程序的源代码中发现类似的东西,我使用的解决方案似乎是一种常见的解决方法。 bi_private 字段只能由分配它的函数使用。所以我用下面的方式bio_clone

bio_copy = bio_clone(bio_source, GFP_NOIO);
struct something *instance = kmalloc(sizeof(struct something), GFP_KERNEL);
instance->bio_original = bio_source;
//update timestamps for latency inside this struct instance
bio_copy->bi_private = instance;
bio_copy->bi_end_io = my_end_io_function;
bio_copy->bi_dev = bio_source->bi_dev;

...
...
make_request_fn(queue, bio_copy);

您必须编写一个 bi_end_io 函数。请记住在此函数中为原始生物调用 bio_endio。在调用 bio_endio(bio_source).

之前,您可能需要将 bi_error 字段复制到 bio_source 的 bi_error 中

希望这对某人有所帮助。