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 CF24E455C7; Mon, 8 Jul 2024 18:52:13 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id A1C1D40F16; Mon, 8 Jul 2024 18:52:13 +0200 (CEST) Received: from NAM04-BN8-obe.outbound.protection.outlook.com (mail-bn8nam04on2078.outbound.protection.outlook.com [40.107.100.78]) by mails.dpdk.org (Postfix) with ESMTP id 03CA540265 for ; Mon, 8 Jul 2024 18:52:12 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=BZr3ljmPCT3RRFFl+zWFfWydgPPlFJ1Xfhhqw4M0Kf8ddbSi3qFktbO63778YTmhl3/7lGBIHn4IV3strf6rKnTgTjIDSn70Jk2thizVQnErLX8KaYUizFwOmdmOLBUg/oUpTA9T2UofqxxN6R0uQxlwZVagCwU4vvlkccLP47pNRMd3K8ud9yf8IzkOhGr7SneAbVTzD9uppyCg/OCZUfxriIKjO6aBwSfomNI5nUob6wel6QlVACL1anuvo9TKZz2kvU6ma0X1CI1a5VvNbeDVUiWO5TLPP6hwMyd+sVAPdi0wfNf0ggrSmY5GEjFEwWy8baLJI5x6LYBEztZ/4A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=nd2GLCftfPAg+d+yrwOIjuKOKFtGFB4fPofkd+h3Tr8=; b=E+eqo1xcEZ0cP97ylfStZ4uIiyo0+BYfwAvbEkz9N9YU33PpmqHbVwgwa232H68IS8cw1fSQfesJBApEMrWcoU4mEhrRVQqOOaDkPif0PHYShFW1moDGnyxf6RwsllvKo/P5PErhEssshZM/gKiPOT+00zh9Wafc59tBBbLm1e8aY+KDaKZ/qczd60HefR951jzHhRmEquqWWNiLsOvQ9HgIkWY8RymOYsyDpmitQqGoIgK/VmCkYfftsm21Nrwno/adz7ZpDE8qKUo4ufjuHPtB1/h4xzIj8tlbR2jOjWT8EAOAOAUvizkdGlIH3MIb/tmEO2ccWzaw7zTnesHjBg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.118.232) smtp.rcpttodomain=dpdk.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=nd2GLCftfPAg+d+yrwOIjuKOKFtGFB4fPofkd+h3Tr8=; b=npgkrtg+WOXM1fE0932WlCBgRbTyPV3YWB2PCzP23zFxC8LATWhHaASG6DZhy7KPhwsEWmxd6WLgjfznkiTIP4+mAUkgMRQ9PtGZcfEFReheZu3gpZBzx8kXdXKld8apoUdXc2F4/sQXFAYBE+du/eoLFAXf7myTsgYPPtvz2RzC6lrfJeQp8Fuohg1YqgiBPViDBqRrO8rKYJIdXWqWZfh/F7rqix2hATfvOXmZarYc1L+tzRzMKpsXVNIZww2IAwz6g/r8/lAZ+ic0HV1UcVgOjsQDs8UA0jbxPfbVw79HgErKMWPvPAN/toNujgyvtSWm8jDFeH2DPLZKMw/W8g== Received: from CH0PR03CA0388.namprd03.prod.outlook.com (2603:10b6:610:119::30) by PH7PR12MB6953.namprd12.prod.outlook.com (2603:10b6:510:1ac::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7741.35; Mon, 8 Jul 2024 16:52:08 +0000 Received: from CH3PEPF0000000F.namprd04.prod.outlook.com (2603:10b6:610:119:cafe::c9) by CH0PR03CA0388.outlook.office365.com (2603:10b6:610:119::30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7741.36 via Frontend Transport; Mon, 8 Jul 2024 16:52:07 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.118.232) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.118.232 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.118.232; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.118.232) by CH3PEPF0000000F.mail.protection.outlook.com (10.167.244.40) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7762.17 via Frontend Transport; Mon, 8 Jul 2024 16:52:07 +0000 Received: from drhqmail203.nvidia.com (10.126.190.182) by mail.nvidia.com (10.127.129.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.4; Mon, 8 Jul 2024 09:51:52 -0700 Received: from drhqmail201.nvidia.com (10.126.190.180) by drhqmail203.nvidia.com (10.126.190.182) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.4; Mon, 8 Jul 2024 09:51:52 -0700 Received: from nvidia.com (10.127.8.12) by mail.nvidia.com (10.126.190.180) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.4 via Frontend Transport; Mon, 8 Jul 2024 09:51:49 -0700 From: Shani Peretz To: CC: , , , , , , , Subject: [PATCH v3] eal/common: fix inconsistent representation of PCI numbers Date: Mon, 8 Jul 2024 19:51:45 +0300 Message-ID: <20240708165145.1405107-1-shperetz@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240701200117.6349-1-shperetz@nvidia.com> References: <20240701200117.6349-1-shperetz@nvidia.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH3PEPF0000000F:EE_|PH7PR12MB6953:EE_ X-MS-Office365-Filtering-Correlation-Id: 588aab57-8479-4d94-920e-08dc9f6e4d6b X-LD-Processed: 43083d15-7273-40c1-b7db-39efd9ccc17a,ExtAddr X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|82310400026|1800799024|376014|36860700013; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?9NsRMyVwiOFdbbzU7vtAfRsqKWgUum03ZNcfGcZ1jL/fGm+/BfXgN6hJJp+h?= =?us-ascii?Q?+YAYGKtSbk/B73qNtT/wZLufK5uma1VJnBGv4aoYBqEExb1q7aGYYmXf/Lnl?= =?us-ascii?Q?wWqrWy0N9VQgBJBt/FNMRTmwEZf6oVMg3RUfAb6bKQ/vGLHSCss/oytq1sf1?= =?us-ascii?Q?qFS94XC09X5UP0aVWfl9BJtOvUV9kWr83Fk2q/HmC4uC5bRuQ8TNtXtOu3LT?= =?us-ascii?Q?95h0ZWOsNWL7jiSpd+BUO+wHmEiYaa2CWwUVwd+zdH9pgLTFjBcfMImaL/q6?= =?us-ascii?Q?RjDgQhLVFiAJfGvT7Q3L2pmqnS1hf/PqcmHHDm6QioCL6GfvBedSbLRZYqBT?= =?us-ascii?Q?9cTDUjl9whJ/UPsv0D2+C5lzZ7BX9oD83xkDy6LqrZTC4R5OPxp3DsDB5w47?= =?us-ascii?Q?3WI9nbTB6U+CFjEVAMsrMQ2Tn7etWSp9hrHVuTjJiDJ67GdXZAQMVfRyQR1o?= =?us-ascii?Q?5xhEpBSTdyQSjDLMsc1DDVAisFkJWmKgsIAyAduQ++niffKlRai0xSCHlikT?= =?us-ascii?Q?k1D4fqjq0+ierQy1Ui6U8Tn2KnVFrBW8oZU25B/D9NyhgaOjN/jKy2JR4nl2?= =?us-ascii?Q?9xoJkDBmogwh1TJ0+nI3PcLB8UNXiclQB5rSos04ZQ8msOFqFSffbkjc+1gF?= =?us-ascii?Q?laEQ6YoA45AWOql3Il+0YbSJXaWE8TdRVUnX6hr3BFMqiIbYbta49P8+py1d?= =?us-ascii?Q?p0dlVTAgVRR4KzDwmJqdZt+5pYEzHaZXlYEIQk/g0LnOj1iEb0doXzcp1on6?= =?us-ascii?Q?vI6LiqX9rvJwKZ5wIwEv59INH9P7aUM54JVZGHR1/JIBfbMOgUpknBXzfLN7?= =?us-ascii?Q?PqkLoX9aDnpF1dE4Po/GC/azq/okVyg2H1ez7+u69XoLSYPIrUVDh1fbeZn4?= =?us-ascii?Q?XQ9gnjppI8uzMAEwPbgo/teFSS8EKtrAHz40TnOmmccjc4IkIJy0SDh1Pgnb?= =?us-ascii?Q?ELQMUl6VDzt+V29S4CRgQr2TIaynMSEbOR6IAFDc8nWlxOUBtYUvmn97l2IZ?= =?us-ascii?Q?M48xs0FUxjEpQOuIonZGhX7kry8MPak+CVyVJYRtZlwDiOczPXw8aMf+280k?= =?us-ascii?Q?oOdNIg80fT9i4ViepqlL2dfzDjrlhhTE6HhxxrLNyQHF8tvBaTvsoc6IBSUD?= =?us-ascii?Q?5HkqMQagR1DCBRCHaeqcNlMnN3P7MRuGJ/9zNP/48zlwO+fy2YbFF/74n3Vq?= =?us-ascii?Q?1ZwuWlw9q4q79pqXhiOpTjBWIg8zbOj7wr3xQkR3HAlilBII+BjNkIZnD6Sw?= =?us-ascii?Q?XhkwSqK7+mUARayg+5MkkaGKE4p4dhnXkHkpni13ZWScZPLtm3/9ayeqCQtC?= =?us-ascii?Q?FGTKJiAsJNK47AEQ1R5Dwc2hp1zd1N4NzRUQ6U8mETJZYHCpzx+jon8C7pG9?= =?us-ascii?Q?O0ZETBMnx6Dwir6Rh8tTdbE6DzxpnDr6C+9XQjHWb1zrwiVIbaxgPO/v44Op?= =?us-ascii?Q?xiT2Ygt3h4sCjHg5hEWHWS0VIDLp6efi?= X-Forefront-Antispam-Report: CIP:216.228.118.232; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:dc7edge1.nvidia.com; CAT:NONE; SFS:(13230040)(82310400026)(1800799024)(376014)(36860700013); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Jul 2024 16:52:07.2319 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 588aab57-8479-4d94-920e-08dc9f6e4d6b X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.118.232]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CH3PEPF0000000F.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB6953 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 DPDK allows for two ways to specify PCI device numbers: a full version ("0000:08:00.0") and a short version ("08:00.0"). The problem arises when the application uses one format (e.g., full) when running testpmd, but then tries to use the other format (e.g., short) in a subsequent command, leading to a failure. The cmp_dev_name func, which is responsible for comparing PCI device names, is not handling the inconsistent PCI number representations correctly. The suggested fix is to use the pci_parse function, which can parse the PCI device name and fill a struct rte_pci_addr with the standardized representation of the PCI number. By comparing the struct rte_pci_addr instances instead of the string representations, the application can ensure consistent handling of PCI device numbers, regardless of the format used. Fixes: a3ee360f4440 ("eal: add hotplug add/remove device") Cc: jblunck@infradead.org Signed-off-by: Shani Peretz Acked-by: Dariusz Sosnowski Acked-by: Thomas Monjalon --- app/test/test_vdev.c | 10 ++-------- drivers/bus/pci/pci_common.c | 11 +++++++++++ lib/eal/common/eal_common_dev.c | 11 ++++++----- lib/eal/common/hotplug_mp.c | 11 ++--------- lib/eal/include/bus_driver.h | 18 ++++++++++++++++++ lib/eal/include/rte_dev.h | 16 ++++++++++++++++ lib/eal/linux/eal_dev.c | 10 +--------- lib/eal/version.map | 3 +++ 8 files changed, 59 insertions(+), 31 deletions(-) diff --git a/app/test/test_vdev.c b/app/test/test_vdev.c index 3e262f30bc..860fa260af 100644 --- a/app/test/test_vdev.c +++ b/app/test/test_vdev.c @@ -20,12 +20,6 @@ static const char * const valid_keys[] = { NULL, }; -static int -cmp_dev_name(const struct rte_device *dev, const void *name) -{ - return strcmp(rte_dev_name(dev), name); -} - static int cmp_dev_match(const struct rte_device *dev, const void *_kvlist) { @@ -82,7 +76,7 @@ test_vdev_bus(void) printf("Failed to create vdev net_null_test0\n"); goto fail; } - dev0 = vdev_bus->find_device(NULL, cmp_dev_name, "net_null_test0"); + dev0 = vdev_bus->find_device(NULL, rte_cmp_dev_name, "net_null_test0"); if (dev0 == NULL) { printf("Cannot find net_null_test0 vdev\n"); goto fail; @@ -93,7 +87,7 @@ test_vdev_bus(void) printf("Failed to create vdev net_null_test1\n"); goto fail; } - dev1 = vdev_bus->find_device(NULL, cmp_dev_name, "net_null_test1"); + dev1 = vdev_bus->find_device(NULL, rte_cmp_dev_name, "net_null_test1"); if (dev1 == NULL) { printf("Cannot find net_null_test1 vdev\n"); goto fail; diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c index 889a48d2af..538d491067 100644 --- a/drivers/bus/pci/pci_common.c +++ b/drivers/bus/pci/pci_common.c @@ -502,6 +502,16 @@ rte_pci_dump(FILE *f) } } +static int +pci_cmp_name(const struct rte_device *dev, const void *name2) +{ + struct rte_pci_addr name2_addr; + const struct rte_pci_device *dev1 = RTE_DEV_TO_PCI_CONST(dev); + + dev->bus->parse(name2, &name2_addr); + return rte_pci_addr_cmp(&dev1->addr, &name2_addr); +} + static int pci_parse(const char *name, void *addr) { @@ -956,6 +966,7 @@ struct rte_pci_bus rte_pci_bus = { .plug = pci_plug, .unplug = pci_unplug, .parse = pci_parse, + .cmp_name = pci_cmp_name, .devargs_parse = rte_pci_devargs_parse, .dma_map = pci_dma_map, .dma_unmap = pci_dma_unmap, diff --git a/lib/eal/common/eal_common_dev.c b/lib/eal/common/eal_common_dev.c index a99252b02f..12d68c3605 100644 --- a/lib/eal/common/eal_common_dev.c +++ b/lib/eal/common/eal_common_dev.c @@ -107,11 +107,12 @@ struct dev_next_ctx { #define CLSCTX(ptr) \ (((struct dev_next_ctx *)(intptr_t)ptr)->cls_str) -static int cmp_dev_name(const struct rte_device *dev, const void *_name) +int rte_cmp_dev_name(const struct rte_device *dev1, const void *name2) { - const char *name = _name; + if (dev1->bus->cmp_name) + return dev1->bus->cmp_name(dev1, name2); - return strcmp(dev->name, name); + return strcmp(dev1->name, (const char *)name2); } int @@ -197,7 +198,7 @@ local_dev_probe(const char *devargs, struct rte_device **new_dev) if (ret) goto err_devarg; - dev = da->bus->find_device(NULL, cmp_dev_name, da->name); + dev = da->bus->find_device(NULL, rte_cmp_dev_name, da->name); if (dev == NULL) { EAL_LOG(ERR, "Cannot find device (%s)", da->name); @@ -335,7 +336,7 @@ rte_eal_hotplug_remove(const char *busname, const char *devname) return -ENOENT; } - dev = bus->find_device(NULL, cmp_dev_name, devname); + dev = bus->find_device(NULL, rte_cmp_dev_name, devname); if (dev == NULL) { EAL_LOG(ERR, "Cannot find plugged device (%s)", devname); return -EINVAL; diff --git a/lib/eal/common/hotplug_mp.c b/lib/eal/common/hotplug_mp.c index 17089ca3db..a2623c96c3 100644 --- a/lib/eal/common/hotplug_mp.c +++ b/lib/eal/common/hotplug_mp.c @@ -21,13 +21,6 @@ struct mp_reply_bundle { void *peer; }; -static int cmp_dev_name(const struct rte_device *dev, const void *_name) -{ - const char *name = _name; - - return strcmp(dev->name, name); -} - /** * Secondary to primary request. * start from function eal_dev_hotplug_request_to_primary. @@ -135,7 +128,7 @@ __handle_secondary_request(void *param) goto finish; } - dev = bus->find_device(NULL, cmp_dev_name, da.name); + dev = bus->find_device(NULL, rte_cmp_dev_name, da.name); if (dev == NULL) { EAL_LOG(ERR, "Cannot find plugged device (%s)", da.name); ret = -ENOENT; @@ -262,7 +255,7 @@ static void __handle_primary_request(void *param) goto quit; } - dev = bus->find_device(NULL, cmp_dev_name, da->name); + dev = bus->find_device(NULL, rte_cmp_dev_name, da->name); if (dev == NULL) { EAL_LOG(ERR, "Cannot find plugged device (%s)", da->name); ret = -ENOENT; diff --git a/lib/eal/include/bus_driver.h b/lib/eal/include/bus_driver.h index 7b85a17a09..eba820f36c 100644 --- a/lib/eal/include/bus_driver.h +++ b/lib/eal/include/bus_driver.h @@ -118,6 +118,23 @@ typedef int (*rte_bus_unplug_t)(struct rte_device *dev); */ typedef int (*rte_bus_parse_t)(const char *name, void *addr); +/** + * Bus specific device name comparison function. + * + * This type of function is used to compare a bus name with an arbitrary + * name. + * + * @param dev + * Device handle. + * + * @param name + * Name to compare against. + * + * @return + * 0 if the device matches the name. Nonzero otherwise. + */ +typedef int (*rte_bus_cmp_name_t)(const struct rte_device *dev, const void *name); + /** * Parse bus part of the device arguments. * @@ -258,6 +275,7 @@ struct rte_bus { rte_bus_plug_t plug; /**< Probe single device for drivers */ rte_bus_unplug_t unplug; /**< Remove single device from driver */ rte_bus_parse_t parse; /**< Parse a device name */ + rte_bus_cmp_name_t cmp_name; /**< Compare device name */ rte_bus_devargs_parse_t devargs_parse; /**< Parse bus devargs */ rte_dev_dma_map_t dma_map; /**< DMA map for device in the bus */ rte_dev_dma_unmap_t dma_unmap; /**< DMA unmap for device in the bus */ diff --git a/lib/eal/include/rte_dev.h b/lib/eal/include/rte_dev.h index cefa04f905..a3d666c110 100644 --- a/lib/eal/include/rte_dev.h +++ b/lib/eal/include/rte_dev.h @@ -21,6 +21,7 @@ extern "C" { #include #include +#include #include struct rte_bus; @@ -170,6 +171,21 @@ int rte_dev_is_probed(const struct rte_device *dev); int rte_eal_hotplug_add(const char *busname, const char *devname, const char *drvargs); +/** + * General device name comparison. Will compare by using the specific bus + * compare function or by comparing the names directly. + * + * @param dev + * Device handle. + * @param name + * Name to compare against. + * @return + * 0 if the device matches the name. Nonzero otherwise. + */ +__rte_experimental +int +rte_cmp_dev_name(const struct rte_device *dev, const void *name); + /** * Add matching devices. * diff --git a/lib/eal/linux/eal_dev.c b/lib/eal/linux/eal_dev.c index fff4e8fa83..5c8effd7be 100644 --- a/lib/eal/linux/eal_dev.c +++ b/lib/eal/linux/eal_dev.c @@ -91,14 +91,6 @@ static void sigbus_handler(int signum, siginfo_t *info, EAL_LOG(DEBUG, "Success to handle SIGBUS for hot-unplug!"); } -static int cmp_dev_name(const struct rte_device *dev, - const void *_name) -{ - const char *name = _name; - - return strcmp(dev->name, name); -} - static int dev_uev_socket_fd_create(void) { @@ -280,7 +272,7 @@ dev_uev_handler(__rte_unused void *param) goto failure_handle_err; } - dev = bus->find_device(NULL, cmp_dev_name, + dev = bus->find_device(NULL, rte_cmp_dev_name, uevent.devname); if (dev == NULL) { EAL_LOG(ERR, "Cannot find device (%s) on " diff --git a/lib/eal/version.map b/lib/eal/version.map index 3df50c3fbb..e4355ef890 100644 --- a/lib/eal/version.map +++ b/lib/eal/version.map @@ -396,6 +396,9 @@ EXPERIMENTAL { # added in 24.03 rte_vfio_get_device_info; # WINDOWS_NO_EXPORT + + # added in 24.07 + rte_cmp_dev_name; }; INTERNAL { -- 2.34.1