我使用测试代码从我自己的内核模块提交BIO:
如果我使用submit_bio(&bio) -
__get_request: dev 8:0:请求aux数据分配失败,丢失的数据可能是disturbed
我的主要目标是向未调用submit_bio()例程的堆栈式设备驱动程序提交BIOs。有什么想法和建议吗?
发布于 2019-01-04 03:43:09
我们的ZFS加密界的英雄Tom Caputi解决了这个问题。
基本上,调度器期望在运行请求的线程的任务结构中有一个io上下文。
您将在这里看到,io上下文是在generic_make_request_checks()中创建的。
https://elixir.bootlin.com/linux/latest/source/block/blk-core.c#L2323
如果从来没有为运行您的请求的任务结构创建它,您将看到消息"io sched可能会被干扰“。如果有的话,这是一条糟糕的消息。“没有为这个任务分配Scheduler上下文”会让这个问题变得更加明显。
我不是像tom那样的内核专家,但基本上是这样做的:bdev->bd_queue->make_request_fn
你的请求是由另一个线程处理的,这个线程没有分配上下文。
现在create_io_context没有被导出,所以你不能直接调用它。
但如果你把这个叫做:
https://elixir.bootlin.com/linux/latest/source/block/blk-ioc.c#L319
其被导出,io上下文将被分配不再警告消息。我想会有一些io的改进,因为调度器需要处理上下文。
https://stackoverflow.com/questions/53282940
复制相似问题