lib/nvmf: add lock around few transport ops

this is a prework for further changes - with lock on generic layer
lock on specific transport (e.g. tcp, rdma) layer becomes optional

possibly it won't be required if some contract introduced on public
interfaces (to be considered)
- spdk_nvmf_poll_group_[create|destroy]
- spdk_nvmf_tgt_listen_ext, spdk_nvmf_tgt_stop_listen
- spdk_nvmf_get_optimal_poll_group

Signed-off-by: Jacek Kalwas <jacek.kalwas@intel.com>
Change-Id: Ib132babf9e7022342129fe795991cdad834e7f53
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13665
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: Shuhei Matsumoto <smatsumoto@nvidia.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Jacek Kalwas 2022-07-13 09:24:22 -04:00 committed by Ben Walker
parent f4402d5abc
commit b17919d8bc
2 changed files with 25 additions and 3 deletions

View File

@ -199,6 +199,8 @@ struct spdk_nvmf_transport {
TAILQ_HEAD(, spdk_nvmf_listener) listeners;
TAILQ_ENTRY(spdk_nvmf_transport) link;
pthread_mutex_t mutex;
};
typedef void (*spdk_nvmf_transport_qpair_fini_cb)(void *cb_arg);

View File

@ -211,6 +211,7 @@ spdk_nvmf_transport_create(const char *transport_name, struct spdk_nvmf_transpor
return NULL;
}
pthread_mutex_init(&transport->mutex, NULL);
TAILQ_INIT(&transport->listeners);
transport->ops = ops;
@ -275,6 +276,7 @@ spdk_nvmf_transport_destroy(struct spdk_nvmf_transport *transport,
free(listener);
}
pthread_mutex_destroy(&transport->mutex);
return transport->ops->destroy(transport, cb_fn, cb_arg);
}
@ -310,7 +312,9 @@ spdk_nvmf_transport_listen(struct spdk_nvmf_transport *transport,
listener->ref = 1;
listener->trid = *trid;
TAILQ_INSERT_TAIL(&transport->listeners, listener, link);
pthread_mutex_lock(&transport->mutex);
rc = transport->ops->listen(transport, &listener->trid, opts);
pthread_mutex_unlock(&transport->mutex);
if (rc != 0) {
TAILQ_REMOVE(&transport->listeners, listener, link);
free(listener);
@ -336,7 +340,9 @@ spdk_nvmf_transport_stop_listen(struct spdk_nvmf_transport *transport,
if (--listener->ref == 0) {
TAILQ_REMOVE(&transport->listeners, listener, link);
pthread_mutex_lock(&transport->mutex);
transport->ops->stop_listen(transport, trid);
pthread_mutex_unlock(&transport->mutex);
free(listener);
}
@ -444,7 +450,9 @@ nvmf_transport_poll_group_create(struct spdk_nvmf_transport *transport,
struct spdk_nvmf_transport_pg_cache_buf **bufs;
uint32_t i;
pthread_mutex_lock(&transport->mutex);
tgroup = transport->ops->poll_group_create(transport, group);
pthread_mutex_unlock(&transport->mutex);
if (!tgroup) {
return NULL;
}
@ -491,8 +499,14 @@ struct spdk_nvmf_transport_poll_group *
nvmf_transport_get_optimal_poll_group(struct spdk_nvmf_transport *transport,
struct spdk_nvmf_qpair *qpair)
{
struct spdk_nvmf_transport_poll_group *tgroup;
if (transport->ops->get_optimal_poll_group) {
return transport->ops->get_optimal_poll_group(qpair);
pthread_mutex_lock(&transport->mutex);
tgroup = transport->ops->get_optimal_poll_group(qpair);
pthread_mutex_unlock(&transport->mutex);
return tgroup;
} else {
return NULL;
}
@ -502,6 +516,9 @@ void
nvmf_transport_poll_group_destroy(struct spdk_nvmf_transport_poll_group *group)
{
struct spdk_nvmf_transport_pg_cache_buf *buf, *tmp;
struct spdk_nvmf_transport *transport;
transport = group->transport;
if (!STAILQ_EMPTY(&group->pending_buf_queue)) {
SPDK_ERRLOG("Pending I/O list wasn't empty on poll group destruction\n");
@ -509,9 +526,12 @@ nvmf_transport_poll_group_destroy(struct spdk_nvmf_transport_poll_group *group)
STAILQ_FOREACH_SAFE(buf, &group->buf_cache, link, tmp) {
STAILQ_REMOVE(&group->buf_cache, buf, spdk_nvmf_transport_pg_cache_buf, link);
spdk_mempool_put(group->transport->data_buf_pool, buf);
spdk_mempool_put(transport->data_buf_pool, buf);
}
group->transport->ops->poll_group_destroy(group);
pthread_mutex_lock(&transport->mutex);
transport->ops->poll_group_destroy(group);
pthread_mutex_unlock(&transport->mutex);
}
int