nvme命令中prp_阿呆实战NVMe之十

提要

本系列文章,旨在带你开发一个NVMe SSD控制器的前端协议逻辑,只不过是在QEMU虚拟机环境中。上回说到了大白接受领导写到SQ队列的命令,设定计时器,让下面的小弟到时间后执行任务。本篇就来看SQ的命令怎么执行。你知道大部分SSD公司的工程师是工作在哪个SQ队列吗?阿呆将告诉你惊人的真相。

SQ的定时回调函数

其实我们在NVMe初始化的时候,就注册了SQ计时器对应的回调函数,sq_processing_timer_cb,所以计时器时间一到,这个函数就被调用了。这个函数的任务很简单,就是把所有的SQ队列扫描一遍,只要那个队列Head和Tail不相等,就意味着还有活没干完,就调用干活的函数process_sq去料理一下。如果料理完,还有没干完的活,说明在干活过程中勤快的大白又分派领导下发的命令了,所以再设定一个定时器,稍后继续干。唉,大白啊大白,怪不得领导那么信任你,谁叫你那么勤快呢?就是苦了俺们这帮干活的函数,每次听大白门铃一响,就不敢偷懒了:赶快干完活回家带孩子。

看得出来,process_sq是执行任务的核心,SQ有Admin队列和普通IO队列,这些都要在这个函数去区分执行。核心流程很清晰,如下,就是如果Admin队列,就调用nvme_admin_command执行Admin命令,IO队列,就调用nvme_command_set执行。执行完成后,填响应的内容到CQ条目中。post_cq_entry函数会把cqe的内容复制到CQ队列的尾巴上,并触发中断,向上级领导汇报工作成果。

1 if (sq_id ==ASQ_ID) {2 nvme_admin_command(n, &sqe, &cqe);3 } else{4 nvme_command_set(n, &sqe, &cqe);5 }6

7 /*Filling up the CQ entry*/

8 cqe.sq_id =sq_id;9 cqe.sq_head = n->sq[sq_id].head;10 cqe.command_id =sqe.cid;11 post_cq_entry(n, &n->cq[cq_id], &cqe);

Admin队列的执行

上面说是所有的SQ都扫一遍,那第一个就是Admin队列了。nvme_adm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值