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 8A46B455C2; Mon, 8 Jul 2024 12:25:47 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 5C8F24025E; Mon, 8 Jul 2024 12:25:47 +0200 (CEST) Received: from NAM04-BN8-obe.outbound.protection.outlook.com (mail-bn8nam04on2043.outbound.protection.outlook.com [40.107.100.43]) by mails.dpdk.org (Postfix) with ESMTP id 356D54003C for ; Mon, 8 Jul 2024 12:25:46 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=gU5v/WwZNjSCIRYxOwvAQzE1SrsQbcc2OIt/O9AaqbUTi04Jmo2ZSbqar3GefpOPeGtLvU0/TAUlJ+3Cb2CXmuMAf5Ect+cV15X2/yugIjk+3oUMIIu8vf/qykXh1PDfj5BQPMvyhgT1mI3dFD2P4NWib+T33MOPvIslEwpFZ1UQqdCdmG5G+JPh88Ax5auIgt32NOR2MdHEKGOPmEP5Gknrk/M3oK1/AubToATikeKkUCL+3ya/ubH9RtjpfREK3tmgkTPqK4Ja+6Fhfh9nKvucnMdtdfoa1F5dN9HGV3YOULTj2bq6b0SJ/rzHIxUPN6AlRueuKa8gRDciRjC92g== 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=hwSyT/GDsP9g5iPZKY+fQuArorv5ord17Vs1CUgWoCPK+19MSKnZUlKo1Tmbf3rhhqnYXJ9ZHBlsg2Of69z8RQj2oc7OMn561U+PxMEMEn0yeIHXITiooRHx1H1oCdVThd9AhvARx8njuAxz486tv+vUOh0Yhxf7sjVCoyZkUn0PwMR4WhKVrTL4y2es9iffGOCRC4BJiN1fgMhm8tZbnCKEh6N5nOmm/c+ZpOE5ZmJxl7J1I4ZfriOJoZ2sB+bPFtqjzC/fIY2O8QgwoCRE1UGnVJyjd0auIFyh43grMnMWbw0mwXJIP7v8CjZqDMvk4Bsv22u6KmyTxXFpUC/ezA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) 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=UHRmdwZazXmFCCRwNPjKiOMnPQfO918bp8iQ/F8JOSZKA02/ff6xfStRlKKG3gCMjlzLE6aqgVblnj0GzGIbGZxcl2h+0QsVckIIRn0w/u6tXRNantBLDy23mDcX+rgAp0tnEkpOpsvTKWNlNiHIezrecXI9xV8bIVm4lwaJNeL3o16m/GesINis7+AlIs+5LC6TXG5coWxtrvt8ZBEc5NsOepo3kI5F2TCSzy3ckWTQ6FXb6boH4zG1RY5mIplvg/qZgprH5S0nvdP4qMuxf/MeojiFz857sRCtDEoyIz5G4Fg6ADKtWEIjzDS07LzSPZTXdojUUq/O1YZHZriHYw== Received: from DS7PR03CA0024.namprd03.prod.outlook.com (2603:10b6:5:3b8::29) by CH3PR12MB8187.namprd12.prod.outlook.com (2603:10b6:610:125::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7741.34; Mon, 8 Jul 2024 10:25:43 +0000 Received: from CY4PEPF0000EE38.namprd03.prod.outlook.com (2603:10b6:5:3b8:cafe::54) by DS7PR03CA0024.outlook.office365.com (2603:10b6:5:3b8::29) 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 10:25:42 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) 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.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by CY4PEPF0000EE38.mail.protection.outlook.com (10.167.242.10) 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 10:25:42 +0000 Received: from rnnvmail204.nvidia.com (10.129.68.6) by mail.nvidia.com (10.129.200.66) 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 03:25:26 -0700 Received: from rnnvmail205.nvidia.com (10.129.68.10) by rnnvmail204.nvidia.com (10.129.68.6) 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 03:25:25 -0700 Received: from nvidia.com (10.127.8.12) by mail.nvidia.com (10.129.68.10) 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 03:25:23 -0700 From: Shani Peretz To: CC: , , , Dariusz Sosnowski , Thomas Monjalon , Chenbo Xia , Nipun Gupta , Tyler Retzlaff Subject: [PATCH v2] eal/common: fix inconsistent representation of PCI numbers Date: Mon, 8 Jul 2024 13:25:13 +0300 Message-ID: <20240708102513.1287823-1-shperetz@nvidia.com> X-Mailer: git-send-email 2.34.1 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: CY4PEPF0000EE38:EE_|CH3PR12MB8187:EE_ X-MS-Office365-Filtering-Correlation-Id: 36156728-e494-4ddb-ffd1-08dc9f38522d 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|376014|1800799024|36860700013; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?7p3OL4Buvwrc13Cg04uJNERjc64xUmcIM2Hg9K3tZMq8VF4EePwQcjAtUVln?= =?us-ascii?Q?tXuuw2FKgLxk8mmJs+wZv7Qnf0UQe7OYKq4w7y6AaeMEXWG8pCQCsBdcdb3t?= =?us-ascii?Q?pIBRderekBSakDKODW4UyWki5n0AQyP52juDLlLLEQiaILZfxAR6nzZjA1Wk?= =?us-ascii?Q?4tAK1xjOonLS8JiULlqgYEHPS7xQEzQqrAz6xNAL6BWoPDrCCFbT+k7BA4la?= =?us-ascii?Q?gw5W4xx1cM9rzzC3aKvmsC/WYahxpCe+O1XEYFup024EN+K25lpewxA07q8d?= =?us-ascii?Q?+7Q4wsegVacxXKpVBRAlvqb1EP4YUQXkWZy2PLyU9J0YXD9Yv2pQV+blgFSz?= =?us-ascii?Q?bsPznb0paS9eu+90e77cu87AZ3xZ8IO9bMVC62kSRad+5Y+kdiwM0LJ0HhqL?= =?us-ascii?Q?RwnaPUEJTWbJFfc4C7YHFMgXSn6QlDmFZh+VRnxV8y2Z8NZ4wPMAbj88qir1?= =?us-ascii?Q?cg6ieIMry8oDqF0kkoZ+e7G2WZziLSZK62BaGqDI0Oy1psAnonxd1B6dhDOP?= =?us-ascii?Q?2tWxZNh/b9Sq8f/0eQ2rOB6Z1m0pojMcBPZ2nRx2jO/kpSolM5T/X23ZOAro?= =?us-ascii?Q?nik3cGP5fZHretqR0UIe0ntn2gJoiWuNA1o19xNwiZ3Id/Yzk/YExGv+2Lhj?= =?us-ascii?Q?gtI80/oHv5H6F3Twy7LcyMuPZmwI84YRaPqG2MF+CFzZzF4cW6Dbni9tq1VW?= =?us-ascii?Q?qFevNfPxTp8orQseZAbdEzUdxW0/p8hDp5mR2IFJlQQ5XActA6tiryn5d36l?= =?us-ascii?Q?sBNFFih5uec5f9GbWl+woJLt29M3ku6+K+l6mS7mKTRxx4Kd71U+NMklt72H?= =?us-ascii?Q?a+WewlSZd4zkIeUHKrw/DfHb4ytUQIyEdHQAoaX02x7pDPFaGrmyBtlhz4wE?= =?us-ascii?Q?ZZNPRvFGRWnw01ys3KeOT+iE3ahWORAwEk6mWaLNulKlQeyGPVgT1FCQPmMM?= =?us-ascii?Q?CHCLf6KjJ6sVABz2dx2oUlY1Aw5S8bXS+d8Y4P0UteOwSoJa6BTMpeRzH3Bs?= =?us-ascii?Q?7+xmiStxSZor/2c8RbTIwJ3Ytrv+iu6HhOYbvDSByvLMEhUr+qxPY1ZyiH7d?= =?us-ascii?Q?bgJTVX3sC5VnRYMXZq/qsNnquR0uNr/+TsWo9VVAJ9HTyVmohF6ym8TbsYHo?= =?us-ascii?Q?P73iUsWsMbBwQwYwMs81Eeoe2egqq0jgyxNDzst2kRpyliZnUL4IJoH+9fiW?= =?us-ascii?Q?gfeOjykdaJ8e0raEmJjs7YQNRlhvPdyLoiC3tTvFlbgSsJedxbpmOd2IYAgf?= =?us-ascii?Q?QVzxQXuelnjlFfnsU9U1PArOvecgQy71++15cfdAE+KZp1eKzdYIr7ev8FYz?= =?us-ascii?Q?HS98WDvxD3OuIt5yMPEQ0TBQhTEqdH7Q2CPjPz59jI8CsTQNCJ3x6qkNZhxN?= =?us-ascii?Q?mPE+vO7OepR1J7jia3nB/6s2VekezqyyDahKwhZOsNVWQmAiDJHmFg5KiRpd?= =?us-ascii?Q?9PG0uMO3gqOXDO5/VA7vdfObqsAPvgYo?= X-Forefront-Antispam-Report: CIP:216.228.117.160; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:dc6edge1.nvidia.com; CAT:NONE; SFS:(13230040)(82310400026)(376014)(1800799024)(36860700013); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Jul 2024 10:25:42.4405 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 36156728-e494-4ddb-ffd1-08dc9f38522d X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.117.160]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CY4PEPF0000EE38.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH3PR12MB8187 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