免费注册 查看新帖 |

Chinaunix

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

[文件系统] 关于block io layer 的困惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-22 22:00 |只看该作者 |倒序浏览
本帖最后由 remaper 于 2013-05-23 12:25 编辑

我大致的把block/下的代码都看了,实在没想明白是怎么一回事。

kernel版本:3.9

首先我理想中的block io层是这样的,对上层只提供submit_bio接口,将bio添加到request_queue里,然后后台会有thread,不断的从request_queue里将request取出来,dispatch给驱动去处理。

但是实际上有两个问题不是很清楚:
1、只看到初始化的时候,创建了一个kblockd_workqueue,对每个塞进来的work,调用blk_delay_work()来处理,其实就是触发->request_fn()来处理req,但是没看到谁(求指点),在哪里(求指点),往这个workqueue里塞work,也看到有几个API,比如blk_delay_queue(), kblockd_schedule_work()等,但用的地方不多,而且都是底层驱动在用。
2、submit_bio之后,将req插入到request_queue里,然后直接触发(我把其他不重要的路径忽略掉了)底层驱动的request_fn来处理req(不一定是刚提交的那个,在drivers/block/hd.c里,do_hd_request函数,是队首的req)。

不知道哪里理解错了,求指点。

论坛徽章:
0
2 [报告]
发表于 2013-05-24 14:08 |只看该作者
都是由底层驱动直接调用 blk_run_queue 或者blk_peek_request直接去那个队列里面拿request 出来执行的。
你说的那个hd,初始化的时候,就会调用他的hd_request,然后每次中断时都去blk_fetch_request. 循环执行。

你说的那个delay的时候,应该只是需要延时启动的时候才用吧。  其他的都是底层驱动,自己检测到磁盘可用时,主动去blk_run_queue 或者每次做完一个request之后继续进行下一个request的处理。

论坛徽章:
0
3 [报告]
发表于 2013-05-24 14:25 |只看该作者
回复 2# hmsghnh

你的意思是说:
block io layer只管把req放到队列里,并提供队列操作的API,让驱动自己到队列里取req,处理。这样?

还有,“然后每次中断时都去blk_fetch_request. 循环执行”  相关代码在哪?我对中断不熟悉,thx


   

论坛徽章:
0
4 [报告]
发表于 2013-05-28 12:54 |只看该作者
回复 3# remaper


    看代码是这样

论坛徽章:
0
5 [报告]
发表于 2013-06-06 15:18 |只看该作者
我也认为应该是有个线程,我找到了一个工作线程,应该是这个,在blk_init_queue-->blk_init_queue_node-->INIT_WORK(&q->unplug_work, blk_unplug_work);blk_unplug_work这个会调用q->unplug_fn回复 1# remaper


   

论坛徽章:
0
6 [报告]
发表于 2013-06-06 18:56 |只看该作者
remaper 发表于 2013-05-24 14:25
回复 2# hmsghnh

你的意思是说:


还有,“然后每次中断时都去blk_fetch_request. 循环执行”  相关代码在哪?我对中断不熟悉,thx????


你指的是unplug那个吧,应该是定时器中断触发或者超过penging的阈值后都会触发unplug的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP