使用struct bio的延迟
问题描述:
我想绘制穿过块层的每个struct bio的延迟信息。我有一个覆盖make_request_fn的模块。我想知道该生物从那里到达请求队列并从那里到司机等多久。使用struct bio的延迟
我试图附加一个自定义结构到我在make_request_fn接收的生物,但由于我没有创建这些,我不能使用bi_private字段。有什么办法可以解决这个问题吗?
我的一个选择是制作生物包装结构并将生物结构复制到其中,然后将其传递到较低的函数,以便我可以使用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中。
希望这可以帮助别人。