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:
parent
52a4a388fb
commit
d7b8da3b81
@ -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,
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user