免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2851 | 回复: 6
打印 上一主题 下一主题

[硬件及驱动] 块设备层关于request和bio的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-28 11:09 |只看该作者 |倒序浏览
本帖最后由 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的末尾或开头,为什么不能在中间了??????

论坛徽章:
0
2 [报告]
发表于 2013-05-28 13:15 |只看该作者
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;
}

论坛徽章:
0
3 [报告]
发表于 2013-05-28 13:21 |只看该作者
一个request中可能有多个bio,但是这多个bio是连续的请求。所以可以认为一个request就是从start sector 到end sector的连续请求。

即使来一个middle sector在start end中间的话,(文件系统,设备文件同时访问应该可能会产生这种情况),那么也会新键一个request。

论坛徽章:
0
4 [报告]
发表于 2013-05-28 14:38 |只看该作者
你确定request里面的bio是连续的吗?如果是连续的那么bio直接也可以合并吧?回复 3# blake326


   

论坛徽章:
0
5 [报告]
发表于 2013-05-28 15:00 |只看该作者
回复 4# f22jay


1,连续的。哥不会忽悠你的。

2,    bio一般不能合并,bio的bi_end_io方法可能有区别(基于page或者buffer head)或者其他一些东西的原因。
    我没有见过bio合并的。

论坛徽章:
0
6 [报告]
发表于 2013-05-28 15:17 |只看该作者
感谢赐教回复 5# blake326


   

论坛徽章:
0
7 [报告]
发表于 2014-05-17 16:46 来自手机 |只看该作者
你好,我是做驱动开发的,看ldd3,里面讲直接利用request做做数据读写的方法是简单的方法,用bio去做的方法是高级一点的方法。想请问下,直接完成一个request和完成一个request的多个bio有什么优缺点?看不到bio的好处在哪里。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP