一、步骤:
1:主机HOST组64Byte的SQE到SQ,copy到host内存的SQ中,具体位置由Tail来决定。
2:Host写SQ的DB,写的内容是Tail值。通知SSD取命令,register中的位置代表哪个Queue的DB。
3:SSD收到通知后,到SQ中取指
4:SSD执行命令;
5:指令执行完成,SSD往CQ中写指令执行结果;
6:SSD发送中断通知主机指令完成。MSI-X interrupt
7:收到中断,主机处理CQ,查看指令完成状态。
8:主机处理完CQ中的指令执行结果,通过DB回复SSD。指令结果已处理。
二、Tail、Head值如何获取。
习惯于分开考虑,即先判断host与ssd谁是生产者消费者,再分别讨论各自tail和head值获取方式。
第一步确认谁是生产者和消费者。生产者维护Tail,消费者维护Head。再确认是否满盘,如果满盘就无法写入。
1:对于SQ,HOST是生产者,自己维护tail。首先确认是否满盘,此时需要知道head值。head在SSD回给HOST的CQE中。Host拿到CQE就知道了head在哪里,但是具有延后性。Head和tail值拿到后,通过确认tail=1+head即可判断。
SSD是消费者,自己维护Head,判断是否空盘,需要获取tail,而tail的值在host发的SQDB中。
实际上,SQ是通过count值来确定是否满盘。预设队列深度为1024个Entry,最多申请1023个command ID,当申请不到了时候即表示满盘。在CQE回来时释放新的cmid。
2:对于CQ,SSD是生产者,自己维护tail。先确认是否满盘,此时需要知道head值。head值在host发的CQDB中。
host是消费者,自己维护head,对于CQ Tail DB信息,则是通过每个状态一个P位,Phase Tag,对于执行完置0,未执行是1。CQ在主机中,挨个判断一次。p位这里还需多研究总结,还不是很清楚具体运行逻辑。