From dc26c9c21b8a6a9768219b558e08f6a780014ff0 Mon Sep 17 00:00:00 2001 From: Michael Baum Date: Sun, 12 Sep 2021 13:36:27 +0300 Subject: [PATCH] common/mlx5: fix device list operations concurrency The mlx5 common driver has a global list of mlx5 devices which are probed. In probe function it creates one and insert it to the list. Similarly it removes the device in remove function. These operations are not safe as there can be such operations in parallel, by different threads. Add global lock for the list and use it to insert or remove. Fixes: 8a41f4deccc3 ("common/mlx5: introduce layer for multiple class drivers") Cc: stable@dpdk.org Signed-off-by: Michael Baum Acked-by: Matan Azrad --- drivers/common/mlx5/mlx5_common.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/common/mlx5/mlx5_common.c b/drivers/common/mlx5/mlx5_common.c index f6e440dca1..4321cb3a9c 100644 --- a/drivers/common/mlx5/mlx5_common.c +++ b/drivers/common/mlx5/mlx5_common.c @@ -50,6 +50,7 @@ static TAILQ_HEAD(mlx5_drivers, mlx5_class_driver) drivers_list = /* Head of devices. */ static TAILQ_HEAD(mlx5_devices, mlx5_common_device) devices_list = TAILQ_HEAD_INITIALIZER(devices_list); +static pthread_mutex_t devices_list_lock; static const struct { const char *name; @@ -222,7 +223,9 @@ mlx5_dev_to_pci_str(const struct rte_device *dev, char *addr, size_t size) static void dev_release(struct mlx5_common_device *dev) { + pthread_mutex_lock(&devices_list_lock); TAILQ_REMOVE(&devices_list, dev, next); + pthread_mutex_unlock(&devices_list_lock); rte_free(dev); } @@ -315,7 +318,9 @@ mlx5_common_dev_probe(struct rte_device *eal_dev) if (!dev) return -ENOMEM; dev->dev = eal_dev; + pthread_mutex_lock(&devices_list_lock); TAILQ_INSERT_HEAD(&devices_list, dev, next); + pthread_mutex_unlock(&devices_list_lock); new_device = true; } /* @@ -440,6 +445,7 @@ mlx5_common_init(void) if (mlx5_common_initialized) return; + pthread_mutex_init(&devices_list_lock, NULL); mlx5_glue_constructor(); mlx5_common_driver_init(); mlx5_common_initialized = true; -- 2.20.1