Commit 2bfb991e authored by Daniel Verkamp's avatar Daniel Verkamp
Browse files

nvmf: share Get/Set Features - Number of Queues



The code in virtual.c and direct.c was identical - move it to session.c
to share it.

Change-Id: Ic6e4e9238e8ffacb212e76293c440109aa839f8c
Signed-off-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent 48631ef2
Loading
Loading
Loading
Loading
+2 −20
Original line number Diff line number Diff line
@@ -110,15 +110,12 @@ nvmf_direct_ctrlr_process_admin_cmd(struct spdk_nvmf_request *req)
	struct spdk_nvme_cmd *cmd = &req->cmd->nvme_cmd;
	struct spdk_nvme_cpl *response = &req->rsp->nvme_cpl;
	struct spdk_nvmf_subsystem *subsystem = session->subsys;
	uint32_t nr_io_queues = 0;
	union spdk_nvme_vs_register vs;
	int rc = 0;
	uint8_t feature;

	/* pre-set response details for this command */
	response->status.sc = SPDK_NVME_SC_SUCCESS;
	/* Extra 1 connection for Admin queue */
	nr_io_queues = session->max_connections_allowed - 1;

	switch (cmd->opc) {
	case SPDK_NVME_OPC_IDENTIFY:
@@ -152,11 +149,7 @@ nvmf_direct_ctrlr_process_admin_cmd(struct spdk_nvmf_request *req)
		feature = cmd->cdw10 & 0xff; /* mask out the FID value */
		switch (feature) {
		case SPDK_NVME_FEAT_NUMBER_OF_QUEUES:
			SPDK_TRACELOG(SPDK_TRACE_NVMF, "Get Features - Number of Queues\n");
			/* Number of IO queues has a zero based value */
			response->cdw0 = ((nr_io_queues - 1) << 16) |
					 (nr_io_queues - 1);
			return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
			return spdk_nvmf_session_get_features_number_of_queues(req);
		case SPDK_NVME_FEAT_HOST_IDENTIFIER:
			return spdk_nvmf_session_get_features_host_identifier(req);
		case SPDK_NVME_FEAT_KEEP_ALIVE_TIMER:
@@ -169,18 +162,7 @@ nvmf_direct_ctrlr_process_admin_cmd(struct spdk_nvmf_request *req)
		feature = cmd->cdw10 & 0xff; /* mask out the FID value */
		switch (feature) {
		case SPDK_NVME_FEAT_NUMBER_OF_QUEUES:
			SPDK_TRACELOG(SPDK_TRACE_NVMF, "Set Features - Number of Queues, cdw11 0x%x\n", cmd->cdw11);

			/* verify that the contoller is ready to process commands */
			if (session->num_connections > 1) {
				SPDK_TRACELOG(SPDK_TRACE_NVMF, "Queue pairs already active!\n");
				response->status.sc = SPDK_NVME_SC_COMMAND_SEQUENCE_ERROR;
			} else {
				/* Number of IO queues has a zero based value */
				response->cdw0 = ((nr_io_queues - 1) << 16) |
						 (nr_io_queues - 1);
			}
			return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
			return spdk_nvmf_session_set_features_number_of_queues(req);
		case SPDK_NVME_FEAT_HOST_IDENTIFIER:
			return spdk_nvmf_session_set_features_host_identifier(req);
		case SPDK_NVME_FEAT_KEEP_ALIVE_TIMER:
+44 −0
Original line number Diff line number Diff line
@@ -652,3 +652,47 @@ spdk_nvmf_session_get_features_keep_alive_timer(struct spdk_nvmf_request *req)
	rsp->cdw0 = session->kato;
	return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
}

int
spdk_nvmf_session_set_features_number_of_queues(struct spdk_nvmf_request *req)
{
	struct spdk_nvmf_session *session = req->conn->sess;
	struct spdk_nvme_cpl *rsp = &req->rsp->nvme_cpl;
	uint32_t nr_io_queues;

	SPDK_TRACELOG(SPDK_TRACE_NVMF, "Set Features - Number of Queues, cdw11 0x%x\n",
		      req->cmd->nvme_cmd.cdw11);

	/* Extra 1 connection for Admin queue */
	nr_io_queues = session->max_connections_allowed - 1;

	/* verify that the contoller is ready to process commands */
	if (session->num_connections > 1) {
		SPDK_TRACELOG(SPDK_TRACE_NVMF, "Queue pairs already active!\n");
		rsp->status.sc = SPDK_NVME_SC_COMMAND_SEQUENCE_ERROR;
	} else {
		/* Number of IO queues has a zero based value */
		rsp->cdw0 = ((nr_io_queues - 1) << 16) |
			    (nr_io_queues - 1);
	}

	return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
}

int
spdk_nvmf_session_get_features_number_of_queues(struct spdk_nvmf_request *req)
{
	struct spdk_nvmf_session *session = req->conn->sess;
	struct spdk_nvme_cpl *rsp = &req->rsp->nvme_cpl;
	uint32_t nr_io_queues;

	SPDK_TRACELOG(SPDK_TRACE_NVMF, "Get Features - Number of Queues\n");

	nr_io_queues = session->max_connections_allowed - 1;

	/* Number of IO queues has a zero based value */
	rsp->cdw0 = ((nr_io_queues - 1) << 16) |
		    (nr_io_queues - 1);

	return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
}
+3 −0
Original line number Diff line number Diff line
@@ -122,4 +122,7 @@ int spdk_nvmf_session_get_features_host_identifier(struct spdk_nvmf_request *req
int spdk_nvmf_session_set_features_keep_alive_timer(struct spdk_nvmf_request *req);
int spdk_nvmf_session_get_features_keep_alive_timer(struct spdk_nvmf_request *req);

int spdk_nvmf_session_set_features_number_of_queues(struct spdk_nvmf_request *req);
int spdk_nvmf_session_get_features_number_of_queues(struct spdk_nvmf_request *req);

#endif
+2 −20
Original line number Diff line number Diff line
@@ -271,7 +271,6 @@ static int
nvmf_virtual_ctrlr_get_features(struct spdk_nvmf_request *req)
{
	uint8_t feature;
	uint32_t nr_io_queues;
	struct spdk_nvmf_session *session = req->conn->sess;
	struct spdk_nvme_cmd *cmd = &req->cmd->nvme_cmd;
	struct spdk_nvme_cpl *response = &req->rsp->nvme_cpl;
@@ -279,12 +278,7 @@ nvmf_virtual_ctrlr_get_features(struct spdk_nvmf_request *req)
	feature = cmd->cdw10 & 0xff; /* mask out the FID value */
	switch (feature) {
	case SPDK_NVME_FEAT_NUMBER_OF_QUEUES:
		SPDK_TRACELOG(SPDK_TRACE_NVMF, "Get Features - Number of Queues\n");
		nr_io_queues = session->max_connections_allowed - 1;
		/* Number of IO queues has a zero based value */
		response->cdw0 = ((nr_io_queues - 1) << 16) |
				 (nr_io_queues - 1);
		return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
		return spdk_nvmf_session_get_features_number_of_queues(req);
	case SPDK_NVME_FEAT_VOLATILE_WRITE_CACHE:
		response->cdw0 = 1;
		return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
@@ -307,7 +301,6 @@ static int
nvmf_virtual_ctrlr_set_features(struct spdk_nvmf_request *req)
{
	uint8_t feature;
	uint32_t nr_io_queues = 0;
	struct spdk_nvmf_session *session = req->conn->sess;
	struct spdk_nvme_cmd *cmd = &req->cmd->nvme_cmd;
	struct spdk_nvme_cpl *response = &req->rsp->nvme_cpl;
@@ -315,18 +308,7 @@ nvmf_virtual_ctrlr_set_features(struct spdk_nvmf_request *req)
	feature = cmd->cdw10 & 0xff; /* mask out the FID value */
	switch (feature) {
	case SPDK_NVME_FEAT_NUMBER_OF_QUEUES:
		SPDK_TRACELOG(SPDK_TRACE_NVMF, "Set Features - Number of Queues, cdw11 0x%x\n", cmd->cdw11);
		nr_io_queues = session->max_connections_allowed - 1;
		/* verify that the contoller is ready to process commands */
		if (session->num_connections > 1) {
			SPDK_TRACELOG(SPDK_TRACE_NVMF, "Queue pairs already active!\n");
			response->status.sc = SPDK_NVME_SC_COMMAND_SEQUENCE_ERROR;
		} else {
			/* Number of IO queues has a zero based value */
			response->cdw0 = ((nr_io_queues - 1) << 16) |
					 (nr_io_queues - 1);
		}
		return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
		return spdk_nvmf_session_set_features_number_of_queues(req);
	case SPDK_NVME_FEAT_KEEP_ALIVE_TIMER:
		return spdk_nvmf_session_set_features_keep_alive_timer(req);
	case SPDK_NVME_FEAT_ASYNC_EVENT_CONFIGURATION: