使用struct bio的延迟

时间:2017-07-06 07:39:30

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

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

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

我有一个选择是制作一个生物包装结构,并在将生物结构传递给下层函数之前将其复制到其中,以便我可以使用container_of来记录时间。

我已经阅读过像blktrace和btt这样的工具,但我需要在我的模块中提供这些信息。有没有办法实现这个目标?

谢谢。

1 个答案:

答案 0 :(得分:0)

我使用的解决方案似乎是一个常见的解决方法,一旦我在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中。

希望这有助于某人。