- 论坛徽章:
- 0
|
本帖最后由 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)。
不知道哪里理解错了,求指点。 |
|