diff --git a/include/spdk/nvmf_transport.h b/include/spdk/nvmf_transport.h index fc63f7575..90d8d183f 100644 --- a/include/spdk/nvmf_transport.h +++ b/include/spdk/nvmf_transport.h @@ -160,6 +160,8 @@ struct spdk_nvmf_poll_group { spdk_nvmf_poll_group_destroy_done_fn destroy_cb_fn; void *destroy_cb_arg; + + TAILQ_ENTRY(spdk_nvmf_poll_group) link; }; struct spdk_nvmf_listener { diff --git a/lib/nvmf/nvmf.c b/lib/nvmf/nvmf.c index 01ba5eac9..e2f6afcfb 100644 --- a/lib/nvmf/nvmf.c +++ b/lib/nvmf/nvmf.c @@ -142,6 +142,10 @@ nvmf_tgt_create_poll_group(void *io_device, void *ctx_buf) } } + pthread_mutex_lock(&tgt->mutex); + TAILQ_INSERT_TAIL(&tgt->poll_groups, group, link); + pthread_mutex_unlock(&tgt->mutex); + group->poller = SPDK_POLLER_REGISTER(nvmf_poll_group_poll, group, 0); group->thread = spdk_get_thread(); @@ -151,11 +155,16 @@ nvmf_tgt_create_poll_group(void *io_device, void *ctx_buf) static void nvmf_tgt_destroy_poll_group(void *io_device, void *ctx_buf) { + struct spdk_nvmf_tgt *tgt = io_device; struct spdk_nvmf_poll_group *group = ctx_buf; struct spdk_nvmf_transport_poll_group *tgroup, *tmp; struct spdk_nvmf_subsystem_poll_group *sgroup; uint32_t sid, nsid; + pthread_mutex_lock(&tgt->mutex); + TAILQ_REMOVE(&tgt->poll_groups, group, link); + pthread_mutex_unlock(&tgt->mutex); + TAILQ_FOREACH_SAFE(tgroup, &group->tgroups, link, tmp) { TAILQ_REMOVE(&group->tgroups, tgroup, link); nvmf_transport_poll_group_destroy(tgroup); @@ -254,6 +263,7 @@ spdk_nvmf_tgt_create(struct spdk_nvmf_target_opts *opts) tgt->discovery_genctr = 0; TAILQ_INIT(&tgt->transports); + TAILQ_INIT(&tgt->poll_groups); tgt->subsystems = calloc(tgt->max_subsystems, sizeof(struct spdk_nvmf_subsystem *)); if (!tgt->subsystems) { @@ -261,6 +271,8 @@ spdk_nvmf_tgt_create(struct spdk_nvmf_target_opts *opts) return NULL; } + pthread_mutex_init(&tgt->mutex, NULL); + TAILQ_INSERT_HEAD(&g_nvmf_tgts, tgt, link); spdk_io_device_register(tgt, diff --git a/lib/nvmf/nvmf_internal.h b/lib/nvmf/nvmf_internal.h index 0a775e17e..cf2495372 100644 --- a/lib/nvmf/nvmf_internal.h +++ b/lib/nvmf/nvmf_internal.h @@ -62,6 +62,8 @@ enum spdk_nvmf_subsystem_state { struct spdk_nvmf_tgt { char name[NVMF_TGT_NAME_MAX_LENGTH]; + pthread_mutex_t mutex; + uint64_t discovery_genctr; uint32_t max_subsystems; @@ -70,6 +72,7 @@ struct spdk_nvmf_tgt { struct spdk_nvmf_subsystem **subsystems; TAILQ_HEAD(, spdk_nvmf_transport) transports; + TAILQ_HEAD(, spdk_nvmf_poll_group) poll_groups; spdk_nvmf_tgt_destroy_done_fn *destroy_cb_fn; void *destroy_cb_arg;