本篇研究的nvme驱动基于Linux 3.10.73 ,为什么选择这个版本呢,因为这个版本之后Linux 块层马上就换成支持多队列(可以参考Linux块层多队列之引入内核),小编的SUSE 11.3也正好能编译这个相对比较低的版本。(随后再看最新版本内核上nvme驱动的实现)
通过nvme_alloc_ns可知,nvme设备通过nvme_make_request()函数进入快层:
nvme_alloc_ns()
blk_queue_make_request(ns->queue, nvme_make_request);
快速看一下nvme_make_request()这个函数,就会发现nvme设备有多么任性,都没有申请request, 合并bio这种常规操作(因为它支持随机写,而且速度快,不需要),直接把提交过来的bio送到块设备驱动进行处理。(小编第一次看到这个函数时就小激动了一把)。
714 static void nvme_make_request(struct request_queue *q, struct bio *bio)
715 {
716 struct nvme_ns *ns = q->queuedata;
717 struct nvme_queue *nvmeq = get_nvmeq(ns->dev);
718 int result = -EBUSY;
719
720 spin_lock_irq(&nvmeq->q_lock);
721 if (bio_list_empty(&nvmeq->sq_cong))
722 result = nvme_submit_bio_queue(nvmeq, ns, bio);
723 if (