From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dariusz Stojaczyk Subject: [PATCH v2] bus/pci: update device devargs on each rescan Date: Tue, 6 Nov 2018 06:40:15 +0100 Message-ID: <20181106054015.28280-1-darek.stojaczyk@gmail.com> References: <20181105070447.67700-1-dariusz.stojaczyk@intel.com> Cc: Darek Stojaczyk , qi.z.zhang@intel.com To: dev@dpdk.org, gaetan.rivet@6wind.com Return-path: Received: from mail-lj1-f193.google.com (mail-lj1-f193.google.com [209.85.208.193]) by dpdk.org (Postfix) with ESMTP id 7D8062AA0 for ; Tue, 6 Nov 2018 06:41:14 +0100 (CET) Received: by mail-lj1-f193.google.com with SMTP id u6-v6so10305517ljd.1 for ; Mon, 05 Nov 2018 21:41:14 -0800 (PST) In-Reply-To: <20181105070447.67700-1-dariusz.stojaczyk@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" From: Darek Stojaczyk Bus rescan is done e.g. during the device hotplug, where devargs are re-allocated. By not updating the rte_device->devargs pointer we potentially make it a dangling one, as previous devargs could have been (or will be soon) freed. Fixes: 55e411b301c3 ("bus/pci: fix resource mapping override") Cc: qi.z.zhang@intel.com Signed-off-by: Darek Stojaczyk --- Changes since v1: * introduce additional pci_devargs_lookup() check to make the code slightly more readable (Gaetan Rivet) drivers/bus/pci/linux/pci.c | 5 +++++ drivers/bus/pci/pci_common.c | 3 ++- drivers/bus/pci/private.h | 11 +++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/drivers/bus/pci/linux/pci.c b/drivers/bus/pci/linux/pci.c index c99d523f0..a32d4848e 100644 --- a/drivers/bus/pci/linux/pci.c +++ b/drivers/bus/pci/linux/pci.c @@ -379,6 +379,11 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr *addr) RTE_LOG(ERR, EAL, "Unexpected device scan at %s!\n", filename); } + + if (pci_devargs_lookup(dev2) != + dev2->device.devargs) + pci_name_set(dev2); + free(dev); } return 0; diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c index 6276e5d69..fcaf76ed2 100644 --- a/drivers/bus/pci/pci_common.c +++ b/drivers/bus/pci/pci_common.c @@ -42,7 +42,8 @@ const char *rte_pci_get_sysfs_path(void) return path; } -static struct rte_devargs *pci_devargs_lookup(struct rte_pci_device *dev) +struct rte_devargs * +pci_devargs_lookup(struct rte_pci_device *dev) { struct rte_devargs *devargs; struct rte_pci_addr addr; diff --git a/drivers/bus/pci/private.h b/drivers/bus/pci/private.h index 13c3324bb..8b2e904f0 100644 --- a/drivers/bus/pci/private.h +++ b/drivers/bus/pci/private.h @@ -43,6 +43,17 @@ void pci_name_set(struct rte_pci_device *dev); /** + * Find matching up-to-date devargs for a given device. + * + * @param pci_dev + * PCI device + * @return + * A devargs pointer or NULL + */ +struct rte_devargs * +pci_devargs_lookup(struct rte_pci_device *dev); + +/** * Add a PCI device to the PCI Bus (append to PCI Device list). This function * also updates the bus references of the PCI Device (and the generic device * object embedded within. -- 2.11.0