From c48407e8af2d05ee48c9b1a06e1832721b4c27ae Mon Sep 17 00:00:00 2001 From: Jeff Guo Date: Thu, 15 Nov 2018 17:18:22 +0800 Subject: [PATCH] eal: fix deadlock in hot-unplug When device be hot-unplugged, the hot-unplug handler will be invoked by uio remove event and the device will be detached, then kernel will sent another pci remove event. So if there is any unlock miss, it will cause a dead lock issue. This patch will add this missing unlock for hot-unplug handler. Fixes: 0fc54536b14a ("eal: add failure handling for hot-unplug") Signed-off-by: Jeff Guo --- lib/librte_eal/linuxapp/eal/eal_dev.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/librte_eal/linuxapp/eal/eal_dev.c b/lib/librte_eal/linuxapp/eal/eal_dev.c index d589c692c1..2830c8687d 100644 --- a/lib/librte_eal/linuxapp/eal/eal_dev.c +++ b/lib/librte_eal/linuxapp/eal/eal_dev.c @@ -258,7 +258,7 @@ dev_uev_handler(__rte_unused void *param) if (bus == NULL) { RTE_LOG(ERR, EAL, "Cannot find bus (%s)\n", busname); - return; + goto failure_handle_err; } dev = bus->find_device(NULL, cmp_dev_name, @@ -266,19 +266,23 @@ dev_uev_handler(__rte_unused void *param) if (dev == NULL) { RTE_LOG(ERR, EAL, "Cannot find device (%s) on " "bus (%s)\n", uevent.devname, busname); - return; + goto failure_handle_err; } ret = bus->hot_unplug_handler(dev); - rte_spinlock_unlock(&failure_handle_lock); if (ret) { RTE_LOG(ERR, EAL, "Can not handle hot-unplug " "for device (%s)\n", dev->name); - return; } + rte_spinlock_unlock(&failure_handle_lock); } rte_dev_event_callback_process(uevent.devname, uevent.type); } + + return; + +failure_handle_err: + rte_spinlock_unlock(&failure_handle_lock); } int __rte_experimental -- 2.20.1