免费注册 查看新帖 |

Chinaunix

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

块设备驱动中有关IO请求的疑惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-22 20:51 |只看该作者 |倒序浏览
一个bio代表一次磁盘IO操作,将内存中几个段写入磁盘的一片相邻扇区。
但为何一个请求中会包含几个bio,这样做的目的是什么?一个请求中对硬盘中几片区域读或写有必要吗?

论坛徽章:
0
2 [报告]
发表于 2011-11-23 16:39 |只看该作者
比如vread。应该是将一段连续的磁盘内容读取到不连续的内存中。一般磁盘支持这种分散的dma。
没有你说的这种一次请求不同的bio,将不连续的磁盘读取到连续或者不连续的内存中。

另外,最近内核板块人气不行啊,我提的块驱动错误问题,一直没有人看啊。

论坛徽章:
0
3 [报告]
发表于 2011-11-24 10:10 |只看该作者
回复 2# ruslin
谢谢你的回复!
但ULK3的P573中确实提到一个请求包含一个或多个bio结构!

论坛徽章:
0
4 [报告]
发表于 2011-11-24 13:35 |只看该作者
回复 3# flikelinux


    我说的一个vread,应该就是产生的一个request然后包含了多个bio吧。

论坛徽章:
0
5 [报告]
发表于 2011-11-24 15:07 |只看该作者
回复 3# flikelinux


    这些问题最近很火,我也进来参与讨论一下。

   我印象当中似乎是这样的:在进入I/O scheduler之前,一个req是对应一个bio的,但是因为为了给旋转磁盘做一个优化,就会存在I/O scheduler把目的地址挨的较近的req合并,
   也就是出现了1个req里有多个bio的情况。

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
6 [报告]
发表于 2011-11-24 15:24 |只看该作者
回复 5# almeydifer

不会吧,我这一块看的不多,但是应该不会合并物理不相邻的req。如果一个bio和某个req可以无缝连接,可以把这个bio插进去,是不是这时出现一个req里有多个bio?为什么不直接扩展既存的bio?

论坛徽章:
0
7 [报告]
发表于 2011-11-24 16:32 |只看该作者
tacoe的观点是:一个req里只有一个bio, 但是这个req中的bio可能是多个bio合并后的bio.一个bio里有多个bio_vec, 一个bio_vec描述一段内存地址,支持DMA。

论坛徽章:
0
8 [报告]
发表于 2011-11-24 16:41 |只看该作者
在__make_request中有这么一段代码,可证明一个req中包含多个bio
  1. switch (el_ret) {
  2. 2834                 case ELEVATOR_BACK_MERGE:
  3. 2835                         BUG_ON(!rq_mergeable(req));
  4. 2836
  5. 2837                         if (!q->back_merge_fn(q, req, bio))//将bio合并到req这个请求中,具体什么情况下满足合并条件,我还没弄清楚。
  6. 2838                                 break;
  7. 2839
  8. 2840                         req->biotail->bi_next = bio;//合并成功后,将bio加入该req中。
  9. 2841                         req->biotail = bio;//更新最后一个bio指针
  10. 2842                         req->nr_sectors = req->hard_nr_sectors += nr_sectors;
  11. 2843                         req->ioprio = ioprio_best(req->ioprio, prio);
  12. 2844                         drive_stat_acct(req, nr_sectors, 0);
  13. 2845                         if (!attempt_back_merge(q, req))
  14. 2846                                 elv_merged_request(q, req);
  15. 2847                         goto out;
  16. 2848
  17. 2849                 case ELEVATOR_FRONT_MERGE:
  18. 2850                         BUG_ON(!rq_mergeable(req));
  19. 2851
  20. 2852                         if (!q->front_merge_fn(q, req, bio))
  21. 2853                                 break;
  22. 2854
  23. 2855                         bio->bi_next = req->bio;
  24. 2856                         req->bio = bio;
复制代码

论坛徽章:
0
9 [报告]
发表于 2011-12-10 14:24 |只看该作者
我是新手,我看到宋宝华的书是这么说的,一个请求包含很多bio,然后一个请求队列又包含多个请求!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP