NVMe 用户空间驱动(三):实现2

到此为止,已经揭开了 NVMe 用户驱动的面纱,同时也了解了部分 NVMe 协议的内容。回顾一下,发现并没有很晦涩的东西,比较有技巧的是 IOVA 空间的管理。在本文写作的同时,发现了一个可以优化性能的地方,已经给 Fam zheng 发了 patch,性能大概提交了10%左右。
摘要由CSDN通过智能技术生成

续上篇。

IO完成的中断处理事件

irq 的事件处理函数是 nvme_handle_event。 这部分其实是可以优化的,通过 polling,去掉事件通知。 完成的处理逻辑是:

\1. 遍历所有的 Queue,包括 admin queue 和 IO queue;

\2. 检查 queue 的每一个 completion queue 的 entry,直到遇到没有完成的退出;

\3. cq 的 head ++;

\4. 根据 entry 的 cid 从 reqs 中取得 req;

\5. 调用 req 的 done 回调函数;

\6. q->inflight--;

\7. 通知硬件,可以回收 completion queue 的 entry 了。 *q->cq.doorbell = cpu_to_le32(q->cq.head);

297static bool nvme_process_completion(BDRVNVMeState *s, NVMeQueuePair *q)
298{
...
305    if (q->busy || s->plugged) {
306        trace_nvme_process_completion_queue_busy(s, q->index);
307        return false;
308    }
309    q->busy = true;
310    assert(q->inflight >= 0);
311    while (q->inflight) {
312        int16_t cid;
313        c = (NvmeCqe *)&q->cq.queue[q->cq.head *
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值