对于函数blk_queue_segment_boundary(),书中写着如下所示:
有些设备无法处理跨越特定大小内存绑定的请求;如果您的设备是其中之一,请使用此函数将该边界告知内核。例如,如果您的设备遇到了跨越4 MB边界的请求问题,请传递0x3fffff掩码。默认掩码是0 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 +n字节)不大于4M,但实际上有时超过4M,那么,对blk_queue_segment_boundary()有什么误解吗?
发布于 2013-01-08 13:57:45
有些控制器(特别是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
。
https://stackoverflow.com/questions/14200095
复制相似问题