Linux 如何将多个结构BIOs组合到单个结构请求中?

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(

我正在开发Linux内核版本2.6.39.1,并正在开发一个块设备驱动程序。在这方面,我想将多个
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

不确定这是否是最聪明的方法,但它实现了我的意图!:^)