上一节给出了一个块驱动程序的框架。其中
static struct request_queue *simp_blkdev_queue;
这个结构很重要,我们将它的处理函数设置为:
simp_blkdev_queue = blk_init_queue(simp_blkdev_do_request,NULL);
但是内核却为我们做了很多我们不知道的事情,首先当一个bio请求过来时,内核调用
void generic_make_request(struct bio *bio)
函数来处理,然后如果驱动程序没有对request_queue结构中的成员
make_request_fn
赋值,则内核调用自己默认的或者设置好的I/O调度器,对bio进行合并和筛选最后再调用
simp_blkdev_do_request
进行工作。
现在我们对simp_blkdev_queue中的make_request_fn成员进行设置,即去除I/O调度器,又我们自己进行调度和选择。
simp_blkdev_queue = blk_alloc_queue(GFP_KERNEL);
blk_queue_make_request(simp_blkdev_queue,simp_blkdev_make_request);
simp_blkdev_make_request就是接下来调度和处理的函数。
2016.04.10