NVMe admin队列命令处理

今天看了NVMe admin队列中命令处理过程,做了一个整理,后面可能会进行完善:

以创建I/O队列为例,host向Controller发出一个admin命令,创建I/O队列:

     1 首先Host在内存中分配一块内存区域给I/O SQ和I/O CQ

     2 Host向admin SQ中发送创建I/O队列的SQ命令:首先创建一个request,request创建完成以后,将request的命令拷贝到admin SQ中,并更新sq尾门铃

     3 sq尾门铃寄存器值的修改会通知Controller进行必要的处理,如果处理完成Controller会向admin CQ中发出一条命令

     4 Host通过while(1)循环,去admin CQ中依次查找当前进程处理的命令(即创建I/O队列的SQ处理完成命令),对admin CQ进行轮询,依次追踪每一条命令的追踪器tracker,如果此命令的处理进程id与当前进程id不一致,那么在当前Controller的活动进程(active_procs)中找到此命令对应的处理进程,然后将此命令加入到此处理进程的active_req列表中,如果找到对应的完成命令,执行当前完成命令的回调函数。轮询admin CQ一遍之后,将此CQ队列的所有条目的phase置反,并依次处理active_proc->active_reqs中的请求。如果轮询一遍之后,还是未找到当前进程想要处理的完成命令(即当前进程创建I/O队列的SQ处理完成命令),那么重新轮询一遍admin CQ,做上述操作,直到查询到对应的完成命令,调用对应的回调函数,此时就不会再继续轮询CQ

        创建I/O的CQ与创建I/O的SQ是相同的操作

你可能感兴趣的:(NVMe admin队列命令处理)