我有一个块设备驱动程序正在运行,经过时尚。它适用于PCIe设备,我使用make_request_fn直接处理BIOS而不是使用请求队列,因为设备没有寻道时间。但是,它仍然有交易开销。
当我从设备中连续读取时,我得到了许多段(通常最多为32个)的bios,每个段包含2个硬件扇区(因此2 * 2k),然后将其作为一个分散 - 收集事务处理到设备,节省了大量的信令开销。然而,在写入时,bios每个只有一个扇区的2个扇区,因此操作总共需要更长的时间。我想要发生的是以某种方式导致传入的BIOS由许多段组成,或者自己将bios合并在一起。这里有什么正确的方法?
make_request_fn
的当前内容类似于:
scatterlist*
sg_set_page
中输入内容
pci_map_sg
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);