Commit 89bf6d5c authored by Daniel Verkamp's avatar Daniel Verkamp
Browse files

nvme: add error checking for internal ctrlr_cmds



Many of the internal controller initialization functions did not check
for allocation failure; add return codes and check them where
applicable.

Change-Id: Id1b33bb06fca84035369d8b7ecd4c36b8ba7134c
Signed-off-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent 5ee7a5df
Loading
Loading
Loading
Loading
+32 −9
Original line number Diff line number Diff line
@@ -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,
	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,
	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,
		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,
		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);
+32 −11
Original line number Diff line number Diff line
@@ -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,
	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,7 +261,8 @@ 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,
	return spdk_nvme_ctrlr_cmd_set_feature(ctrlr, SPDK_NVME_FEAT_ASYNC_EVENT_CONFIGURATION, cdw11, 0,
					       NULL, 0,
					       cb_fn, cb_arg);
}

@@ -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;
}
+7 −7
Original line number Diff line number Diff line
@@ -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);
+7 −2
Original line number Diff line number Diff line
@@ -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,
	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);
	}
+10 −5
Original line number Diff line number Diff line
@@ -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