0

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

我试图将一个自定义结构附加到我在 make_request_fn 收到的 bio 但由于我没有创建这些,我不能使用 bi_private 字段。有没有办法解决这个问题?

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

我已经阅读了诸如 blktrace 和 btt 之类的工具,但我需要在我的模块中使用这些信息。有什么办法可以做到这一点?

谢谢你。

4

1 回答 1

0

The solution I used seemed like a common workaround once I found something similar in the source of drbd block driver. The bi_private field can be used only by the function that allocates it. So I used bio_clone in the following way

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);

You'll have to write a bi_end_io function. Do remember to call bio_endio for original bio inside this function. You might need to copy bi_error field into bio_source's bi_error before calling bio_endio(bio_source).

Hope this helps someone.

于 2017-07-10T08:19:55.883 回答