【问题标题】:Latency using struct bio使用 struct bio 的延迟
【发布时间】:2017-12-10 02:08:08
【问题描述】:
我想为通过块层的每个 struct bio 绘制延迟信息。我有一个覆盖 make_request_fn 的模块。我想知道该简历从那里到达请求队列以及从那里到驱动程序等需要多长时间。
我尝试将自定义结构附加到我在 make_request_fn 收到的 bio,但由于我没有创建这些,我不能使用 bi_private 字段。有没有办法解决这个问题?
我有一个选择是制作一个 bio 包装结构并将 bio 结构复制到其中,然后将其传递给较低的函数,以便我可以使用 container_of 来记录时间。
我已阅读有关 blktrace 和 btt 等工具的信息,但我需要在我的模块中提供这些信息。有什么方法可以实现吗?
谢谢。
【问题讨论】:
标签:
linux-kernel
linux-device-driver
latency
blktrace
【解决方案1】:
一旦我在 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 中。
希望这对某人有所帮助。