块设备层关于request和bio的疑问
本帖最后由 f22jay 于 2013-05-28 11:24 编辑一个bio里面的所有磁盘扇区是连续的,而物理地址是不连续的。一个request里面所有的bio是按扇区大小排序,链接在一起? 也就是说request里面的对磁盘操作的扇区是不连续的,那将一个bio合并到request时,疑问如下
static inline int elv_try_merge(struct request *__rq, struct bio *bio)
{
int ret = ELEVATOR_NO_MERGE;
/*
* we can merge and sequence is ok, check if it's possible
*/
if (elv_rq_merge_ok(__rq, bio)) {
if (blk_rq_pos(__rq) + blk_rq_sectors(__rq) == bio->bi_sector) //request的下一个操作扇区,加上所有的扇区数,但是request里面的扇区不是连续的,这样就能判断是是这个request的处理的最后一个扇区吗??
ret = ELEVATOR_BACK_MERGE;
else if (blk_rq_pos(__rq) - bio_sectors(bio) == bio->bi_sector)
ret = ELEVATOR_FRONT_MERGE;
}
return ret;
}
并且bio只能合并到request的末尾或开头,为什么不能在中间了?????? core负责back merge
cfq的merge是front merge。
static int cfq_merge(struct request_queue *q, struct request **req,
struct bio *bio)
{
struct cfq_data *cfqd = q->elevator->elevator_data;
struct request *__rq;
__rq = cfq_find_rq_fmerge(cfqd, bio);
if (__rq && elv_rq_merge_ok(__rq, bio)) {
*req = __rq;
return ELEVATOR_FRONT_MERGE;
}
return ELEVATOR_NO_MERGE;
}
一个request中可能有多个bio,但是这多个bio是连续的请求。所以可以认为一个request就是从start sector 到end sector的连续请求。
即使来一个middle sector在start end中间的话,(文件系统,设备文件同时访问应该可能会产生这种情况),那么也会新键一个request。
你确定request里面的bio是连续的吗?如果是连续的那么bio直接也可以合并吧?回复 3# blake326
回复 4# f22jay
1,连续的。哥不会忽悠你的。
2, bio一般不能合并,bio的bi_end_io方法可能有区别(基于page或者buffer head)或者其他一些东西的原因。
我没有见过bio合并的。 感谢赐教回复 5# blake326
你好,我是做驱动开发的,看ldd3,里面讲直接利用request做做数据读写的方法是简单的方法,用bio去做的方法是高级一点的方法。想请问下,直接完成一个request和完成一个request的多个bio有什么优缺点?看不到bio的好处在哪里。
页:
[1]