nvmf: Add context parameter to new_qpair() callback

It can be useful for passing additional information about nvmf
target to a handler for new nvmf connections. Context can be
stored in globals as it is currently done in nvmf code. However
in case of multiple targets or languages where accessing global
state is challenging (i.e. Rust), this becomes inconvenient.

Change-Id: Ia6a2fdba4601531822b3e5fda7ac5ab89d46f6c5
Signed-off-by: Jan Kryl <jan.kryl@mayadata.io>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/469263
Community-CI: Broadcom SPDK FC-NVMe CI <spdk-ci.pdl@broadcom.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Seth Howell <seth.howell@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Sasha Kotchubievsky <sashakot@mellanox.com>
This commit is contained in:
Jan Kryl 2019-09-18 20:16:15 +00:00 committed by Tomasz Zawadzki
parent 6d2989fdec
commit 0a04c076ea
12 changed files with 34 additions and 25 deletions

View File

@ -55,6 +55,10 @@ Three new header functions have also been added to help deal with multiple targe
`spdk_nvmf_get_first_target` takes no arguments and returns the first target in the global list.
`spdk_nvmf_get_next_tgt` takes a target pointer as an argument and returns the next one in the global list.
The `spdk_nvmf_tgt_accept` takes additional argument allowing to pass arbitrary context
information to the `new_qpair` callback. This will simplify the code when having multiple
nvmf targets or when retrieving the context information from globals is not suitable.
### bdev
A new spdk_bdev_open_ext function has been added and spdk_bdev_open function has been deprecated.

View File

@ -218,8 +218,9 @@ void spdk_nvmf_tgt_listen(struct spdk_nvmf_tgt *tgt,
* Function to be called for each newly discovered qpair.
*
* \param qpair The newly discovered qpair.
* \param cb_arg A context argument passed to this function.
*/
typedef void (*new_qpair_fn)(struct spdk_nvmf_qpair *qpair);
typedef void (*new_qpair_fn)(struct spdk_nvmf_qpair *qpair, void *cb_arg);
/**
* Poll the target for incoming connections.
@ -230,8 +231,9 @@ typedef void (*new_qpair_fn)(struct spdk_nvmf_qpair *qpair);
*
* \param tgt The target associated with the listen address.
* \param cb_fn Called for each newly discovered qpair.
* \param cb_arg A context argument passed to cb_fn.
*/
void spdk_nvmf_tgt_accept(struct spdk_nvmf_tgt *tgt, new_qpair_fn cb_fn);
void spdk_nvmf_tgt_accept(struct spdk_nvmf_tgt *tgt, new_qpair_fn cb_fn, void *cb_arg);
/**
* Create a poll group.

View File

@ -1937,7 +1937,7 @@ nvmf_fc_stop_listen(struct spdk_nvmf_transport *transport,
}
static void
nvmf_fc_accept(struct spdk_nvmf_transport *transport, new_qpair_fn cb_fn)
nvmf_fc_accept(struct spdk_nvmf_transport *transport, new_qpair_fn cb_fn, void *cb_arg)
{
struct spdk_nvmf_fc_port *fc_port = NULL;
static bool start_lld = false;

View File

@ -595,7 +595,7 @@ nvmf_fc_ls_add_conn_to_poller(
/* Let the nvmf_tgt decide which pollgroup to use. */
fc_conn->create_opd = opd;
fc_port->new_qp_cb(&fc_conn->qpair);
fc_port->new_qp_cb(&fc_conn->qpair, fc_port->new_qp_arg);
}
/* Delete association functions */

View File

@ -677,12 +677,12 @@ spdk_nvmf_tgt_get_transport(struct spdk_nvmf_tgt *tgt, enum spdk_nvme_transport_
}
void
spdk_nvmf_tgt_accept(struct spdk_nvmf_tgt *tgt, new_qpair_fn cb_fn)
spdk_nvmf_tgt_accept(struct spdk_nvmf_tgt *tgt, new_qpair_fn cb_fn, void *cb_arg)
{
struct spdk_nvmf_transport *transport, *tmp;
TAILQ_FOREACH_SAFE(transport, &tgt->transports, link, tmp) {
spdk_nvmf_transport_accept(transport, cb_fn);
spdk_nvmf_transport_accept(transport, cb_fn, cb_arg);
}
}

View File

@ -311,6 +311,7 @@ struct spdk_nvmf_fc_port {
uint16_t fcp_rq_id;
struct spdk_nvmf_fc_hwqp ls_queue;
new_qpair_fn new_qp_cb;
void *new_qp_arg;
uint32_t num_io_queues;
struct spdk_nvmf_fc_hwqp *io_queues;

View File

@ -1244,7 +1244,7 @@ spdk_nvmf_rdma_event_reject(struct rdma_cm_id *id, enum spdk_nvmf_rdma_transport
static int
nvmf_rdma_connect(struct spdk_nvmf_transport *transport, struct rdma_cm_event *event,
new_qpair_fn cb_fn)
new_qpair_fn cb_fn, void *cb_arg)
{
struct spdk_nvmf_rdma_transport *rtransport;
struct spdk_nvmf_rdma_qpair *rqpair = NULL;
@ -1340,7 +1340,7 @@ nvmf_rdma_connect(struct spdk_nvmf_transport *transport, struct rdma_cm_event *e
event->id->context = &rqpair->qpair;
cb_fn(&rqpair->qpair);
cb_fn(&rqpair->qpair, cb_arg);
return 0;
}
@ -2926,7 +2926,7 @@ nvmf_rdma_handle_last_wqe_reached(void *ctx)
}
static void
spdk_nvmf_process_cm_event(struct spdk_nvmf_transport *transport, new_qpair_fn cb_fn)
spdk_nvmf_process_cm_event(struct spdk_nvmf_transport *transport, new_qpair_fn cb_fn, void *cb_arg)
{
struct spdk_nvmf_rdma_transport *rtransport;
struct rdma_cm_event *event;
@ -2953,7 +2953,7 @@ spdk_nvmf_process_cm_event(struct spdk_nvmf_transport *transport, new_qpair_fn c
/* No action required. The target never attempts to resolve routes. */
break;
case RDMA_CM_EVENT_CONNECT_REQUEST:
rc = nvmf_rdma_connect(transport, event, cb_fn);
rc = nvmf_rdma_connect(transport, event, cb_fn, cb_arg);
if (rc < 0) {
SPDK_ERRLOG("Unable to process connect event. rc: %d\n", rc);
break;
@ -3091,7 +3091,7 @@ spdk_nvmf_process_ib_event(struct spdk_nvmf_rdma_device *device)
}
static void
spdk_nvmf_rdma_accept(struct spdk_nvmf_transport *transport, new_qpair_fn cb_fn)
spdk_nvmf_rdma_accept(struct spdk_nvmf_transport *transport, new_qpair_fn cb_fn, void *cb_arg)
{
int nfds, i = 0;
struct spdk_nvmf_rdma_transport *rtransport;
@ -3106,7 +3106,7 @@ spdk_nvmf_rdma_accept(struct spdk_nvmf_transport *transport, new_qpair_fn cb_fn)
/* The first poll descriptor is RDMA CM event */
if (rtransport->poll_fds[i++].revents & POLLIN) {
spdk_nvmf_process_cm_event(transport, cb_fn);
spdk_nvmf_process_cm_event(transport, cb_fn, cb_arg);
nfds--;
}

View File

@ -1095,7 +1095,8 @@ spdk_nvmf_tcp_qpair_sock_init(struct spdk_nvmf_tcp_qpair *tqpair)
static void
_spdk_nvmf_tcp_handle_connect(struct spdk_nvmf_transport *transport,
struct spdk_nvmf_tcp_port *port,
struct spdk_sock *sock, new_qpair_fn cb_fn)
struct spdk_sock *sock,
new_qpair_fn cb_fn, void *cb_arg)
{
struct spdk_nvmf_tcp_qpair *tqpair;
int rc;
@ -1136,12 +1137,12 @@ _spdk_nvmf_tcp_handle_connect(struct spdk_nvmf_transport *transport,
return;
}
cb_fn(&tqpair->qpair);
cb_fn(&tqpair->qpair, cb_arg);
}
static void
spdk_nvmf_tcp_port_accept(struct spdk_nvmf_transport *transport, struct spdk_nvmf_tcp_port *port,
new_qpair_fn cb_fn)
new_qpair_fn cb_fn, void *cb_arg)
{
struct spdk_sock *sock;
int i;
@ -1149,13 +1150,13 @@ spdk_nvmf_tcp_port_accept(struct spdk_nvmf_transport *transport, struct spdk_nvm
for (i = 0; i < NVMF_TCP_MAX_ACCEPT_SOCK_ONE_TIME; i++) {
sock = spdk_sock_accept(port->listen_sock);
if (sock) {
_spdk_nvmf_tcp_handle_connect(transport, port, sock, cb_fn);
_spdk_nvmf_tcp_handle_connect(transport, port, sock, cb_fn, cb_arg);
}
}
}
static void
spdk_nvmf_tcp_accept(struct spdk_nvmf_transport *transport, new_qpair_fn cb_fn)
spdk_nvmf_tcp_accept(struct spdk_nvmf_transport *transport, new_qpair_fn cb_fn, void *cb_arg)
{
struct spdk_nvmf_tcp_transport *ttransport;
struct spdk_nvmf_tcp_port *port;
@ -1163,7 +1164,7 @@ spdk_nvmf_tcp_accept(struct spdk_nvmf_transport *transport, new_qpair_fn cb_fn)
ttransport = SPDK_CONTAINEROF(transport, struct spdk_nvmf_tcp_transport, transport);
TAILQ_FOREACH(port, &ttransport->ports, link) {
spdk_nvmf_tcp_port_accept(transport, port, cb_fn);
spdk_nvmf_tcp_port_accept(transport, port, cb_fn, cb_arg);
}
}

View File

@ -171,9 +171,9 @@ spdk_nvmf_transport_stop_listen(struct spdk_nvmf_transport *transport,
}
void
spdk_nvmf_transport_accept(struct spdk_nvmf_transport *transport, new_qpair_fn cb_fn)
spdk_nvmf_transport_accept(struct spdk_nvmf_transport *transport, new_qpair_fn cb_fn, void *cb_arg)
{
transport->ops->accept(transport, cb_fn);
transport->ops->accept(transport, cb_fn, cb_arg);
}
void

View File

@ -87,7 +87,7 @@ struct spdk_nvmf_transport_ops {
/**
* Check for new connections on the transport.
*/
void (*accept)(struct spdk_nvmf_transport *transport, new_qpair_fn cb_fn);
void (*accept)(struct spdk_nvmf_transport *transport, new_qpair_fn cb_fn, void *cb_arg);
/**
* Fill out a discovery log entry for a specific listen address.
@ -183,7 +183,8 @@ struct spdk_nvmf_transport_ops {
int spdk_nvmf_transport_stop_listen(struct spdk_nvmf_transport *transport,
const struct spdk_nvme_transport_id *trid);
void spdk_nvmf_transport_accept(struct spdk_nvmf_transport *transport, new_qpair_fn cb_fn);
void spdk_nvmf_transport_accept(struct spdk_nvmf_transport *transport, new_qpair_fn cb_fn,
void *cb_arg);
void spdk_nvmf_transport_listener_discover(struct spdk_nvmf_transport *transport,
struct spdk_nvme_transport_id *trid,

View File

@ -250,7 +250,7 @@ nvmf_tgt_poll_group_add(void *_ctx)
}
static void
new_qpair(struct spdk_nvmf_qpair *qpair)
new_qpair(struct spdk_nvmf_qpair *qpair, void *cb_arg)
{
struct nvmf_tgt_pg_ctx *ctx;
struct nvmf_tgt_poll_group *pg;
@ -294,7 +294,7 @@ acceptor_poll(void *arg)
{
struct spdk_nvmf_tgt *tgt = arg;
spdk_nvmf_tgt_accept(tgt, new_qpair);
spdk_nvmf_tgt_accept(tgt, new_qpair, NULL);
return -1;
}

View File

@ -143,7 +143,7 @@ spdk_nvmf_qpair_disconnect(struct spdk_nvmf_qpair *qpair, nvmf_qpair_disconnect_
}
static void
new_qpair(struct spdk_nvmf_qpair *qpair)
new_qpair(struct spdk_nvmf_qpair *qpair, void *cb_arg)
{
uint32_t i;
struct spdk_nvmf_fc_conn *fc_conn;