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 9196AA00C5; Thu, 15 Sep 2022 14:47:08 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 0B8E4427FF; Thu, 15 Sep 2022 14:46:58 +0200 (CEST) Received: from szxga02-in.huawei.com (szxga02-in.huawei.com [45.249.212.188]) by mails.dpdk.org (Postfix) with ESMTP id 82BC440156 for ; Thu, 15 Sep 2022 14:46:54 +0200 (CEST) Received: from dggemv703-chm.china.huawei.com (unknown [172.30.72.55]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4MSxgr5WsjzmV9Z; Thu, 15 Sep 2022 20:43:04 +0800 (CST) Received: from kwepemm600004.china.huawei.com (7.193.23.242) by dggemv703-chm.china.huawei.com (10.3.19.46) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.24; Thu, 15 Sep 2022 20:46:51 +0800 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_128_GCM_SHA256) id 15.1.2375.31; Thu, 15 Sep 2022 20:46:51 +0800 From: Huisong Li To: CC: , , , , Subject: [PATCH V2 1/6] bus/pci: fix a segfault when call callback Date: Thu, 15 Sep 2022 20:45:17 +0800 Message-ID: <20220915124522.5407-2-lihuisong@huawei.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20220915124522.5407-1-lihuisong@huawei.com> References: <20220825024425.10534-1-lihuisong@huawei.com> <20220915124522.5407-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-CFilter-Loop: Reflected 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 After the driver probe is executed, the callback in application will be called. The callback in application may call some APIs which access the rte_pci_driver::driver by the device::driver pointer to get driver information. If the rte_pci_device::device::driver pointer isn't pointed to rte_pci_driver::driver in rte_pci_probe_one_driver, a segfault will occur. For example, when ethdev driver probe completes, the callback in application call rte_eth_dev_info_get which use dev->device->driver->name. So rte_pci_device::device::driver should point to rte_pci_driver::driver before executing the driver probe. Fixes: c752998b5e2e ("pci: introduce library and driver") Cc: stable@dpdk.org Signed-off-by: Huisong Li --- drivers/bus/pci/pci_common.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c index 37ab879779..831a9cd8c7 100644 --- a/drivers/bus/pci/pci_common.c +++ b/drivers/bus/pci/pci_common.c @@ -265,11 +265,22 @@ rte_pci_probe_one_driver(struct rte_pci_driver *dr, dr->driver.name, dev->id.vendor_id, dev->id.device_id, loc->domain, loc->bus, loc->devid, loc->function, dev->device.numa_node); + + /* + * After the driver probe is executed, the callback in application will + * be called. The callback in application may call some APIs which use + * dev->device.driver to get some driver information. If the driver + * pointer isn't pointed to driver->driver here, a segfault will occur. + */ + if (!already_probed) + dev->device.driver = &dr->driver; + /* call the driver probe() function */ ret = dr->probe(dr, dev); if (already_probed) return ret; /* no rollback if already succeeded earlier */ if (ret) { + dev->device.driver = NULL; dev->driver = NULL; if ((dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) && /* Don't unmap if device is unsupported and @@ -282,8 +293,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; -- 2.22.0