Chinaunix

标题: 关于block io layer 的困惑 [打印本页]

作者: remaper    时间: 2013-05-22 22:00
标题: 关于block io layer 的困惑
本帖最后由 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)。

不知道哪里理解错了,求指点。
作者: hmsghnh    时间: 2013-05-24 14:08
都是由底层驱动直接调用 blk_run_queue 或者blk_peek_request直接去那个队列里面拿request 出来执行的。
你说的那个hd,初始化的时候,就会调用他的hd_request,然后每次中断时都去blk_fetch_request. 循环执行。

你说的那个delay的时候,应该只是需要延时启动的时候才用吧。  其他的都是底层驱动,自己检测到磁盘可用时,主动去blk_run_queue 或者每次做完一个request之后继续进行下一个request的处理。
作者: remaper    时间: 2013-05-24 14:25
回复 2# hmsghnh

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

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


   
作者: hmsghnh    时间: 2013-05-28 12:54
回复 3# remaper


    看代码是这样
作者: f22jay    时间: 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


   
作者: 鬼鬼一哈    时间: 2013-06-06 18:56
remaper 发表于 2013-05-24 14:25
回复 2# hmsghnh

你的意思是说:


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


你指的是unplug那个吧,应该是定时器中断触发或者超过penging的阈值后都会触发unplug的




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2