首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用struct bio的延迟

使用struct bio的延迟
EN

Stack Overflow用户
提问于 2017-07-06 15:39:30
回答 1查看 151关注 0票数 0

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

我试图将一个自定义结构附加到我在make_request_fn收到的bio中,但是因为我没有创建这些结构,所以我不能使用bi_private字段。有什么办法可以解决这个问题吗?

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

我已经读到过blktrace和btt等工具,但我需要在我的模块中包含这些信息。有什么方法可以做到这一点吗?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-10 16:19:56

当我在drbd块驱动程序的源代码中找到类似的东西时,我使用的解决方案似乎是一个常见的变通方法。bi_private字段只能由分配它的函数使用。因此,我以如下方式使用了bio_clone

代码语言:javascript
复制
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。在调用bio_endio(bio_source)之前,您可能需要将bi_error字段复制到bio_source的bi_error中。

希望这对某些人有帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44942604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档