From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jeff Guo Subject: [PATCH 2/3] vfio: fix to add handler lock for hot-unplug Date: Tue, 6 Nov 2018 14:07:14 +0800 Message-ID: <1541484436-91320-3-git-send-email-jia.guo@intel.com> References: <1541484436-91320-1-git-send-email-jia.guo@intel.com> Cc: ferruh.yigit@intel.com, dev@dpdk.org, jia.guo@intel.com, helin.zhang@intel.com, matan@mellanox.com, shaopeng.he@intel.com To: konstantin.ananyev@intel.com, anatoly.burakov@intel.com, thomas@monjalon.net, bernard.iremonger@intel.com, jingjing.wu@intel.com, wenzhuo.lu@intel.com Return-path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by dpdk.org (Postfix) with ESMTP id 1C74D31FC for ; Tue, 6 Nov 2018 07:03:43 +0100 (CET) In-Reply-To: <1541484436-91320-1-git-send-email-jia.guo@intel.com> List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" This patch add hot-unplug handler lock and unlock in device request handler when process bus and device resource, in order to avoid the synchronization issue when device be hot-unplugged. Fixes: c115fd000c32 ("vfio: handle hotplug request notifier") Signed-off-by: Jeff Guo --- drivers/bus/pci/linux/pci_vfio.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/bus/pci/linux/pci_vfio.c b/drivers/bus/pci/linux/pci_vfio.c index 305cc06..d2c8410 100644 --- a/drivers/bus/pci/linux/pci_vfio.c +++ b/drivers/bus/pci/linux/pci_vfio.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "eal_filesystem.h" @@ -35,6 +36,14 @@ * This file is only compiled if CONFIG_RTE_EAL_VFIO is set to "y". */ +/* + * spinlock for device hot-unplug failure handling. If it try to access bus or + * device, such as handle sigbus on bus or handle memory failure for device + * just need to use this lock. It could protect the bus and the device to avoid + * race condition. + */ +static rte_spinlock_t failure_handle_lock = RTE_SPINLOCK_INITIALIZER; + #ifdef VFIO_PRESENT #ifndef PAGE_SIZE @@ -289,11 +298,12 @@ pci_vfio_req_handler(void *param) int ret; struct rte_device *device = (struct rte_device *)param; + rte_spinlock_lock(&failure_handle_lock); bus = rte_bus_find_by_device(device); if (bus == NULL) { RTE_LOG(ERR, EAL, "Cannot find bus for device (%s)\n", device->name); - return; + goto handle_end; } /* @@ -306,6 +316,8 @@ pci_vfio_req_handler(void *param) RTE_LOG(ERR, EAL, "Can not handle hot-unplug for device (%s)\n", device->name); +handle_end: + rte_spinlock_unlock(&failure_handle_lock); } /* enable notifier (only enable req now) */ -- 2.7.4