Linux kernel 使用structbio的延迟

Linux kernel 使用structbio的延迟,linux-kernel,linux-device-driver,latency,blktrace,Linux Kernel,Linux Device Driver,Latency,Blktrace,我想为通过块层的每个struct bio绘制延迟信息。我有一个覆盖make_request_fn的模块。我想知道那个bio从那个里到达请求队列和从那个里到驱动程序等需要多长时间 我试图将自定义结构附加到我在make_request_fn收到的bio,但由于我没有创建这些结构,我无法使用bi_private字段。有办法解决这个问题吗 我的一个选择是创建一个bio包装器结构,并在将其传递给较低的函数之前将bio结构复制到其中,这样我就可以使用的container_来记录时间 我已经读过像blktra

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

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

我的一个选择是创建一个bio包装器结构,并在将其传递给较低的函数之前将bio结构复制到其中,这样我就可以使用的container_来记录时间

我已经读过像blktrace和btt这样的工具,但我需要在我的模块中包含这些信息。有没有办法做到这一点


谢谢。

当我在drbd块驱动程序的源代码中找到类似的东西时,我使用的解决方案似乎是一种常见的解决方法。BIU专用字段只能由分配它的函数使用。因此,我使用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调用bio_endio。在调用bio_endio(bio_source)之前,您可能需要将bi_error字段复制到bio_source的bi_error中

希望这对别人有帮助