From d7b8da3b8143db7a3b722d2742d1df62c91cd422 Mon Sep 17 00:00:00 2001 From: Ben Walker Date: Tue, 26 Jul 2016 16:34:12 -0700 Subject: [PATCH] nvmf: Add a transport specific session This is useful for holding session-wide buffer pools. Change-Id: I7024da24b210a2205bf1e159d5935e0093b81120 Signed-off-by: Ben Walker --- lib/nvmf/rdma.c | 40 ++++++++++++++++++++++++++++++++++++---- lib/nvmf/session.c | 6 ++++++ lib/nvmf/session.h | 6 ++++++ lib/nvmf/transport.h | 12 ++++++++++++ 4 files changed, 60 insertions(+), 4 deletions(-) diff --git a/lib/nvmf/rdma.c b/lib/nvmf/rdma.c index 5de30e80a..d2d6ba157 100644 --- a/lib/nvmf/rdma.c +++ b/lib/nvmf/rdma.c @@ -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, diff --git a/lib/nvmf/session.c b/lib/nvmf/session.c index 78ed9bfc0..32154a495 100644 --- a/lib/nvmf/session.c +++ b/lib/nvmf/session.c @@ -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); diff --git a/lib/nvmf/session.h b/lib/nvmf/session.h index 618223cfa..d3dab744f 100644 --- a/lib/nvmf/session.h +++ b/lib/nvmf/session.h @@ -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, diff --git a/lib/nvmf/transport.h b/lib/nvmf/transport.h index 27ab4c453..711858152 100644 --- a/lib/nvmf/transport.h +++ b/lib/nvmf/transport.h @@ -36,7 +36,9 @@ #include +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