Commit d7b8da3b authored by Ben Walker's avatar Ben Walker
Browse files

nvmf: Add a transport specific session



This is useful for holding session-wide buffer pools.

Change-Id: I7024da24b210a2205bf1e159d5935e0093b81120
Signed-off-by: default avatarBen Walker <benjamin.walker@intel.com>
parent 52a4a388
Loading
Loading
Loading
Loading
+36 −4
Original line number Diff line number Diff line
@@ -119,6 +119,10 @@ struct spdk_nvmf_rdma_conn {
/* List of RDMA connections that have not yet received a CONNECT capsule */
static TAILQ_HEAD(, spdk_nvmf_rdma_conn) g_pending_conns = TAILQ_HEAD_INITIALIZER(g_pending_conns);

struct spdk_nvmf_rdma_session {
	int reserved;
};

struct spdk_nvmf_rdma {
	struct rte_timer		acceptor_timer;
	struct rdma_event_channel	*acceptor_event_channel;
@@ -932,6 +936,35 @@ spdk_nvmf_rdma_acceptor_stop(void)
	rte_timer_stop_sync(&g_rdma.acceptor_timer);
}

static int
spdk_nvmf_rdma_session_init(struct nvmf_session *session, struct spdk_nvmf_conn *conn)
{
	struct spdk_nvmf_rdma_session	*rdma_sess;

	rdma_sess = calloc(1, sizeof(*rdma_sess));
	if (!rdma_sess) {
		return -1;
	}

	session->transport = conn->transport;
	session->trctx = rdma_sess;

	return 0;
}

static void
spdk_nvmf_rdma_session_fini(struct nvmf_session *session)
{
	struct spdk_nvmf_rdma_session *rdma_sess = session->trctx;

	if (!rdma_sess) {
		return;
	}

	free(rdma_sess);
	session->trctx = NULL;
}

/*

Initialize with RDMA transport.  Query OFED for device list.
@@ -1081,10 +1114,6 @@ spdk_nvmf_rdma_poll(struct spdk_nvmf_conn *conn)
			break;

		case IBV_WC_RDMA_WRITE:
			/*
			 * Will get this event only if we set IBV_SEND_SIGNALED
			 * flag in rdma_write, to trace rdma write latency
			 */
			SPDK_TRACELOG(SPDK_TRACE_RDMA, "RDMA WRITE Complete. Request: %p Connection: %p\n",
				      req, conn);
			spdk_trace_record(TRACE_RDMA_WRITE_COMPLETE, 0, 0, (uint64_t)req, 0);
@@ -1169,6 +1198,9 @@ const struct spdk_nvmf_transport spdk_nvmf_transport_rdma = {
	.transport_start = spdk_nvmf_rdma_acceptor_start,
	.transport_stop = spdk_nvmf_rdma_acceptor_stop,

	.session_init = spdk_nvmf_rdma_session_init,
	.session_fini = spdk_nvmf_rdma_session_fini,

	.req_complete = spdk_nvmf_rdma_request_complete,
	.req_release = spdk_nvmf_rdma_request_release,

+6 −0
Original line number Diff line number Diff line
@@ -174,6 +174,8 @@ spdk_nvmf_session_destruct(struct nvmf_session *session)
		conn->transport->conn_fini(conn);
	}

	session->transport->session_fini(session);

	free(session);
}

@@ -252,6 +254,10 @@ spdk_nvmf_session_connect(struct spdk_nvmf_conn *conn,
		session->num_connections = 0;
		session->subsys = subsystem;
		session->max_connections_allowed = g_nvmf_tgt.max_queues_per_session;
		if (conn->transport->session_init(session, conn)) {
			rsp->status.sc = SPDK_NVME_SC_INTERNAL_DEVICE_ERROR;
			return;
		}

		if (subsystem->subtype == SPDK_NVMF_SUBTYPE_NVME) {
			nvmf_init_nvme_session_properties(session);
+6 −0
Original line number Diff line number Diff line
@@ -79,6 +79,12 @@ struct nvmf_session {
	TAILQ_HEAD(connection_q, spdk_nvmf_conn) connections;
	int num_connections;
	int max_connections_allowed;

	const struct spdk_nvmf_transport	*transport;

	/* This is filled in by calling the transport's
	 * session_init function. */
	void					*trctx;
};

void spdk_nvmf_session_connect(struct spdk_nvmf_conn *conn,
+12 −0
Original line number Diff line number Diff line
@@ -36,7 +36,9 @@

#include <stdint.h>

struct nvmf_session;
struct spdk_nvmf_conn;
struct spdk_nvmf_request;
struct spdk_nvmf_discovery_log_page_entry;
struct spdk_nvmf_listen_addr;
struct spdk_nvmf_request;
@@ -68,6 +70,16 @@ struct spdk_nvmf_transport {
	 */
	void (*transport_stop)(void);

	/**
	 * Initialize the transport for the given session
	 */
	int (*session_init)(struct nvmf_session *session, struct spdk_nvmf_conn *conn);

	/**
	 * Deinitiallize the transport for the given session
	 */
	void (*session_fini)(struct nvmf_session *session);

	/*
	 * Signal request completion, which sends a response
	 * to the originator. A request can either