diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index f99d12bd3e..8d27a4dec1 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -422,10 +422,15 @@ static int nvme_ctrlr_identify(struct spdk_nvme_ctrlr *ctrlr) { struct nvme_completion_poll_status status; + int rc; status.done = false; - nvme_ctrlr_cmd_identify_controller(ctrlr, &ctrlr->cdata, - nvme_completion_poll_cb, &status); + rc = nvme_ctrlr_cmd_identify_controller(ctrlr, &ctrlr->cdata, + nvme_completion_poll_cb, &status); + if (rc != 0) { + return rc; + } + while (status.done == false) { nvme_qpair_process_completions(&ctrlr->adminq, 0); } @@ -452,6 +457,7 @@ nvme_ctrlr_set_num_qpairs(struct spdk_nvme_ctrlr *ctrlr) struct nvme_driver *driver = &g_nvme_driver; struct nvme_completion_poll_status status; int cq_allocated, sq_allocated; + int rc; uint32_t max_io_queues; status.done = false; @@ -460,8 +466,12 @@ nvme_ctrlr_set_num_qpairs(struct spdk_nvme_ctrlr *ctrlr) max_io_queues = driver->max_io_queues; nvme_mutex_unlock(&driver->lock); - nvme_ctrlr_cmd_set_num_queues(ctrlr, max_io_queues, - nvme_completion_poll_cb, &status); + rc = nvme_ctrlr_cmd_set_num_queues(ctrlr, max_io_queues, + nvme_completion_poll_cb, &status); + if (rc != 0) { + return rc; + } + while (status.done == false) { nvme_qpair_process_completions(&ctrlr->adminq, 0); } @@ -493,6 +503,7 @@ nvme_ctrlr_create_qpairs(struct spdk_nvme_ctrlr *ctrlr) struct nvme_completion_poll_status status; struct spdk_nvme_qpair *qpair; uint32_t i; + int rc; if (nvme_ctrlr_construct_io_qpairs(ctrlr)) { nvme_printf(ctrlr, "nvme_ctrlr_construct_io_qpairs failed!\n"); @@ -503,8 +514,12 @@ nvme_ctrlr_create_qpairs(struct spdk_nvme_ctrlr *ctrlr) qpair = &ctrlr->ioq[i]; status.done = false; - nvme_ctrlr_cmd_create_io_cq(ctrlr, qpair, - nvme_completion_poll_cb, &status); + rc = nvme_ctrlr_cmd_create_io_cq(ctrlr, qpair, + nvme_completion_poll_cb, &status); + if (rc != 0) { + return rc; + } + while (status.done == false) { nvme_qpair_process_completions(&ctrlr->adminq, 0); } @@ -514,8 +529,12 @@ nvme_ctrlr_create_qpairs(struct spdk_nvme_ctrlr *ctrlr) } status.done = false; - nvme_ctrlr_cmd_create_io_sq(qpair->ctrlr, qpair, - nvme_completion_poll_cb, &status); + rc = nvme_ctrlr_cmd_create_io_sq(qpair->ctrlr, qpair, + nvme_completion_poll_cb, &status); + if (rc != 0) { + return rc; + } + while (status.done == false) { nvme_qpair_process_completions(&ctrlr->adminq, 0); } @@ -663,12 +682,16 @@ nvme_ctrlr_configure_aer(struct spdk_nvme_ctrlr *ctrlr) struct nvme_async_event_request *aer; uint32_t i; struct nvme_completion_poll_status status; + int rc; status.done = false; state.raw = 0xFF; state.bits.reserved = 0; - nvme_ctrlr_cmd_set_async_event_config(ctrlr, state, nvme_completion_poll_cb, &status); + rc = nvme_ctrlr_cmd_set_async_event_config(ctrlr, state, nvme_completion_poll_cb, &status); + if (rc != 0) { + return rc; + } while (status.done == false) { nvme_qpair_process_completions(&ctrlr->adminq, 0); diff --git a/lib/nvme/nvme_ctrlr_cmd.c b/lib/nvme/nvme_ctrlr_cmd.c index 174382f131..ff07149020 100644 --- a/lib/nvme/nvme_ctrlr_cmd.c +++ b/lib/nvme/nvme_ctrlr_cmd.c @@ -76,7 +76,7 @@ spdk_nvme_ctrlr_cmd_admin_raw(struct spdk_nvme_ctrlr *ctrlr, return 0; } -void +int nvme_ctrlr_cmd_identify_controller(struct spdk_nvme_ctrlr *ctrlr, void *payload, spdk_nvme_cmd_cb cb_fn, void *cb_arg) { @@ -86,6 +86,9 @@ nvme_ctrlr_cmd_identify_controller(struct spdk_nvme_ctrlr *ctrlr, void *payload, req = nvme_allocate_request_contig(payload, sizeof(struct spdk_nvme_ctrlr_data), cb_fn, cb_arg); + if (req == NULL) { + return ENOMEM; + } cmd = &req->cmd; cmd->opc = SPDK_NVME_OPC_IDENTIFY; @@ -97,9 +100,10 @@ nvme_ctrlr_cmd_identify_controller(struct spdk_nvme_ctrlr *ctrlr, void *payload, cmd->cdw10 = 1; nvme_ctrlr_submit_admin_request(ctrlr, req); + return 0; } -void +int nvme_ctrlr_cmd_identify_namespace(struct spdk_nvme_ctrlr *ctrlr, uint16_t nsid, void *payload, spdk_nvme_cmd_cb cb_fn, void *cb_arg) { @@ -109,6 +113,9 @@ nvme_ctrlr_cmd_identify_namespace(struct spdk_nvme_ctrlr *ctrlr, uint16_t nsid, req = nvme_allocate_request_contig(payload, sizeof(struct spdk_nvme_ns_data), cb_fn, cb_arg); + if (req == NULL) { + return ENOMEM; + } cmd = &req->cmd; cmd->opc = SPDK_NVME_OPC_IDENTIFY; @@ -119,9 +126,10 @@ nvme_ctrlr_cmd_identify_namespace(struct spdk_nvme_ctrlr *ctrlr, uint16_t nsid, cmd->nsid = nsid; nvme_ctrlr_submit_admin_request(ctrlr, req); + return 0; } -void +int nvme_ctrlr_cmd_create_io_cq(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *io_que, spdk_nvme_cmd_cb cb_fn, void *cb_arg) @@ -130,6 +138,9 @@ nvme_ctrlr_cmd_create_io_cq(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_cmd *cmd; req = nvme_allocate_request_null(cb_fn, cb_arg); + if (req == NULL) { + return ENOMEM; + } cmd = &req->cmd; cmd->opc = SPDK_NVME_OPC_CREATE_IO_CQ; @@ -147,9 +158,10 @@ nvme_ctrlr_cmd_create_io_cq(struct spdk_nvme_ctrlr *ctrlr, cmd->dptr.prp.prp1 = io_que->cpl_bus_addr; nvme_ctrlr_submit_admin_request(ctrlr, req); + return 0; } -void +int nvme_ctrlr_cmd_create_io_sq(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *io_que, spdk_nvme_cmd_cb cb_fn, void *cb_arg) { @@ -157,6 +169,9 @@ nvme_ctrlr_cmd_create_io_sq(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_cmd *cmd; req = nvme_allocate_request_null(cb_fn, cb_arg); + if (req == NULL) { + return ENOMEM; + } cmd = &req->cmd; cmd->opc = SPDK_NVME_OPC_CREATE_IO_SQ; @@ -171,6 +186,7 @@ nvme_ctrlr_cmd_create_io_sq(struct spdk_nvme_ctrlr *ctrlr, cmd->dptr.prp.prp1 = io_que->cmd_bus_addr; nvme_ctrlr_submit_admin_request(ctrlr, req); + return 0; } int @@ -226,18 +242,18 @@ spdk_nvme_ctrlr_cmd_get_feature(struct spdk_nvme_ctrlr *ctrlr, uint8_t feature, return 0; } -void +int nvme_ctrlr_cmd_set_num_queues(struct spdk_nvme_ctrlr *ctrlr, uint32_t num_queues, spdk_nvme_cmd_cb cb_fn, void *cb_arg) { uint32_t cdw11; cdw11 = ((num_queues - 1) << 16) | (num_queues - 1); - spdk_nvme_ctrlr_cmd_set_feature(ctrlr, SPDK_NVME_FEAT_NUMBER_OF_QUEUES, cdw11, 0, - NULL, 0, cb_fn, cb_arg); + return spdk_nvme_ctrlr_cmd_set_feature(ctrlr, SPDK_NVME_FEAT_NUMBER_OF_QUEUES, cdw11, 0, + NULL, 0, cb_fn, cb_arg); } -void +int nvme_ctrlr_cmd_set_async_event_config(struct spdk_nvme_ctrlr *ctrlr, union spdk_nvme_critical_warning_state state, spdk_nvme_cmd_cb cb_fn, void *cb_arg) @@ -245,8 +261,9 @@ nvme_ctrlr_cmd_set_async_event_config(struct spdk_nvme_ctrlr *ctrlr, uint32_t cdw11; cdw11 = state.raw; - spdk_nvme_ctrlr_cmd_set_feature(ctrlr, SPDK_NVME_FEAT_ASYNC_EVENT_CONFIGURATION, cdw11, 0, NULL, 0, - cb_fn, cb_arg); + return spdk_nvme_ctrlr_cmd_set_feature(ctrlr, SPDK_NVME_FEAT_ASYNC_EVENT_CONFIGURATION, cdw11, 0, + NULL, 0, + cb_fn, cb_arg); } int @@ -276,7 +293,7 @@ spdk_nvme_ctrlr_cmd_get_log_page(struct spdk_nvme_ctrlr *ctrlr, uint8_t log_page return 0; } -void +int nvme_ctrlr_cmd_abort(struct spdk_nvme_ctrlr *ctrlr, uint16_t cid, uint16_t sqid, spdk_nvme_cmd_cb cb_fn, void *cb_arg) { @@ -284,10 +301,14 @@ nvme_ctrlr_cmd_abort(struct spdk_nvme_ctrlr *ctrlr, uint16_t cid, struct spdk_nvme_cmd *cmd; req = nvme_allocate_request_null(cb_fn, cb_arg); + if (req == NULL) { + return ENOMEM; + } cmd = &req->cmd; cmd->opc = SPDK_NVME_OPC_ABORT; cmd->cdw10 = (cid << 16) | sqid; nvme_ctrlr_submit_admin_request(ctrlr, req); + return 0; } diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index 0791f602ff..f483c32d5b 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -443,25 +443,25 @@ nvme_align32pow2(uint32_t x) } /* Admin functions */ -void nvme_ctrlr_cmd_identify_controller(struct spdk_nvme_ctrlr *ctrlr, +int nvme_ctrlr_cmd_identify_controller(struct spdk_nvme_ctrlr *ctrlr, void *payload, spdk_nvme_cmd_cb cb_fn, void *cb_arg); -void nvme_ctrlr_cmd_identify_namespace(struct spdk_nvme_ctrlr *ctrlr, +int nvme_ctrlr_cmd_identify_namespace(struct spdk_nvme_ctrlr *ctrlr, uint16_t nsid, void *payload, spdk_nvme_cmd_cb cb_fn, void *cb_arg); -void nvme_ctrlr_cmd_create_io_cq(struct spdk_nvme_ctrlr *ctrlr, +int nvme_ctrlr_cmd_create_io_cq(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *io_que, spdk_nvme_cmd_cb cb_fn, void *cb_arg); -void nvme_ctrlr_cmd_create_io_sq(struct spdk_nvme_ctrlr *ctrlr, +int nvme_ctrlr_cmd_create_io_sq(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *io_que, spdk_nvme_cmd_cb cb_fn, void *cb_arg); -void nvme_ctrlr_cmd_set_num_queues(struct spdk_nvme_ctrlr *ctrlr, +int nvme_ctrlr_cmd_set_num_queues(struct spdk_nvme_ctrlr *ctrlr, uint32_t num_queues, spdk_nvme_cmd_cb cb_fn, void *cb_arg); -void nvme_ctrlr_cmd_set_async_event_config(struct spdk_nvme_ctrlr *ctrlr, +int nvme_ctrlr_cmd_set_async_event_config(struct spdk_nvme_ctrlr *ctrlr, union spdk_nvme_critical_warning_state state, spdk_nvme_cmd_cb cb_fn, void *cb_arg); -void nvme_ctrlr_cmd_abort(struct spdk_nvme_ctrlr *ctrlr, uint16_t cid, +int nvme_ctrlr_cmd_abort(struct spdk_nvme_ctrlr *ctrlr, uint16_t cid, uint16_t sqid, spdk_nvme_cmd_cb cb_fn, void *cb_arg); void nvme_completion_poll_cb(void *arg, const struct spdk_nvme_cpl *cpl); diff --git a/lib/nvme/nvme_ns.c b/lib/nvme/nvme_ns.c index 1b6c9005ba..1ad1edb922 100644 --- a/lib/nvme/nvme_ns.c +++ b/lib/nvme/nvme_ns.c @@ -101,6 +101,7 @@ nvme_ns_construct(struct spdk_nvme_ns *ns, uint16_t id, struct nvme_completion_poll_status status; struct spdk_nvme_ns_data *nsdata; uint32_t pci_devid; + int rc; nvme_assert(id > 0, ("invalid namespace id %d", id)); @@ -116,8 +117,12 @@ nvme_ns_construct(struct spdk_nvme_ns *ns, uint16_t id, nsdata = _nvme_ns_get_data(ns); status.done = false; - nvme_ctrlr_cmd_identify_namespace(ctrlr, id, nsdata, - nvme_completion_poll_cb, &status); + rc = nvme_ctrlr_cmd_identify_namespace(ctrlr, id, nsdata, + nvme_completion_poll_cb, &status); + if (rc != 0) { + return rc; + } + while (status.done == false) { nvme_qpair_process_completions(&ctrlr->adminq, 0); } diff --git a/test/lib/nvme/unit/nvme_ctrlr_c/nvme_ctrlr_ut.c b/test/lib/nvme/unit/nvme_ctrlr_c/nvme_ctrlr_ut.c index 56c86e95ad..c8d6759b22 100644 --- a/test/lib/nvme/unit/nvme_ctrlr_c/nvme_ctrlr_ut.c +++ b/test/lib/nvme/unit/nvme_ctrlr_c/nvme_ctrlr_ut.c @@ -132,37 +132,42 @@ nvme_completion_poll_cb(void *arg, const struct spdk_nvme_cpl *cpl) { } -void +int nvme_ctrlr_cmd_set_async_event_config(struct spdk_nvme_ctrlr *ctrlr, union spdk_nvme_critical_warning_state state, spdk_nvme_cmd_cb cb_fn, void *cb_arg) { + return 0; } -void +int nvme_ctrlr_cmd_identify_controller(struct spdk_nvme_ctrlr *ctrlr, void *payload, spdk_nvme_cmd_cb cb_fn, void *cb_arg) { + return 0; } -void +int nvme_ctrlr_cmd_set_num_queues(struct spdk_nvme_ctrlr *ctrlr, uint32_t num_queues, spdk_nvme_cmd_cb cb_fn, void *cb_arg) { + return 0; } -void +int nvme_ctrlr_cmd_create_io_cq(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *io_que, spdk_nvme_cmd_cb cb_fn, void *cb_arg) { + return 0; } -void +int nvme_ctrlr_cmd_create_io_sq(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *io_que, spdk_nvme_cmd_cb cb_fn, void *cb_arg) { + return 0; } void