NVME Driver 解析之Create I/O Completion Queue command

来源:互联网 发布:郑大数据库程序设计 编辑:程序博客网 时间:2024/05/17 08:56
NVME Driver 解析之Create I/O Completion Queue command
先看一下spec中对Create I/O Completion Queue command的说明

Create I/O Completion Queue command就是把上面各个结构体填充好,然后发命令写到queue的tail中,然后按一下dooorbell的门铃

static  int adapter_alloc_cq(struct nvme_dev *dev, u16 qid, 
      struct nvme_queue *nvmeq)
{
int status;
struct nvme_command c;
int flags = NVME_QUEUE_PHYS_CONTIG | NVME_CQ_IRQ_ENABLED;//这两个flag对应Figure 50 的PC位和IEN位

 memset(&c, 0, sizeof(c));
 c.create_cq.opcode = nvme_admin_create_cq;//命令码05h,见下图
 c.create_cq.prp1 = cpu_to_le64(nvmeq->cq_dma_addr);//这是prp1的地址,是在nvme_alloc_queue中通过dma_alloc_coherent实现的
 c.create_cq.cqid = cpu_to_le16(qid);//这里的qid是nvme_create_io_queues中传下来的,其值是
 c.create_cq.qsize = cpu_to_le16(nvmeq->q_depth - 1);//qsize是指queue中有多少个entry,因为是0base的,所以要-1
 c.create_cq.cq_flags = cpu_to_le16(flags);
 c.create_cq.irq_vector = cpu_to_le16(nvmeq->cq_vector);//该queue所对应的中断向量

 status = nvme_submit_admin_cmd(dev, &c, NULL);//提交命令
 if (status)
  return -EIO;
 return 0;
}


nvme_submit_admin_cmd解析
nvme_submit_admin_cmd 函数原型int nvme_submit_admin_cmd(struct nvme_dev *dev, struct nvme_command *cmd,   u32 *result),它其实是调用了nvme_submit_sync_cmd(dev, 0, cmd, result, ADMIN_TIMEOUT);,即提交了一个同步的命令。
nvme提交命令有同步命令和异步命令两种,同步命令是指提交完命令以后要等待controller处理完并返回以后才能接着执行下面的操作,而异步命令则把命令提交进去以后就直接返回了,不需要等待明明处理完。同步命令多用于Admin Command 、User Admin Command,和NVME_IOCTL_SUBMIT_IO的提交。
关于同步命令的提交,将在下一篇文章中介绍
0 0
原创粉丝点击