什么是blk_queue_segment_boundary()的用法

时间:2013-01-07 16:36:04

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

这本书ldd说的函数blk_queue_segment_boundary()是这样的:

  

某些设备无法处理跨特定大小的请求   记忆界限;如果您的设备是其中之一,请使用此功能   告诉内核关于那个边界。例如,如果您的设备   对于跨越4 MB边界的请求有困难,传入掩码   0x3fffff默认掩码是0xffffffff。

我不太明白这里的边界意味着什么,例如,我有一个虚拟块设备,它实际上是4MB文件,所以我想要一个不超过4MB边界的请求,

unsigned long sector = blk_rq_pos(req);
unsigned long offset = sector << 9;
unsigned long nbytes = blk_rq_bytes(req);

int file_offset = offset % (1 << 22);

我想要的是(file_offset + nbytes)不超过4M,但有时它超过4M, 那么,对blk_queue_segment_boundary()有什么误解吗?

1 个答案:

答案 0 :(得分:1)

某些控制器(特别是IDE)无法处理跨越4MB内存区域的DMA请求。将其视为段:索引寻址,其中索引不能大于设置边界。

还有blk_queue_max_segment_size。两者都用于构造对设备的正确请求 - 请求被重新排序和合并。

还有其他用途。例如,来自xen-blkfront.c

/* Each segment in a request is up to an aligned page in size. */
blk_queue_segment_boundary(rq, PAGE_SIZE - 1);
blk_queue_max_segment_size(rq, PAGE_SIZE);

请求仅限PAGE_SIZE以获得更好的效果。