From 69dc63da50cb2b6ef00ebc3ca95c1e261f6f8e7e Mon Sep 17 00:00:00 2001 From: Changpeng Liu Date: Wed, 12 Jan 2022 21:12:07 +0800 Subject: [PATCH] nvmf/vfio-user: use transport lock to iterate endpoints We should hold the transport lock to iterate endpoints. Fix issue #2313. Change-Id: I8e0539a51e843a3299908d9da7749fe9becb5e7e Signed-off-by: Changpeng Liu Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11037 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Ben Walker Reviewed-by: Dong Yi Reviewed-by: John Levon --- lib/nvmf/vfio_user.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/nvmf/vfio_user.c b/lib/nvmf/vfio_user.c index a86541647..649ae5523 100644 --- a/lib/nvmf/vfio_user.c +++ b/lib/nvmf/vfio_user.c @@ -2202,7 +2202,10 @@ nvmf_vfio_user_listen(struct spdk_nvmf_transport *transport, goto out; } + pthread_mutex_lock(&vu_transport->lock); TAILQ_INSERT_TAIL(&vu_transport->endpoints, endpoint, link); + pthread_mutex_unlock(&vu_transport->lock); + SPDK_DEBUGLOG(nvmf_vfio, "%s: doorbells %p\n", uuid, endpoint->doorbells); out: @@ -2275,11 +2278,13 @@ nvmf_vfio_user_listen_associate(struct spdk_nvmf_transport *transport, vu_transport = SPDK_CONTAINEROF(transport, struct nvmf_vfio_user_transport, transport); + pthread_mutex_lock(&vu_transport->lock); TAILQ_FOREACH(endpoint, &vu_transport->endpoints, link) { if (strncmp(endpoint->trid.traddr, trid->traddr, sizeof(endpoint->trid.traddr)) == 0) { break; } } + pthread_mutex_unlock(&vu_transport->lock); if (endpoint == NULL) { return -ENOENT;