From patchwork Sat May 21 07:05:22 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "humin (Q)" X-Patchwork-Id: 111565 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 7CC45A0093; Sat, 21 May 2022 09:06:40 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2055640156; Sat, 21 May 2022 09:06:40 +0200 (CEST) Received: from szxga01-in.huawei.com (szxga01-in.huawei.com [45.249.212.187]) by mails.dpdk.org (Postfix) with ESMTP id A97D640040; Sat, 21 May 2022 09:06:37 +0200 (CEST) Received: from kwepemi500012.china.huawei.com (unknown [172.30.72.55]) by szxga01-in.huawei.com (SkyGuard) with ESMTP id 4L4vks1rs7zhXWh; Sat, 21 May 2022 15:05:57 +0800 (CST) Received: from localhost.localdomain (10.69.192.56) by kwepemi500012.china.huawei.com (7.221.188.12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.24; Sat, 21 May 2022 15:06:35 +0800 From: "Min Hu (Connor)" To: CC: Huisong Li , , Min Hu , Gaetan Rivet Subject: [PATCH 1/2] bus/pci: fix a segfault when call callback Date: Sat, 21 May 2022 15:05:22 +0800 Message-ID: <20220521070523.34983-2-humin29@huawei.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220521070523.34983-1-humin29@huawei.com> References: <20220521070523.34983-1-humin29@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.69.192.56] X-ClientProxiedBy: dggems702-chm.china.huawei.com (10.3.19.179) To kwepemi500012.china.huawei.com (7.221.188.12) 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 From: Huisong Li 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 Signed-off-by: Min Hu (Connor) --- 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 4a3a87f24f..507a654779 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;