Commit 8c094266 authored by Cunyin Chang's avatar Cunyin Chang Committed by Daniel Verkamp
Browse files

nvmf: Adjust the data structure of spdk_nvmf_subsystem.



Move the ctrlr and io_qpair out of spdk_nvmf_subsystem, package them
as a new data structure. Union the direct and virtual mode namespaces.

Change-Id: I839aee3372c6c57aa03a0be76f8aaeb5045ecdaf
Signed-off-by: default avatarCunyin Chang <cunyin.chang@intel.com>
parent 594c19bf
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ SPDK_LIBS = \
	$(SPDK_ROOT_DIR)/lib/conf/libspdk_conf.a \
	$(SPDK_ROOT_DIR)/lib/util/libspdk_util.a \
	$(SPDK_ROOT_DIR)/lib/memory/libspdk_memory.a \
	$(SPDK_ROOT_DIR)/lib/bdev/libspdk_bdev.a \

LIBS += $(SPDK_LIBS) $(PCIACCESS_LIB)

+3 −2
Original line number Diff line number Diff line
@@ -237,7 +237,7 @@ nvmf_process_admin_cmd(struct spdk_nvmf_request *req)
	default:
passthrough:
		SPDK_TRACELOG(SPDK_TRACE_NVMF, "admin_cmd passthrough: opc 0x%02x\n", cmd->opc);
		rc = spdk_nvme_ctrlr_cmd_admin_raw(subsystem->ctrlr,
		rc = spdk_nvme_ctrlr_cmd_admin_raw(subsystem->ctrlr.direct.ctrlr,
						   cmd,
						   req->data, req->length,
						   nvmf_complete_cmd,
@@ -249,6 +249,7 @@ passthrough:
		}
		return false;
	}

}

static bool
@@ -257,7 +258,7 @@ nvmf_process_io_cmd(struct spdk_nvmf_request *req)
	struct spdk_nvmf_subsystem *subsystem = req->conn->sess->subsys;
	int rc;

	rc = spdk_nvme_ctrlr_cmd_io_raw(subsystem->ctrlr, subsystem->io_qpair,
	rc = spdk_nvme_ctrlr_cmd_io_raw(subsystem->ctrlr.direct.ctrlr, subsystem->ctrlr.direct.io_qpair,
					&req->cmd->nvme_cmd,
					req->data, req->length,
					nvmf_complete_cmd,
+1 −1
Original line number Diff line number Diff line
@@ -90,7 +90,7 @@ nvmf_init_nvme_session_properties(struct nvmf_session *session)
	*/

	/* Init the virtual controller details using actual HW details */
	cdata = spdk_nvme_ctrlr_get_data(session->subsys->ctrlr);
	cdata = spdk_nvme_ctrlr_get_data(session->subsys->ctrlr.direct.ctrlr);
	memcpy(&session->vcdata, cdata, sizeof(struct spdk_nvme_ctrlr_data));

	session->vcdata.aerl = 0;
+7 −8
Original line number Diff line number Diff line
@@ -85,8 +85,8 @@ spdk_nvmf_subsystem_poller(void *arg)

	/* For NVMe subsystems, check the backing physical device for completions. */
	if (subsystem->subtype == SPDK_NVMF_SUBTYPE_NVME) {
		spdk_nvme_ctrlr_process_admin_completions(subsystem->ctrlr);
		spdk_nvme_qpair_process_completions(subsystem->io_qpair, 0);
		spdk_nvme_ctrlr_process_admin_completions(subsystem->ctrlr.direct.ctrlr);
		spdk_nvme_qpair_process_completions(subsystem->ctrlr.direct.io_qpair, 0);
	}

	/* For each connection in the session, check for RDMA completions */
@@ -153,8 +153,8 @@ nvmf_delete_subsystem(struct spdk_nvmf_subsystem *subsystem)
		spdk_nvmf_session_destruct(subsystem->session);
	}

	if (subsystem->ctrlr) {
		spdk_nvme_detach(subsystem->ctrlr);
	if (subsystem->ctrlr.direct.ctrlr) {
		spdk_nvme_detach(subsystem->ctrlr.direct.ctrlr);
	}

	TAILQ_REMOVE(&g_subsystems, subsystem, entries);
@@ -199,11 +199,10 @@ int
nvmf_subsystem_add_ctrlr(struct spdk_nvmf_subsystem *subsystem,
			 struct spdk_nvme_ctrlr *ctrlr)
{
	subsystem->ctrlr = ctrlr;

	subsystem->ctrlr.direct.ctrlr = ctrlr;
	/* Assume that all I/O will be handled on one thread for now */
	subsystem->io_qpair = spdk_nvme_ctrlr_alloc_io_qpair(ctrlr, 0);
	if (subsystem->io_qpair == NULL) {
	subsystem->ctrlr.direct.io_qpair = spdk_nvme_ctrlr_alloc_io_qpair(ctrlr, 0);
	if (subsystem->ctrlr.direct.io_qpair == NULL) {
		SPDK_ERRLOG("spdk_nvme_ctrlr_alloc_io_qpair() failed\n");
		return -1;
	}
+25 −2
Original line number Diff line number Diff line
@@ -39,10 +39,13 @@
#include "spdk/event.h"
#include "spdk/nvme.h"
#include "spdk/queue.h"
#include "spdk/bdev.h"

struct spdk_nvmf_conn;
struct spdk_nvmf_subsystem;

#define MAX_NQN_SIZE 255
#define MAX_VIRTUAL_NAMESPACE 16

enum spdk_nvmf_subsystem_mode {
	NVMF_SUBSYSTEM_MODE_DIRECT	= 0,
@@ -61,6 +64,27 @@ struct spdk_nvmf_host {
	TAILQ_ENTRY(spdk_nvmf_host)	link;
};

struct spdk_nvmf_ns {
	uint32_t nsid;
	struct spdk_bdev *bdev;
};


union spdk_nvmf_controller {
	struct {
		struct nvmf_session *session;
		struct spdk_nvme_ctrlr *ctrlr;
		struct spdk_nvme_qpair *io_qpair;
	} direct;

	struct {
		struct nvmf_session *session;
		struct spdk_nvmf_ns *ns_list[MAX_VIRTUAL_NAMESPACE];
		uint16_t ns_count;
	} virtual;
};


/*
 * The NVMf subsystem, as indicated in the specification, is a collection
 * of virtual controller sessions.  Any individual controller session has
@@ -72,8 +96,7 @@ struct spdk_nvmf_subsystem {
	enum spdk_nvmf_subsystem_mode mode;
	enum spdk_nvmf_subtype subtype;
	struct nvmf_session *session;
	struct spdk_nvme_ctrlr *ctrlr;
	struct spdk_nvme_qpair *io_qpair;
	union spdk_nvmf_controller 	ctrlr;

	struct spdk_poller	poller;