static void nvme_init_sq(NvmeSQueue *sq, NvmeCtrl *n, uint64_t dma_addr,

    uint16_t sqid, uint16_t cqid, uint16_t size)

{

    int i;

    NvmeCQueue *cq;



    sq->ctrl = n;

    sq->dma_addr = dma_addr;

    sq->sqid = sqid;

    sq->size = size;

    sq->cqid = cqid;

    sq->head = sq->tail = 0;

    sq->io_req = g_malloc(sq->size * sizeof(*sq->io_req));



    QTAILQ_INIT(&sq->req_list);

    QTAILQ_INIT(&sq->out_req_list);

    for (i = 0; i < sq->size; i++) {

        sq->io_req[i].sq = sq;

        QTAILQ_INSERT_TAIL(&(sq->req_list), &sq->io_req[i], entry);

    }

    sq->timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, nvme_process_sq, sq);



    assert(n->cq[cqid]);

    cq = n->cq[cqid];

    QTAILQ_INSERT_TAIL(&(cq->sq_list), sq, entry);

    n->sq[sqid] = sq;

}
