Linux块驱动程序合并bio

时间:2012-11-30 13:37:38

标签: linux-kernel linux-device-driver device-driver block-device pci-e

我有一个块设备驱动程序正在运行,经过时尚。它适用于PCIe设备,我使用make_request_fn直接处理BIOS而不是使用请求队列,因为设备没有寻道时间。但是,它仍然有交易开销。

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

make_request_fn的当前内容类似于:

  • 确定生物的读/写
  • 对于bio中的每个细分,请使用scatterlist*
  • sg_set_page中输入内容
  • 使用pci_map_sg
  • 将此分散列表映射到PCI
  • 对于散点列表中的每个段,添加到定义多段DMA分散 - 收集操作的特定于设备的结构
  • 将该结构映射到DMA
  • 执行交易
  • 取消映射结构和SG DMA
  • 如果失败则与bio_endio联系-EIO,如果成功,请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);

0 个答案:

没有答案