Linux kernel Linux块驱动程序合并bio';s

Linux kernel Linux块驱动程序合并bio';s,linux-kernel,linux-device-driver,device-driver,block-device,pci-e,Linux Kernel,Linux Device Driver,Device Driver,Block Device,Pci E,我有一个块设备驱动程序,它正在工作,经过一段时间。它适用于PCIe设备,我直接使用make_request_fn处理bios,而不是使用请求队列,因为该设备没有寻道时间。但是,它仍然有事务开销 当我从设备上连续读取时,我得到的bios有许多段(通常我最多32段),每个段由2个硬件扇区组成(因此2*2k),然后作为一个分散-聚集事务处理到设备上,节省了大量的信令开销。然而,在写操作中,bios每个只有2个扇区的一个段,因此操作总共需要更长的时间。我希望发生的是以某种方式使传入的bios由许多段组成

我有一个块设备驱动程序,它正在工作,经过一段时间。它适用于PCIe设备,我直接使用make_request_fn处理bios,而不是使用请求队列,因为该设备没有寻道时间。但是,它仍然有事务开销

当我从设备上连续读取时,我得到的bios有许多段(通常我最多32段),每个段由2个硬件扇区组成(因此2*2k),然后作为一个分散-聚集事务处理到设备上,节省了大量的信令开销。然而,在写操作中,bios每个只有2个扇区的一个段,因此操作总共需要更长的时间。我希望发生的是以某种方式使传入的bios由许多段组成,或者我自己明智地将bios合并在一起。这里的正确方法是什么

make\u request\u fn
的当前内容大致如下:

  • 确定bio的读/写
  • 对于bio中的每个片段,使用
    sg\u set\u页面在
    scatterlist*
    中输入
  • 使用
    PCI\u Map\u sg
  • 对于散射列表中的每个段,添加到定义多段DMA散射聚集操作的设备特定结构中
  • 将该结构映射到DMA
  • 进行交易
  • 解映射结构与SG-DMA
  • 如果失败,则使用
    -EIO
    调用
    bio\u endio
    ,如果成功,则调用
    0
请求队列的设置如下所示:

#define MYDEV_BLOCK_MAX_SEGS 32
#define MYDEV_SECTOR_SIZE 2048

blk_queue_make_request(mydev->queue, mydev_make_req);

set_bit(QUEUE_FLAG_NONROT, &mydev->queue->queue_flags);
blk_queue_max_segments(mydev->queue, MYDEV_BLOCK_MAX_SEGS);
blk_queue_physical_block_size(mydev->queue, MYDEV_SECTOR_SIZE);
blk_queue_logical_block_size(mydev->queue, MYDEV_SECTOR_SIZE);

blk_queue_flush(mydev->queue, 0);

blk_queue_segment_boundary(mydev->queue, -1UL);
blk_queue_max_segments(mydev->queue, MYDEV_BLOCK_MAX_SEGS);
blk_queue_dma_alignment(mydev->queue, 0x7);