使用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中。

希望这可以帮助别人。