From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 4F4A045A55; Sun, 29 Sep 2024 08:03:18 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id CD374402A7; Sun, 29 Sep 2024 08:03:14 +0200 (CEST) Received: from szxga04-in.huawei.com (szxga04-in.huawei.com [45.249.212.190]) by mails.dpdk.org (Postfix) with ESMTP id 6422E400D5 for ; Sun, 29 Sep 2024 08:03:10 +0200 (CEST) Received: from mail.maildlp.com (unknown [172.19.162.112]) by szxga04-in.huawei.com (SkyGuard) with ESMTP id 4XGYWX1vKbz2DcsR; Sun, 29 Sep 2024 14:02:16 +0800 (CST) Received: from kwepemm600004.china.huawei.com (unknown [7.193.23.242]) by mail.maildlp.com (Postfix) with ESMTPS id 7B830140157; Sun, 29 Sep 2024 14:03:08 +0800 (CST) Received: from localhost.localdomain (10.28.79.22) by kwepemm600004.china.huawei.com (7.193.23.242) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.39; Sun, 29 Sep 2024 14:03:07 +0800 From: Huisong Li To: , , , Parav Pandit , Xueming Li , Hemant Agrawal , Sachin Saxena , Rosen Xu , Chenbo Xia , Nipun Gupta , Long Li CC: , , , Subject: [PATCH RESEND v7 1/5] drivers/bus: restore driver assignment at front of probing Date: Sun, 29 Sep 2024 13:52:36 +0800 Message-ID: <20240929055241.29268-2-lihuisong@huawei.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20240929055241.29268-1-lihuisong@huawei.com> References: <20220825024425.10534-1-lihuisong@huawei.com> <20240929055241.29268-1-lihuisong@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [10.28.79.22] X-ClientProxiedBy: dggems702-chm.china.huawei.com (10.3.19.179) To kwepemm600004.china.huawei.com (7.193.23.242) X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org The driver assignment was moved back at the end of the device probing because there is no something to use rte_driver during the phase of probing. See commit 391797f04208 ("drivers/bus: move driver assignment to end of probing") However, it is necessary for probing callback to reference rte_driver before probing. For example, probing callback may call some APIs which access the rte_pci_driver::driver by the device::driver pointer to get driver information. In this case, a segment fault will occur in probing callback if there is not this assignment. Further, some comments in code need to be updated if we do that. The driver pointer in rte_device is set before probing and needs to be reset if probing failed. And rte_dev_is_probed can not be called inside probing. Fixes: 391797f04208 ("drivers/bus: move driver assignment to end of probing") Cc: stable@dpdk.org Signed-off-by: Huisong Li Acked-by: Chengwen Feng --- drivers/bus/auxiliary/auxiliary_common.c | 9 +++++++-- drivers/bus/dpaa/dpaa_bus.c | 9 +++++++-- drivers/bus/fslmc/fslmc_bus.c | 8 +++++++- drivers/bus/ifpga/ifpga_bus.c | 12 +++++++++--- drivers/bus/pci/pci_common.c | 9 +++++++-- drivers/bus/vdev/vdev.c | 10 ++++++++-- drivers/bus/vmbus/vmbus_common.c | 9 +++++++-- 7 files changed, 52 insertions(+), 14 deletions(-) diff --git a/drivers/bus/auxiliary/auxiliary_common.c b/drivers/bus/auxiliary/auxiliary_common.c index e6cbc4d356..8ce41a38d9 100644 --- a/drivers/bus/auxiliary/auxiliary_common.c +++ b/drivers/bus/auxiliary/auxiliary_common.c @@ -132,16 +132,21 @@ rte_auxiliary_probe_one_driver(struct rte_auxiliary_driver *drv, } dev->driver = drv; + /* + * Reference rte_driver before probing so as to this pointer can + * be used to get driver information in case of segment fault in + * probing callback. + */ + dev->device.driver = &drv->driver; AUXILIARY_LOG(INFO, "Probe auxiliary driver: %s device: %s (NUMA node %i)", drv->driver.name, dev->name, dev->device.numa_node); ret = drv->probe(drv, dev); if (ret != 0) { dev->driver = NULL; + dev->device.driver = NULL; rte_intr_instance_free(dev->intr_handle); dev->intr_handle = NULL; - } else { - dev->device.driver = &drv->driver; } return ret; diff --git a/drivers/bus/dpaa/dpaa_bus.c b/drivers/bus/dpaa/dpaa_bus.c index 1f6997c77e..eae2a03ff3 100644 --- a/drivers/bus/dpaa/dpaa_bus.c +++ b/drivers/bus/dpaa/dpaa_bus.c @@ -697,17 +697,22 @@ rte_dpaa_bus_probe(void) (dev->device.devargs && dev->device.devargs->policy == RTE_DEV_BLOCKED)) continue; - + /* + * Reference rte_driver before probing so as to this + * pointer can be used to get driver information in case + * of segment fault in probing callback. + */ + dev->device.driver = &drv->driver; if (probe_all || (dev->device.devargs && dev->device.devargs->policy == RTE_DEV_ALLOWED)) { ret = drv->probe(drv, dev); if (ret) { + dev->device.driver = NULL; DPAA_BUS_ERR("unable to probe:%s", dev->name); } else { dev->driver = drv; - dev->device.driver = &drv->driver; } } break; diff --git a/drivers/bus/fslmc/fslmc_bus.c b/drivers/bus/fslmc/fslmc_bus.c index c155f4a2fd..db13b1d60c 100644 --- a/drivers/bus/fslmc/fslmc_bus.c +++ b/drivers/bus/fslmc/fslmc_bus.c @@ -472,15 +472,21 @@ rte_fslmc_probe(void) continue; } + /* + * Reference rte_driver before probing so as to this + * pointer can be used to get driver information in case + * of segment fault in probing callback. + */ + dev->device.driver = &drv->driver; if (probe_all || (dev->device.devargs && dev->device.devargs->policy == RTE_DEV_ALLOWED)) { ret = drv->probe(drv, dev); if (ret) { + dev->device.driver = NULL; DPAA2_BUS_ERR("Unable to probe"); } else { dev->driver = drv; - dev->device.driver = &drv->driver; } } break; diff --git a/drivers/bus/ifpga/ifpga_bus.c b/drivers/bus/ifpga/ifpga_bus.c index ffb0c61214..bfe7077645 100644 --- a/drivers/bus/ifpga/ifpga_bus.c +++ b/drivers/bus/ifpga/ifpga_bus.c @@ -294,13 +294,19 @@ ifpga_probe_one_driver(struct rte_afu_driver *drv, /* reference driver structure */ afu_dev->driver = drv; + /* + * Reference rte_driver before probing so as to this pointer can + * be used to get driver information in case of segment fault in + * probing callback. + */ + afu_dev->device.driver = &drv->driver; /* call the driver probe() function */ ret = drv->probe(afu_dev); - if (ret) + if (ret) { afu_dev->driver = NULL; - else - afu_dev->device.driver = &drv->driver; + afu_dev->device.driver = NULL; + } return ret; } diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c index 1173f0887c..0a237a04cf 100644 --- a/drivers/bus/pci/pci_common.c +++ b/drivers/bus/pci/pci_common.c @@ -297,6 +297,12 @@ rte_pci_probe_one_driver(struct rte_pci_driver *dr, return ret; } } + /* + * Reference rte_driver before probing so as to this pointer can + * be used to get driver information in case of segment fault in + * probing callback. + */ + dev->device.driver = &dr->driver; } PCI_LOG(INFO, "Probe PCI driver: %s (%x:%04x) device: "PCI_PRI_FMT" (socket %i)", @@ -309,6 +315,7 @@ rte_pci_probe_one_driver(struct rte_pci_driver *dr, return ret; /* no rollback if already succeeded earlier */ if (ret) { dev->driver = NULL; + dev->device.driver = NULL; if ((dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) && /* Don't unmap if device is unsupported and * driver needs mapped resources. @@ -320,8 +327,6 @@ rte_pci_probe_one_driver(struct rte_pci_driver *dr, dev->vfio_req_intr_handle = NULL; rte_intr_instance_free(dev->intr_handle); dev->intr_handle = NULL; - } else { - dev->device.driver = &dr->driver; } return ret; diff --git a/drivers/bus/vdev/vdev.c b/drivers/bus/vdev/vdev.c index ec7abe7cda..2bf8e1f7fe 100644 --- a/drivers/bus/vdev/vdev.c +++ b/drivers/bus/vdev/vdev.c @@ -207,9 +207,15 @@ vdev_probe_all_drivers(struct rte_vdev_device *dev) return -1; } + /* + * Reference rte_driver before probing so as to this pointer can + * be used to get driver information in case of segment fault in + * probing callback. + */ + dev->device.driver = &driver->driver; ret = driver->probe(dev); - if (ret == 0) - dev->device.driver = &driver->driver; + if (ret != 0) + dev->device.driver = NULL; return ret; } diff --git a/drivers/bus/vmbus/vmbus_common.c b/drivers/bus/vmbus/vmbus_common.c index b9139c6e6c..0238f15f4f 100644 --- a/drivers/bus/vmbus/vmbus_common.c +++ b/drivers/bus/vmbus/vmbus_common.c @@ -119,6 +119,12 @@ vmbus_probe_one_driver(struct rte_vmbus_driver *dr, /* reference driver structure */ dev->driver = dr; + /* + * Reference rte_driver before probing so as to this pointer can + * be used to get driver information in case of segment fault in + * probing callback. + */ + dev->device.driver = &dr->driver; if (dev->device.numa_node < 0 && rte_socket_count() > 1) VMBUS_LOG(INFO, "Device %s is not NUMA-aware", guid); @@ -128,9 +134,8 @@ vmbus_probe_one_driver(struct rte_vmbus_driver *dr, ret = dr->probe(dr, dev); if (ret) { dev->driver = NULL; + dev->device.driver = NULL; rte_vmbus_unmap_device(dev); - } else { - dev->device.driver = &dr->driver; } return ret; -- 2.33.0