IO调度器

由于对blktrace的好奇,来到了block层.通过阅读block层的代码,自己的几个错误认知被纠正,比如

一) 同步操作时,进程是在驱动中睡觉真实情况是:进程在文件系统睡觉

二) 对同一个数据块的读写是在block控制

真实情况是:对同一数据块的是在文件系统中控制.

两个周来,对文件系统肃然起敬,文件系统是一个你要花至少一年,才只能读懂其50%的模块,甚至,要想领悟文件系统的精髓,你要读page-cache,要读block层,甚至要理解存储芯片的读/写/擦除特性,真是a long long journey!

前面对page-cache做了一个大致的分析,基本能够理清其中的脉络,已经达到了效果,所以想往下走,看看block层,block层最重要的是IO调度器,看下IO调度器是怎么回事.

下面几篇文章就分析deadline-ioscheduler.

 31 struct bvec_iter {
 32     sector_t        bi_sector;  /* device address in 512 byte  sectors */ 下发到设备的首地址
 34     unsigned int        bi_size;    /* residual I/O count */ 下发的数量
 36     unsigned int        bi_idx;     /* current index into bvl_vec */
 38     unsigned int            bi_bvec_done;   /* number of bytes completed in current bvec */
 40 };  

bio相关函数积累:

bio_end_sector(bio)

bio_data_dir(bio)

bool blk_rq_merge_ok(struct request *rq, struct bio *bio)
blk_rq_merge_ok 对bio是否能合入rq做了最严格的过滤,

从block层取出一个request之后, 就开始

 323     q->request_fn_active++;
 324     q->request_fn(q); /* scsi_request_fn */ 这里的request_fn中调用的是scsi_request_fn!
 325     q->request_fn_active--;