Linux 如何将多个结构BIOs组合到单个结构请求中?
我正在开发Linux内核版本2.6.39.1,并正在开发一个块设备驱动程序。在这方面,我想将多个Linux 如何将多个结构BIOs组合到单个结构请求中?,linux,linux-kernel,storage,linux-device-driver,block-device,Linux,Linux Kernel,Storage,Linux Device Driver,Block Device,我正在开发Linux内核版本2.6.39.1,并正在开发一个块设备驱动程序。在这方面,我想将多个struct bio组合成一个struct request,然后将其添加到request\u队列,以供设备驱动程序处理,即--scsi\u request\u fn() 我尝试使用struct bio的->bi_next字段链接我编写的多个struct bios,从而创建了struct bios的链接列表。当我调用submit\u bio()将bio提交到块设备层进行I/O时,会触发BUG\u ON(
struct bio
组合成一个struct request
,然后将其添加到request\u队列
,以供设备驱动程序处理,即--scsi\u request\u fn()
我尝试使用struct bio
的->bi_next
字段链接我编写的多个struct bio
s,从而创建了struct bio
s的链接列表。当我调用submit\u bio()
将bio提交到块设备层进行I/O时,会触发BUG\u ON()
,因为代码期望bio->biu next
为NULL
在将多个
struct bio
链接到一个struct请求
中,然后再将其发送到较低的层进行服务之前,是否有一种方法可以将多个struct bio
链接到一个struct请求中?我不知道如何将多个struct bio
串在一起,但您可能希望查看中的“任务收集器”实现和驱动程序,以获得另一种方法。没有太多文档,但libsas将其描述为
某些硬件(如aic94xx)具有更高的DMA能力
从主机内存一次执行多个任务(中断)。任务
收集器模式是一个可选功能,它支持
这是他们的硬件。(同样,它是完全可选的
即使您的硬件支持。)
在任务收集器模式下,SAS层将正常工作
合并任务,并在适当的时候
调用驱动程序在单个HA中DMA多个任务
打断DMB可能希望通过insmod/modprobe使用此功能
将lldd_max_execute_num设置为大于1的值
实际上,这使块层(也称为BIO)保持不变,但多个请求在驱动程序层累积并一起提交。谢谢您的回复,@ctuffli。我决定使用一种类似于所描述的结构。基本上,我分配一个struct-packet\u-data
,它将包含指向所有struct-bio
的指针,这些指针应该合并成一个struct-bio
(之后是一个struct-request
)。此外,我还将一些与驱动程序相关的信息存储在这个struct packet\u data
中。接下来,我分配一个新的struct bio
(我们称之为“merged_bio”),复制原始BIOs列表中的所有页面,然后使merged_bio->bi_private
指向struct packet_data
。这最后一次攻击将允许我跟踪原始BIOs的列表,并在成功传输合并的bio
后调用bio_endio()
来结束所有单个BIOs上的I/O
不确定这是否是最聪明的方法,但它实现了我的意图!:^)