diff --git a/test/external_code/nvme/nvme.c b/test/external_code/nvme/nvme.c index 0f206ae02..c3b66d62f 100644 --- a/test/external_code/nvme/nvme.c +++ b/test/external_code/nvme/nvme.c @@ -433,6 +433,45 @@ identify_ctrlr(struct nvme_ctrlr *ctrlr) return 0; } +int32_t process_completions(struct nvme_qpair *qpair); + +int32_t +process_completions(struct nvme_qpair *qpair) +{ + struct spdk_nvme_cpl *cpl; + struct nvme_request *request; + int32_t max_completions, num_completions = 0; + + max_completions = qpair->num_entries - 1; + while (1) { + cpl = &qpair->cpl[qpair->cq_head]; + + if (cpl->status.p != qpair->phase) { + break; + } + + if (spdk_unlikely(++qpair->cq_head == qpair->num_entries)) { + qpair->cq_head = 0; + qpair->phase = !qpair->phase; + } + + qpair->sq_head = cpl->sqhd; + request = &qpair->requests[cpl->cid]; + request->cb_fn(request->cb_arg, cpl); + TAILQ_INSERT_TAIL(&qpair->free_requests, request, tailq); + + if (++num_completions == max_completions) { + break; + } + } + + if (num_completions > 0) { + spdk_mmio_write_4(qpair->cq_hdbl, qpair->cq_head); + } + + return num_completions; +} + static int process_ctrlr_init(struct nvme_ctrlr *ctrlr) {