nvmf: Add a transport specific session

This is useful for holding session-wide buffer pools.

Change-Id: I7024da24b210a2205bf1e159d5935e0093b81120
Signed-off-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Ben Walker 2016-07-26 16:34:12 -07:00
parent 52a4a388fb
commit d7b8da3b81
4 changed files with 60 additions and 4 deletions

View File

@ -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,

View File

@ -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);

View File

@ -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,

View File

@ -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