From nobody Wed Jul 1 16:10:59 2026 Received: from PH0PR06CU001.outbound.protection.outlook.com (mail-westus3azon11011014.outbound.protection.outlook.com [40.107.208.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7D1D33BB115; Wed, 1 Jul 2026 07:34:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.208.14 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891241; cv=fail; b=UljZ6yEjHP46ZudG0iYLv9AQOp9wHVVw8DkvlvyHuDqRW4qRntDErgzYEYVve3ehlGpHqHHPHwGxUOkKp147wtlIGQbJv/iSBhSCwReZTdGbM3MXlJaEgq5YNOme3NDgSiRXz66K29wL72eX6PFheNpVZo1B+xXVJVGyQha25e4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891241; c=relaxed/simple; bh=gfTDe27xQcSkiSH/tro35vuHkFV7P+/ICtDo8tHEFAc=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=E8n/z6LA47vopyCEZOoA73YFifPWBnHg8LUivXZ5egz4NlkmlcpyBbm/L9wm/Lf4gTWQigjDDDIrDjJkHY50mjFns0wiiFuT1ceKi3RysE9eENnss02rXe6XEkPOMV8pPJ0A0EUbm17hehali8vf9ltXejHgAcg07EKQ1pz0Y0k= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=ujH/Ncg7; arc=fail smtp.client-ip=40.107.208.14 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="ujH/Ncg7" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=l+5bG/dXa9+dXDOGgwM4jz1HmMb3z1L1uO7oRL9S9qb1sJaBBnsT2MC4oxPpVcbzEd6xgfVaBRYv6sbR0VV2QaQ/RSfck/R1RGz0K2PA9xrgvyJpW7aZ/oWoUn/i78u5WLDXz6Xt0rZsVBjVSHD6cZPYkCKs02Oa1TedjvUxajVIusBkdoEpCuTr5vg07I7q0k9a0YfSckk8zIHS00QsYpGXrZEzUzl6sxZCBgQd1EV0xyzq19B3SsIciqZqP0I09OL0e38lOeN7w7ZRaY3qeRiTdBi/sY/QKXFYZ7NGaRSj2Kv8TPu56o53qxpAir/W2611uJcuFifOyueiSK75oA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=pkHGCseUpmvdLAwU+6uvtv+XyPBz3RZdYdI4prk6RLA=; b=QTilUDo1DuZ8qX7qMIgHjqRO5Li9Lsfsr2Fhu7qzuw+SH9Z+cjdU2qY1lrtueN045pBHb3G3jYPbBXJjsDtnBJ+tOF9drhq9EYHkfwqB10kxHR7ZUfVwiKHAzOv0rHerZYPnudJdjrRem+wk/BexAN7QqzEAleG1ZXzk+xG/XDC0T+HNGoBsp6AmDimWB9Wu9OlW8ptJe6ECbkMJqt8YA0ajaM0Gxc3+mICBgrHaH6FJt0ePa0K7jqMjodY0aQXP/kN+aWC+mOLaLRm2D7tezK8pXEJt0vEclBXn2yQ4EcrsX8LwPq9wLN1MnbT7WbKChSnTNfIXveziixnLc2BzJw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=lunn.ch 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=pkHGCseUpmvdLAwU+6uvtv+XyPBz3RZdYdI4prk6RLA=; b=ujH/Ncg7aZ/XbMRDKzLq3bRmJYe4I5SCZG6SxM9cHKyDhJW8VKTSJVFuzMFua8hA7BNWRsx8MIaA/Mzo8RXp24PI3mKM591KLy5z9ZQdJACrHtwkr0whRv1S/OwdSxie2smNn+vFsbRGReYEHKOw9mC0CDT6Decboa+qP4qIbHHIMp3aK2JjLawzmPxhACGsop15rhW7VxRzcXPZbwvek1gq6vpHBztOVikEOfUkwIScSIfXscWFJHcM2lb5ro2bO3Iv8ugGLEKKk38EmtkW7qr1AQfzO+j8VuN88hPOYawNPdxmNgULqF7ay5/8G6GPx9AeoWxxjKlEl3jcUENq0Q== Received: from DSSP220CA0013.NAMP220.PROD.OUTLOOK.COM (2603:10b6:8:3d3::8) by CH3PR12MB8879.namprd12.prod.outlook.com (2603:10b6:610:171::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.8; Wed, 1 Jul 2026 07:33:53 +0000 Received: from DS1PEPF0001708F.namprd03.prod.outlook.com (2603:10b6:8:3d3:cafe::b) by DSSP220CA0013.outlook.office365.com (2603:10b6:8:3d3::8) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.181.9 via Frontend Transport; Wed, 1 Jul 2026 07:33:53 +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 DS1PEPF0001708F.mail.protection.outlook.com (10.167.17.139) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.6 via Frontend Transport; Wed, 1 Jul 2026 07:33:53 +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.2562.20; Wed, 1 Jul 2026 00:33:33 -0700 Received: from rnnvmail201.nvidia.com (10.129.68.8) 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.2562.20; Wed, 1 Jul 2026 00:33:33 -0700 Received: from vdi.nvidia.com (10.127.8.10) by mail.nvidia.com (10.129.68.8) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Wed, 1 Jul 2026 00:33:23 -0700 From: Tariq Toukan To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , , Paolo Abeni CC: Adithya Jayachandran , Bobby Eshleman , Carolina Jubran , Cosmin Ratiu , Daniel Borkmann , Daniel Jurgens , Daniel Zahka , David Wei , Donald Hunter , Dragos Tatulea , Jiri Pirko , Jiri Pirko , Joe Damato , Jonathan Corbet , Kees Cook , Leon Romanovsky , , , , , Mark Bloch , Moshe Shemesh , Or Har-Toov , Parav Pandit , Petr Machata , Ratheesh Kannoth , Saeed Mahameed , Shahar Shitrit , Shay Drori , Shuah Khan , Shuah Khan , Simon Horman , Stanislav Fomichev , Tariq Toukan , Willem de Bruijn , Gal Pressman Subject: [PATCH net-next V10 01/14] devlink: Update nested instance locking comment Date: Wed, 1 Jul 2026 10:32:41 +0300 Message-ID: <20260701073254.754518-2-tariqt@nvidia.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20260701073254.754518-1-tariqt@nvidia.com> References: <20260701073254.754518-1-tariqt@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS1PEPF0001708F:EE_|CH3PR12MB8879:EE_ X-MS-Office365-Filtering-Correlation-Id: fde31b4f-57a7-429d-98a2-08ded7431a37 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|82310400026|1800799024|376014|7416014|36860700016|22082099003|18002099003|11063799006|56012099006; X-Microsoft-Antispam-Message-Info: hHXauDBLcLVuq/M9sLO1WRrW8J7Kvk+NZ7ZMMJOm2NTRpISEnWBxjhidD0JGx+BMVqQMjbxiDcT47dt0EE5zW+zYqjK/WEEzD7DkM3LDwPTPjX1Er13/Rvh9jnbgVgDSjPYVbEdqK8u+vkaqSwuy9CZfqN0WQuKknaCj+OXWZyrE+9z4uZJRRFfdgsM0PnHjkscRPMAV4cKgcjM2gnrLuED3keqKldKQ694ceM4yh5q9A3EzRsGjVtXgkYMyeQ3mWkqpmCUcl6UTAdCKQ1RLBMAo56QSSXz4vYXr2StTqFIqiO8yQtHGIS/V2WYyDVWkHsXTXF/AV9v48lkAm5/+SY3u0TtB4JtFa7tuenGDcDziQ9cBpeEIgyCEvdqcVdLWGX8RkAzS5oxNM1zTd6UvzTP+OdmRuWqOxpg7lJ/v6tGCfQ7iDx3bPmZejUwfDDpAd8dVjbdpWaeCHabHga035YoAlJsZF+pihyXjFllSuctIYU2MtR4SrZx+8lVyLTHYkqltm+JPmUXZFpQJ4GiQsUjOEdDPQbCwUEeh/uSIYS9csutWQ8KMPxDvvjnugnj0HURLiVJrUb+qpBLKPIANfCPhlC+i1WuyB32arkn9ED+9BU/zubnBibdscomrDd9/j8jGX0syaASelQv6Jo2eNHFWV/IRDdaeJbfcOQnzDCERIY1tvCcI8SqeOvwCFTf9Wo/1o0HGUYFAvMpCO0ukeQ== 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)(23010399003)(82310400026)(1800799024)(376014)(7416014)(36860700016)(22082099003)(18002099003)(11063799006)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 0jCx5bxrbY9qTjICwSlnAcVLCQDB+GWk2oIQUnDGUvod2avj9o9+QLl1jFRsmt3pPZx8bDRWeDlN9tfNkvqe8jdGMOU3af6W5ggXtXUpDH6v4lOcNzl4T6uCxb8lUbKfHyMoTkNIuvU6HRSnpVcxp9FRAZR9JxXjFtKBVg9uPP2ZTb7xCPq++uTOMBoq09cLUCFyJMCWjW5rFz7TMJsAq9rcHP6+870H6/XlssCel47mqusAZcJI/c7gZRBTuZl8G4ONgDv4RCCizj+C7iztSyu3YepqLaBJX5lLTiqe+VX2a/Vtc62NOnipSvULgUDZGqAu2EdEGwwCXeHX803mqmRicO4lRJhj1cJOikUYaP95SY77CKoLzqGW+u8GA5TPoRVmdy9+69aKnTtHKwbnbOVWychTuyPrlkQMjm4fS4Y0WBiiUsjPm7tQEpR7FijZ X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Jul 2026 07:33:53.2685 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: fde31b4f-57a7-429d-98a2-08ded7431a37 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: DS1PEPF0001708F.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH3PR12MB8879 Content-Type: text/plain; charset="utf-8" From: Cosmin Ratiu In commit [1] a comment about nested instance locking was updated. But there's another place where this is mentioned, so update that as well. [1] commit 0061b5199d7c ("devlink: Reverse locking order for nested instances") Signed-off-by: Cosmin Ratiu Reviewed-by: Carolina Jubran Reviewed-by: Jiri Pirko Signed-off-by: Tariq Toukan --- Documentation/networking/devlink/index.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Documentation/networking/devlink/index.rst b/Documentation/net= working/devlink/index.rst index 32f70879ddd0..4745148fecf4 100644 --- a/Documentation/networking/devlink/index.rst +++ b/Documentation/networking/devlink/index.rst @@ -31,10 +31,10 @@ sure to respect following rules: =20 - Lock ordering should be maintained. If driver needs to take instance lock of both nested and parent instances at the same time, devlink - instance lock of the parent instance should be taken first, only then - instance lock of the nested instance could be taken. - - Driver should use object-specific helpers to setup the nested relations= hip - before registering the nested devlink instance: + instance lock of the nested instance should be taken first, only then + instance lock of the parent instance could be taken. + - Driver should use object-specific helpers to setup the + nested relationship: =20 - ``devl_nested_devlink_set()`` - called to setup devlink -> nested devlink relationship (could be used for multiple nested instances). --=20 2.44.0 From nobody Wed Jul 1 16:10:59 2026 Received: from CH5PR02CU005.outbound.protection.outlook.com (mail-northcentralusazon11012049.outbound.protection.outlook.com [40.107.200.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6A7F93B0AE7; Wed, 1 Jul 2026 07:34:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.200.49 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891257; cv=fail; b=PKEe3oagT7EtdZTahgsMOfyGifjsN/x4u3YiXLdO+g0Xo/M4pS+LD6PwEgvU0xklOZmO+xfZR7TEK9jC+1xK9+SpLyDsAzAaGt7dS2Xk18RwKG+/YcYMEvkZJeSQUzJP/PUBYkNyOD0Zti/1aCgGl6d1jPl981oS2Q6FSci4AE8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891257; c=relaxed/simple; bh=9mv0ltrKjiecIgayt60KGUxf+nD1XnTQsjfSk7ZKaBc=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=fep1+mb53BcqtWhnf/MCwfPcI81hmSGtEdviqUYeORjDy+tBwxPrfn/bXXigA0OX1DbvIg9T2ERS+s540qQx3qPXE2s69fAMIsT9uTQG+EDxuOwWlsEzZhFnOLGGHdx904jKFV9blIbYFuTmQ1ln/0ts+l2/rs/l0hpY00sCKWc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=Pts97LqI; arc=fail smtp.client-ip=40.107.200.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="Pts97LqI" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Pzv7DcSs1gWRWC2lQMrnlv3Co+YP+y6xH2hUOTYz/vGqDWY7DYA9J0j7HeQ8zmvIQueMznAvj7V07CCzdudOoaNLSpE5HLjJE2KRp0a3EVofJNvwEZNrRB/zd2M+x8AoVqS/EabZPWE3Pw4PmEzIr6U5P7qMJ1L9ilKoKy4KmGU1puOXY6rNUV0U7Yzhx0qHHUkFEztpMHjIpjxkcOvBMUtyoyNumgzkrgSGbPVYwvhtN2hcLMI+SUdld12KkO+MK0mZ4jAlXI6kUOB+0rFEWCiIQu8A4YT823o9lhNTPdW1vgS0o4nkFBDUbsce8/7R7qqqaC7EO2imaT0cXV8wSA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=Th89mV8u9qzJ58FwXTm+/ewdTmIYmgeoyOIeOIsWgO0=; b=F8KkZ/eKawCgX1HA2pQXVPJz3qshUy2yF8HoqCUSUXzsTSLU98WKAD911NCKn7O3VTRegYcoFJJbjpmJepXPRrPXQzSLSIMSX6tyYdDpV0s3elNMaUEE61kQ06Tjm/2N/EbTIF5dg0Mr3y2pv7TbDtnvpVN/R+8Ecawhde6Lwr3t9wwqkmTXEj2Fe0Cwyjs/DdF9b0pO6ZVtRYGIJ3V9MTv3UoKyey9TwkuHWltY3xiPhOQqRfkjFm8p8qI/uhbVt49ogBtzgXaA+evGK6LTvW8xHnRCzw5v7Pn0boo0/WE547ZKYzG4RZZpnLcUhNkwj6aKrN2NA751j6LehWJhjQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=lunn.ch 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=Th89mV8u9qzJ58FwXTm+/ewdTmIYmgeoyOIeOIsWgO0=; b=Pts97LqIRnwf99EnUHbKYFhs7bPOt/8M+q/rd/kQYM8VVI2Cf/Q93UJ6oXET0ncCMlYSGVRRiwUJg34vCyQw/yjigIO/7VeGQmSylS+isqUtgMEylzMQXvcpQ1Lc7960E6ggXSi+aJNdHXxrXsCHVJrX9zW4PZV73JV3A282jl+xKZByZxdfzAWFple57c/0FWB5PJKlAaUq9FyS/bRCUK1Wa9qVtuARsfgOhSjh7NpCXpKdCiI9raYQnVhDBEghVrgf64PrDTca2WRUK/bhLaIGytqZoMZq9Aq2OVdJzc4+ErZo6TG0mXPwP9GRDJfJ/c8WZs0nyqBz9apZmobmNQ== Received: from DM6PR01CA0027.prod.exchangelabs.com (2603:10b6:5:296::32) by CY5PR12MB6646.namprd12.prod.outlook.com (2603:10b6:930:41::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.159.16; Wed, 1 Jul 2026 07:34:07 +0000 Received: from DS1PEPF00017094.namprd03.prod.outlook.com (2603:10b6:5:296:cafe::3c) by DM6PR01CA0027.outlook.office365.com (2603:10b6:5:296::32) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.181.8 via Frontend Transport; Wed, 1 Jul 2026 07:34:07 +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 DS1PEPF00017094.mail.protection.outlook.com (10.167.17.137) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.6 via Frontend Transport; Wed, 1 Jul 2026 07:34:06 +0000 Received: from rnnvmail203.nvidia.com (10.129.68.9) 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.2562.20; Wed, 1 Jul 2026 00:33:43 -0700 Received: from rnnvmail201.nvidia.com (10.129.68.8) by rnnvmail203.nvidia.com (10.129.68.9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 1 Jul 2026 00:33:43 -0700 Received: from vdi.nvidia.com (10.127.8.10) by mail.nvidia.com (10.129.68.8) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Wed, 1 Jul 2026 00:33:33 -0700 From: Tariq Toukan To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , , Paolo Abeni CC: Adithya Jayachandran , Bobby Eshleman , Carolina Jubran , Cosmin Ratiu , Daniel Borkmann , Daniel Jurgens , Daniel Zahka , David Wei , Donald Hunter , Dragos Tatulea , Jiri Pirko , Jiri Pirko , Joe Damato , Jonathan Corbet , Kees Cook , Leon Romanovsky , , , , , Mark Bloch , Moshe Shemesh , Or Har-Toov , Parav Pandit , Petr Machata , Ratheesh Kannoth , Saeed Mahameed , Shahar Shitrit , Shay Drori , Shuah Khan , Shuah Khan , Simon Horman , Stanislav Fomichev , Tariq Toukan , Willem de Bruijn , Gal Pressman Subject: [PATCH net-next V10 02/14] devlink: Add a helper for getting a nested-in instance Date: Wed, 1 Jul 2026 10:32:42 +0300 Message-ID: <20260701073254.754518-3-tariqt@nvidia.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20260701073254.754518-1-tariqt@nvidia.com> References: <20260701073254.754518-1-tariqt@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS1PEPF00017094:EE_|CY5PR12MB6646:EE_ X-MS-Office365-Filtering-Correlation-Id: 46b9dad0-7a5c-4c25-f868-08ded7432260 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|82310400026|36860700016|376014|7416014|23010399003|22082099003|18002099003|11063799006|56012099006; X-Microsoft-Antispam-Message-Info: qiGAlJmzejAN/KRBMKvmh7s/Q8TE/iEWvNcq5Sq+n82Z5EnB/QgxHR4k4hpwl24TYbpdcAY8G2YNc86ahY/q9qCq7G+kM7gsFEI8McWu0ICU4d1tjbCTAheXC8DvW6deAvaYDa2nnGP0NHtDMT577UCXnForoKsdUMdn17xZjJc1UliqN3DU2CAhusiEeh4UUT21etFdrr9Ix1sqaxAbvqmxKZdLS043f/iF6kCl3/wjrNYZP786sj2IS3gIJrxTtEPkGapiBrlr0gqka3qL/rSiK1bKaYPRV5UZY1AQR45HkTNL+BiqiHAK+3Q/CxmSSkkvtNRmK7LsjTj/xgah87/vC23ZuzBf139AkwoKeawXbFW9WrUPsLbwoiv8bjVlkdAxQqQptByDMkdNlgNZIM/F80czUcbON7273c3vJNJ6+9gpzypRkWcJ5SJRhIgpuE06BVAHVB7UrtCwzlSlr5kvdN2jRNB6Fmb3Gx9/ux4c25bFGm7ahapHuW5kL83gUlsKTrNt5jKhZ39uGsIFPUz7Jieax9MNnSwXBLPY48DTtYG22UfomLIXDjFrSUWXvG+g1E5fe+lt3/ldbH7IuIbJfrsQY4FhLE8EfWjpoG8oNPP1ZGDYKnw+eIA1A5k1WdZNORkLrRVTM2BshJOLd2MvP0cDBrl1eQmEs1GFjfEx09Z/FX/FyaWmdRBGrN+epTfdYvbOsfusfvvSjAz89w== 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)(1800799024)(82310400026)(36860700016)(376014)(7416014)(23010399003)(22082099003)(18002099003)(11063799006)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: C+48xfFRrYfaJ5p/kE9OcUiB42LvlSLwKVNpfD65gbeCYcl2CzT7cGVV1s5zAObDrDrcbVh5VvLTi0Wv8C3HXJDk6X4AI5uOolyjPUHROlP0dVb9hgulu2+GgeSRmN67yqvqpkvTPq0WxFDfpMkA+jetXoy2BTEaSZiCONh7coYZcie/uDbyc7l5nUcAxLo+ck03MjYAiLvgZLRqPiOJhKRjEY8kWnp0bO5KRjordjSem85FaZe7JYASnd1RtkX9X6uG7zfQFNmHROm1PKuhQ1HoL7gKV7Q69ntJOX+XINUXa3J4iqT4a7K9Fm5gLsYsyQDHohr+e7/Kl1WU/7Tn/RgafZF5vJPG4EhOTMTt9f9CtDyUqy4ybQkCHyODEjziASTuyE5uGhRzSqpsve4oXVArNLqjahJESSzbMXmLqzliOcIQFqrrMWacEAf4Ie1D X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Jul 2026 07:34:06.9388 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 46b9dad0-7a5c-4c25-f868-08ded7432260 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: DS1PEPF00017094.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY5PR12MB6646 Content-Type: text/plain; charset="utf-8" From: Cosmin Ratiu Upcoming code will need to obtain references to locked nested-in devlink instances. Add a helper to lock, reference and return the nested-in instance. Signed-off-by: Cosmin Ratiu Reviewed-by: Carolina Jubran Reviewed-by: Jiri Pirko Signed-off-by: Tariq Toukan --- net/devlink/core.c | 16 ++++++++++++++++ net/devlink/devl_internal.h | 4 ++++ 2 files changed, 20 insertions(+) diff --git a/net/devlink/core.c b/net/devlink/core.c index fe9f6a0a67d5..ee26c50b4118 100644 --- a/net/devlink/core.c +++ b/net/devlink/core.c @@ -67,6 +67,22 @@ static void __devlink_rel_put(struct devlink_rel *rel) devlink_rel_free(rel); } =20 +struct devlink *__must_check devlink_nested_in_get_lock(struct devlink *de= vlink) +{ + devl_assert_locked(devlink); + if (!devlink->rel) + return NULL; + devlink =3D devlinks_xa_get(devlink->rel->nested_in.devlink_index); + if (!devlink) + return NULL; + devl_lock(devlink); + if (devl_is_registered(devlink)) + return devlink; + devl_unlock(devlink); + devlink_put(devlink); + return NULL; +} + static void devlink_rel_nested_in_notify_work(struct work_struct *work) { struct devlink_rel *rel =3D container_of(work, struct devlink_rel, diff --git a/net/devlink/devl_internal.h b/net/devlink/devl_internal.h index e4e48ee2da5a..36dff282f9b0 100644 --- a/net/devlink/devl_internal.h +++ b/net/devlink/devl_internal.h @@ -136,6 +136,10 @@ typedef void devlink_rel_notify_cb_t(struct devlink *d= evlink, u32 obj_index); typedef void devlink_rel_cleanup_cb_t(struct devlink *devlink, u32 obj_ind= ex, u32 rel_index); =20 +/* Returns the locked+referenced nested-in instance or NULL. */ +struct devlink *__must_check +devlink_nested_in_get_lock(struct devlink *devlink); + void devlink_rel_nested_in_clear(u32 rel_index); int devlink_rel_nested_in_add(u32 *rel_index, u32 devlink_index, u32 obj_index, devlink_rel_notify_cb_t *notify_cb, --=20 2.44.0 From nobody Wed Jul 1 16:10:59 2026 Received: from BYAPR05CU005.outbound.protection.outlook.com (mail-westusazon11010059.outbound.protection.outlook.com [52.101.85.59]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9511C3BB675; Wed, 1 Jul 2026 07:35:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.85.59 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891303; cv=fail; b=M3wjqsdlE9kQZVN4zsuae9MSwiZu5qoJvSkmBDvWTQeHFYKrkXQxPZwc431/s4w+uZJCSleaP0DI9A1+wFdiwVAeLG6GcoIEjzvKuoq9t0uV817wK+deSIMd5jQqyLJbS6MaYreAMF8+VZd5O9YkSgUZM1TKiUfHCSLrZoL0F0s= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891303; c=relaxed/simple; bh=hQ+zd6I8PbvCPq1jXhXreajPAvph/zRYHmsjdRBaqCA=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=u8hIsbQ6XGotvBzoHHyK6/ar/ThqZwEjEW/TPIE3akLbaFFgz6wibVL5wx1eW0lcytFGowvtvUVWRig5cfoghpk8/HFm0a3GzH5KMSxNY8t4zMexnK0keIRlULidFsxEBBgDY1wFWQDd8WPYyaDWW5QBPEIhSZfqy8Ezj9gJMTY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=IIVr6+Ty; arc=fail smtp.client-ip=52.101.85.59 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="IIVr6+Ty" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=rtfUpVyJiiRyzRW1Kh85Xc/JRJ6+3YZHsGxev3MsBYIPC2y9zMVrJi3/vigtMLujIeTqNAKdtRX3PeibsS164ou5eyCaZmYegIfCAY3j4F0pL/a0vGxgerKkSivugAzaeHCtK5LZoVU9t22YVSbWMmFHI2w7Mtgi28xewFzWTqaGoOhZ3HX2mj4KG4pVEyXC+Ng7bPduYDdYmBTtkppYpELjWQtwrEq+r9KO0Q23CmntcpL0We2LtKGLqNGkjnXG+hsklF255iVh4tw3N94aXVYjG3R41A22nDDszYkF0t4rL2NYbcEz2CO8b3rAxq85707OYQWIMoT8/A/nra1IBw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=YI2yBdlztjycd8tCoUPAqyJH6Xzb0es18HHF9vl7NqQ=; b=J3rgS1tvSx5+cfRq0WvvMJ+zgkT2wGh8SjY7XLYwVtpuVtdtXHFXb5wJzL00usMMGHHRe5x8v/uBGRbQkrtNAq9V6VWG+/mkvT/TeXhdLsr/wy8vvud9aC1KDlwyUTgeQVtBVhxF9FAUUVQ2gLYIo6ZTb2wlP0GByM061veuYS5W1o8A9ezSGHlURmuQhgN51TTyLM+sFje/QlpBA3ALNwdrKtvG4ooXKks+5dcIf+JYs5357BSuh3ssemLnA4sIXoteE6Bv1HAPrMxSne75Rq3donzzcvX/1uRa//kXObtlLA7rIaLeQgob8ARtoqBgBY0+llzt+5UcBaSEDQ+tgw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=lunn.ch 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=YI2yBdlztjycd8tCoUPAqyJH6Xzb0es18HHF9vl7NqQ=; b=IIVr6+TyuhWYlZxmsUQXtwK1GrhW0uztZ35EdoqGW/LHtUMnV54vkhOuQ8wl5D/5kPtIKjr9vo8LfRAFzHSGw7Tdt2WSTUr8gX1f3G6AwNG03SHbQpD8yPRMKVWfgtA+rKPj215KZItCqRDsQEOXQAhCNEKh9MXPURlhujaF07/NOmEeHrg93UD6xXUkeRGiK+P0eeMvnmvjNhLoQhDtCROLrluTKNA4YHch3lATEntVg5c76pZm74GPGdHRLl/cG2cu6Ap4FC4HOPnLrkeRmJ3wBfVOEZ1oXR0SxSQA1WRY/qjday198u69/0lfoYfxAJgFJeVdm5SVINtQvOSVxQ== Received: from BY5PR03CA0022.namprd03.prod.outlook.com (2603:10b6:a03:1e0::32) by DS5PPFDBFC954F7.namprd12.prod.outlook.com (2603:10b6:f:fc00::664) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.159.19; Wed, 1 Jul 2026 07:34:45 +0000 Received: from SJ1PEPF000023D6.namprd21.prod.outlook.com (2603:10b6:a03:1e0:cafe::89) by BY5PR03CA0022.outlook.office365.com (2603:10b6:a03:1e0::32) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.159.18 via Frontend Transport; Wed, 1 Jul 2026 07:34:44 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) 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.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by SJ1PEPF000023D6.mail.protection.outlook.com (10.167.244.71) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.202.0 via Frontend Transport; Wed, 1 Jul 2026 07:34:43 +0000 Received: from rnnvmail202.nvidia.com (10.129.68.7) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 1 Jul 2026 00:33:54 -0700 Received: from rnnvmail201.nvidia.com (10.129.68.8) by rnnvmail202.nvidia.com (10.129.68.7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 1 Jul 2026 00:33:53 -0700 Received: from vdi.nvidia.com (10.127.8.10) by mail.nvidia.com (10.129.68.8) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Wed, 1 Jul 2026 00:33:43 -0700 From: Tariq Toukan To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , , Paolo Abeni CC: Adithya Jayachandran , Bobby Eshleman , Carolina Jubran , Cosmin Ratiu , Daniel Borkmann , Daniel Jurgens , Daniel Zahka , David Wei , Donald Hunter , Dragos Tatulea , Jiri Pirko , Jiri Pirko , Joe Damato , Jonathan Corbet , Kees Cook , Leon Romanovsky , , , , , Mark Bloch , Moshe Shemesh , Or Har-Toov , Parav Pandit , Petr Machata , Ratheesh Kannoth , Saeed Mahameed , Shahar Shitrit , Shay Drori , Shuah Khan , Shuah Khan , Simon Horman , Stanislav Fomichev , Tariq Toukan , Willem de Bruijn , Gal Pressman Subject: [PATCH net-next V10 03/14] devlink: Migrate from info->user_ptr to info->ctx Date: Wed, 1 Jul 2026 10:32:43 +0300 Message-ID: <20260701073254.754518-4-tariqt@nvidia.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20260701073254.754518-1-tariqt@nvidia.com> References: <20260701073254.754518-1-tariqt@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF000023D6:EE_|DS5PPFDBFC954F7:EE_ X-MS-Office365-Filtering-Correlation-Id: 1b27254e-1d4a-45d9-d54d-08ded7433884 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|82310400026|376014|36860700016|1800799024|7416014|6133799003|11063799006|56012099006|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: iJl+XoJF4f9qsJHZN8CYsE1evotHP6XbF/X4kOYZNyoijDmt+f92XLt4Y1X9+NtQ42+1kFkzmzjuHywdsQP5rB5jnlLEw2JfHDqPSIN0vz/DFQsuUQVWzZ2ZdgWhuAFu1VwiDGjemg3STPCOmQ2VJjVCxxX4EuZF9vAxxNPM302kGSBd/gXhl84caOwbkbIMo18PXB+belzZF5NnUE8A2FY8vgtDFB6E5UIHB88gpW0lQmEpU4hAN/YJPy40bMR7HRHd2As1VYVQT7tUs5NmM8eq5IHdbdeD5KgmQi94I5ah4zF85bh6UnxnPiWrfzuXmx8niQztF1jqVVlzwWFONV0ol1z3JtL7Cj2weYbmwAA11u6ID3HWpLXm7cLnebLYE9TEzulGbVnmqa2JETtWl2W3pQDUHR8HfWMOKkNF0zpLRyYAH7o9EArkNdpPtMyQUPxkpBUsy/Q3701Q7t9pQjNuhwM4Hz6DnFlWKSDYOjGxhR9wBG9EedJJydjSN1d+zIZKLcyRKqBP7LIrU3qLCq05jcCY6EMgfU3TqKySaaghZ5GaLmamNsBZST42pXSFmBq2HUHCXLxzoCmvjf4h1LDN+nzS6ntDLdfDCfIZF8xq7lbKrfWAuGMJ9fjxD1Gjltd6WeaUTZ6ynfhm1+L7/dvm/mEqn1fSQ0VJxADRill9Mv0D/1Q2rBsRpP7lKtR4VvndWuwbRDqxBkvZxEQtNw== X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(23010399003)(82310400026)(376014)(36860700016)(1800799024)(7416014)(6133799003)(11063799006)(56012099006)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: TL1hr/UiHhv/6fACimeS7saBdzrTphkx2FraH3WkL6HDjPuF02WpkN42HolVxyFd216vnbKejo6tKpCG5AWuw7h2udV3noywrpgNI2liHnjDiXzHYOuJ8cBw/oUaCMcqjKv3yzl4ZTCkGNHZnzQeZ6y5bd6j1LncuaTYaO+hOzihrxxMMo/p4JgFYihgbQQ40xnuy1ifujMfSIkAXgsoXMcbqOXkDECqlQdxCBJuft+YHtz0ftEz0tSCD8fpmWe/74NR1YHKTmh6wlfuDz2iwVJ7gbK/XhhDzvgv/39z4UtfVQhJ/FimCINFDXA4RApuqyY/s5FK36NwWjdvp/CT7KjxTGIRsLD6cygdmWXiX6Jpd7bp0ZN8gof5oF8IcBvwyQO6QEbmyf4wWFUllOdYFg0dynu9kGPD23UgFQ0nMiqPR4PH08YYF8Nzty+OrRRq X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Jul 2026 07:34:43.8171 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 1b27254e-1d4a-45d9-d54d-08ded7433884 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.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF000023D6.namprd21.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS5PPFDBFC954F7 Content-Type: text/plain; charset="utf-8" From: Cosmin Ratiu Replace deprecated info->user_ptr[0]/[1] with a typed devlink_nl_ctx struct stored in info->ctx. The struct aliases the same union memory, so the migration is safe. There are no functionality changes here. Signed-off-by: Cosmin Ratiu Reviewed-by: Jiri Pirko Signed-off-by: Tariq Toukan --- net/devlink/dev.c | 16 ++++++++-------- net/devlink/devl_internal.h | 13 +++++++++++++ net/devlink/dpipe.c | 14 +++++++------- net/devlink/health.c | 12 ++++++------ net/devlink/linecard.c | 4 ++-- net/devlink/netlink.c | 8 ++++---- net/devlink/param.c | 4 ++-- net/devlink/port.c | 18 +++++++++--------- net/devlink/rate.c | 8 ++++---- net/devlink/region.c | 6 +++--- net/devlink/resource.c | 14 +++++++++----- net/devlink/sb.c | 22 +++++++++++----------- net/devlink/trap.c | 12 ++++++------ 13 files changed, 84 insertions(+), 67 deletions(-) diff --git a/net/devlink/dev.c b/net/devlink/dev.c index 57b2b8f03543..bcf001554e84 100644 --- a/net/devlink/dev.c +++ b/net/devlink/dev.c @@ -222,7 +222,7 @@ static void devlink_notify(struct devlink *devlink, enu= m devlink_command cmd) =20 int devlink_nl_get_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct sk_buff *msg; int err; =20 @@ -519,7 +519,7 @@ devlink_nl_reload_actions_performed_snd(struct devlink = *devlink, u32 actions_per =20 int devlink_nl_reload_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; enum devlink_reload_action action; enum devlink_reload_limit limit; struct net *dest_net =3D NULL; @@ -683,7 +683,7 @@ static int devlink_nl_eswitch_fill(struct sk_buff *msg,= struct devlink *devlink, =20 int devlink_nl_eswitch_get_doit(struct sk_buff *skb, struct genl_info *inf= o) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct sk_buff *msg; int err; =20 @@ -704,7 +704,7 @@ int devlink_nl_eswitch_get_doit(struct sk_buff *skb, st= ruct genl_info *info) =20 int devlink_nl_eswitch_set_doit(struct sk_buff *skb, struct genl_info *inf= o) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; const struct devlink_ops *ops =3D devlink->ops; enum devlink_eswitch_encap_mode encap_mode; u8 inline_mode; @@ -906,7 +906,7 @@ devlink_nl_info_fill(struct sk_buff *msg, struct devlin= k *devlink, =20 int devlink_nl_info_get_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct sk_buff *msg; int err; =20 @@ -1134,7 +1134,7 @@ int devlink_nl_flash_update_doit(struct sk_buff *skb,= struct genl_info *info) { struct nlattr *nla_overwrite_mask, *nla_file_name; struct devlink_flash_update_params params =3D {}; - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; const char *file_name; u32 supported_params; int ret; @@ -1302,7 +1302,7 @@ devlink_nl_selftests_fill(struct sk_buff *msg, struct= devlink *devlink, =20 int devlink_nl_selftests_get_doit(struct sk_buff *skb, struct genl_info *i= nfo) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct sk_buff *msg; int err; =20 @@ -1372,7 +1372,7 @@ static const struct nla_policy devlink_selftest_nl_po= licy[DEVLINK_ATTR_SELFTEST_ int devlink_nl_selftests_run_doit(struct sk_buff *skb, struct genl_info *i= nfo) { struct nlattr *tb[DEVLINK_ATTR_SELFTEST_ID_MAX + 1]; - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct nlattr *attrs, *selftests; struct sk_buff *msg; void *hdr; diff --git a/net/devlink/devl_internal.h b/net/devlink/devl_internal.h index 36dff282f9b0..52c8bf359dd4 100644 --- a/net/devlink/devl_internal.h +++ b/net/devlink/devl_internal.h @@ -151,6 +151,19 @@ int devlink_rel_devlink_handle_put(struct sk_buff *msg= , struct devlink *devlink, bool *msg_updated); =20 /* Netlink */ +struct devlink_nl_ctx { + struct devlink *devlink; + struct devlink_port *devlink_port; +}; + +static inline struct devlink_nl_ctx * +devlink_nl_ctx(struct genl_info *info) +{ + BUILD_BUG_ON(sizeof(struct devlink_nl_ctx) > + sizeof_field(struct genl_info, ctx)); + return (struct devlink_nl_ctx *)info->ctx; +} + enum devlink_multicast_groups { DEVLINK_MCGRP_CONFIG, }; diff --git a/net/devlink/dpipe.c b/net/devlink/dpipe.c index c8d4a4374ae1..08c7b66fc3e8 100644 --- a/net/devlink/dpipe.c +++ b/net/devlink/dpipe.c @@ -213,7 +213,7 @@ static int devlink_dpipe_tables_fill(struct genl_info *= info, struct list_head *dpipe_tables, const char *table_name) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_dpipe_table *table; struct nlattr *tables_attr; struct sk_buff *skb =3D NULL; @@ -290,7 +290,7 @@ static int devlink_dpipe_tables_fill(struct genl_info *= info, =20 int devlink_nl_dpipe_table_get_doit(struct sk_buff *skb, struct genl_info = *info) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; const char *table_name =3D NULL; =20 if (info->attrs[DEVLINK_ATTR_DPIPE_TABLE_NAME]) @@ -478,7 +478,7 @@ int devlink_dpipe_entry_ctx_prepare(struct devlink_dpip= e_dump_ctx *dump_ctx) if (!dump_ctx->hdr) goto nla_put_failure; =20 - devlink =3D dump_ctx->info->user_ptr[0]; + devlink =3D devlink_nl_ctx(dump_ctx->info)->devlink; if (devlink_nl_put_handle(dump_ctx->skb, devlink)) goto nla_put_failure; dump_ctx->nest =3D nla_nest_start_noflag(dump_ctx->skb, @@ -563,7 +563,7 @@ static int devlink_dpipe_entries_fill(struct genl_info = *info, int devlink_nl_dpipe_entries_get_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_dpipe_table *table; const char *table_name; =20 @@ -650,7 +650,7 @@ static int devlink_dpipe_headers_fill(struct genl_info = *info, struct devlink_dpipe_headers * dpipe_headers) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct nlattr *headers_attr; struct sk_buff *skb =3D NULL; struct nlmsghdr *nlh; @@ -713,7 +713,7 @@ static int devlink_dpipe_headers_fill(struct genl_info = *info, int devlink_nl_dpipe_headers_get_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; =20 if (!devlink->dpipe_headers) return -EOPNOTSUPP; @@ -747,7 +747,7 @@ static int devlink_dpipe_table_counters_set(struct devl= ink *devlink, int devlink_nl_dpipe_table_counters_set_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; const char *table_name; bool counters_enable; =20 diff --git a/net/devlink/health.c b/net/devlink/health.c index ea7a334e939b..8ce6cd399cb7 100644 --- a/net/devlink/health.c +++ b/net/devlink/health.c @@ -358,7 +358,7 @@ devlink_health_reporter_get_from_info(struct devlink *d= evlink, int devlink_nl_health_reporter_get_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_health_reporter *reporter; struct sk_buff *msg; int err; @@ -456,7 +456,7 @@ int devlink_nl_health_reporter_get_dumpit(struct sk_buf= f *skb, int devlink_nl_health_reporter_set_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_health_reporter *reporter; =20 reporter =3D devlink_health_reporter_get_from_info(devlink, info); @@ -715,7 +715,7 @@ EXPORT_SYMBOL_GPL(devlink_health_reporter_state_update); int devlink_nl_health_reporter_recover_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_health_reporter *reporter; =20 reporter =3D devlink_health_reporter_get_from_info(devlink, info); @@ -1157,7 +1157,7 @@ static int devlink_fmsg_dumpit(struct devlink_fmsg *f= msg, struct sk_buff *skb, int devlink_nl_health_reporter_diagnose_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_health_reporter *reporter; struct devlink_fmsg *fmsg; int err; @@ -1252,7 +1252,7 @@ int devlink_nl_health_reporter_dump_get_dumpit(struct= sk_buff *skb, int devlink_nl_health_reporter_dump_clear_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_health_reporter *reporter; =20 reporter =3D devlink_health_reporter_get_from_info(devlink, info); @@ -1269,7 +1269,7 @@ int devlink_nl_health_reporter_dump_clear_doit(struct= sk_buff *skb, int devlink_nl_health_reporter_test_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_health_reporter *reporter; =20 reporter =3D devlink_health_reporter_get_from_info(devlink, info); diff --git a/net/devlink/linecard.c b/net/devlink/linecard.c index 8315d35cb91d..fd18f2759770 100644 --- a/net/devlink/linecard.c +++ b/net/devlink/linecard.c @@ -171,7 +171,7 @@ void devlink_linecards_notify_unregister(struct devlink= *devlink) =20 int devlink_nl_linecard_get_doit(struct sk_buff *skb, struct genl_info *in= fo) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_linecard *linecard; struct sk_buff *msg; int err; @@ -371,7 +371,7 @@ static int devlink_linecard_type_unset(struct devlink_l= inecard *linecard, int devlink_nl_linecard_set_doit(struct sk_buff *skb, struct genl_info *in= fo) { struct netlink_ext_ack *extack =3D info->extack; - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_linecard *linecard; int err; =20 diff --git a/net/devlink/netlink.c b/net/devlink/netlink.c index ae4afc739678..f0a857e286bc 100644 --- a/net/devlink/netlink.c +++ b/net/devlink/netlink.c @@ -252,18 +252,18 @@ static int __devlink_nl_pre_doit(struct sk_buff *skb,= struct genl_info *info, if (IS_ERR(devlink)) return PTR_ERR(devlink); =20 - info->user_ptr[0] =3D devlink; + devlink_nl_ctx(info)->devlink =3D devlink; if (flags & DEVLINK_NL_FLAG_NEED_PORT) { devlink_port =3D devlink_port_get_from_info(devlink, info); if (IS_ERR(devlink_port)) { err =3D PTR_ERR(devlink_port); goto unlock; } - info->user_ptr[1] =3D devlink_port; + devlink_nl_ctx(info)->devlink_port =3D devlink_port; } else if (flags & DEVLINK_NL_FLAG_NEED_DEVLINK_OR_PORT) { devlink_port =3D devlink_port_get_from_info(devlink, info); if (!IS_ERR(devlink_port)) - info->user_ptr[1] =3D devlink_port; + devlink_nl_ctx(info)->devlink_port =3D devlink_port; } return 0; =20 @@ -304,7 +304,7 @@ static void __devlink_nl_post_doit(struct sk_buff *skb,= struct genl_info *info, bool dev_lock =3D flags & DEVLINK_NL_FLAG_NEED_DEV_LOCK; struct devlink *devlink; =20 - devlink =3D info->user_ptr[0]; + devlink =3D devlink_nl_ctx(info)->devlink; devl_dev_unlock(devlink, dev_lock); devlink_put(devlink); } diff --git a/net/devlink/param.c b/net/devlink/param.c index 3e9d2e5750c2..1cc562a6ebfd 100644 --- a/net/devlink/param.c +++ b/net/devlink/param.c @@ -627,7 +627,7 @@ devlink_param_get_from_info(struct xarray *params, stru= ct genl_info *info) int devlink_nl_param_get_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_param_item *param_item; struct sk_buff *msg; int err; @@ -728,7 +728,7 @@ static int __devlink_nl_cmd_param_set_doit(struct devli= nk *devlink, =20 int devlink_nl_param_set_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; =20 return __devlink_nl_cmd_param_set_doit(devlink, 0, &devlink->params, info, DEVLINK_CMD_PARAM_NEW); diff --git a/net/devlink/port.c b/net/devlink/port.c index 485029d43428..c268afefaed7 100644 --- a/net/devlink/port.c +++ b/net/devlink/port.c @@ -594,7 +594,7 @@ void devlink_ports_notify_unregister(struct devlink *de= vlink) =20 int devlink_nl_port_get_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink_port *devlink_port =3D info->user_ptr[1]; + struct devlink_port *devlink_port =3D devlink_nl_ctx(info)->devlink_port; struct sk_buff *msg; int err; =20 @@ -830,7 +830,7 @@ static int devlink_port_function_set(struct devlink_por= t *port, =20 int devlink_nl_port_set_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink_port *devlink_port =3D info->user_ptr[1]; + struct devlink_port *devlink_port =3D devlink_nl_ctx(info)->devlink_port; int err; =20 if (info->attrs[DEVLINK_ATTR_PORT_TYPE]) { @@ -856,8 +856,8 @@ int devlink_nl_port_set_doit(struct sk_buff *skb, struc= t genl_info *info) =20 int devlink_nl_port_split_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink_port *devlink_port =3D info->user_ptr[1]; - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink_port *devlink_port =3D devlink_nl_ctx(info)->devlink_port; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; u32 count; =20 if (GENL_REQ_ATTR_CHECK(info, DEVLINK_ATTR_PORT_SPLIT_COUNT)) @@ -887,8 +887,8 @@ int devlink_nl_port_split_doit(struct sk_buff *skb, str= uct genl_info *info) =20 int devlink_nl_port_unsplit_doit(struct sk_buff *skb, struct genl_info *in= fo) { - struct devlink_port *devlink_port =3D info->user_ptr[1]; - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink_port *devlink_port =3D devlink_nl_ctx(info)->devlink_port; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; =20 if (!devlink_port->ops->port_unsplit) return -EOPNOTSUPP; @@ -899,7 +899,7 @@ int devlink_nl_port_new_doit(struct sk_buff *skb, struc= t genl_info *info) { struct netlink_ext_ack *extack =3D info->extack; struct devlink_port_new_attrs new_attrs =3D {}; - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_port *devlink_port; struct sk_buff *msg; int err; @@ -961,9 +961,9 @@ int devlink_nl_port_new_doit(struct sk_buff *skb, struc= t genl_info *info) =20 int devlink_nl_port_del_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink_port *devlink_port =3D info->user_ptr[1]; + struct devlink_port *devlink_port =3D devlink_nl_ctx(info)->devlink_port; struct netlink_ext_ack *extack =3D info->extack; - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; =20 if (!devlink_port->ops->port_del) return -EOPNOTSUPP; diff --git a/net/devlink/rate.c b/net/devlink/rate.c index 533d21b028a7..630441e429b3 100644 --- a/net/devlink/rate.c +++ b/net/devlink/rate.c @@ -239,7 +239,7 @@ int devlink_nl_rate_get_dumpit(struct sk_buff *skb, str= uct netlink_callback *cb) =20 int devlink_nl_rate_get_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_rate *devlink_rate; struct sk_buff *msg; int err; @@ -588,7 +588,7 @@ static bool devlink_rate_set_ops_supported(const struct= devlink_ops *ops, =20 int devlink_nl_rate_set_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_rate *devlink_rate; const struct devlink_ops *ops; int err; @@ -610,7 +610,7 @@ int devlink_nl_rate_set_doit(struct sk_buff *skb, struc= t genl_info *info) =20 int devlink_nl_rate_new_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_rate *rate_node; const struct devlink_ops *ops; int err; @@ -666,7 +666,7 @@ int devlink_nl_rate_new_doit(struct sk_buff *skb, struc= t genl_info *info) =20 int devlink_nl_rate_del_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_rate *rate_node; int err; =20 diff --git a/net/devlink/region.c b/net/devlink/region.c index 5588e3d560b9..537779bbff07 100644 --- a/net/devlink/region.c +++ b/net/devlink/region.c @@ -469,7 +469,7 @@ static void devlink_region_snapshot_del(struct devlink_= region *region, =20 int devlink_nl_region_get_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_port *port =3D NULL; struct devlink_region *region; const char *region_name; @@ -588,7 +588,7 @@ int devlink_nl_region_get_dumpit(struct sk_buff *skb, =20 int devlink_nl_region_del_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_snapshot *snapshot; struct devlink_port *port =3D NULL; struct devlink_region *region; @@ -633,7 +633,7 @@ int devlink_nl_region_del_doit(struct sk_buff *skb, str= uct genl_info *info) =20 int devlink_nl_region_new_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_snapshot *snapshot; struct devlink_port *port =3D NULL; struct nlattr *snapshot_id_attr; diff --git a/net/devlink/resource.c b/net/devlink/resource.c index 574108ccfe5d..c3cfda7ea070 100644 --- a/net/devlink/resource.c +++ b/net/devlink/resource.c @@ -117,7 +117,7 @@ devlink_resource_validate_size(struct devlink_resource = *resource, u64 size, =20 int devlink_nl_resource_set_doit(struct sk_buff *skb, struct genl_info *in= fo) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_resource *resource; u64 resource_id; u64 size; @@ -251,8 +251,9 @@ static int devlink_resource_list_fill(struct sk_buff *s= kb, static int devlink_resource_fill(struct genl_info *info, enum devlink_command cmd, int flags) { - struct devlink_port *devlink_port =3D info->user_ptr[1]; - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink_nl_ctx *ctx =3D devlink_nl_ctx(info); + struct devlink *devlink =3D ctx->devlink; + struct devlink_port *devlink_port; struct devlink_resource *resource; struct list_head *resource_list; struct nlattr *resources_attr; @@ -263,6 +264,7 @@ static int devlink_resource_fill(struct genl_info *info, int i; int err; =20 + devlink_port =3D ctx->devlink_port; resource_list =3D devlink_port ? &devlink_port->resource_list : &devlink->resource_list; resource =3D list_first_entry(resource_list, @@ -326,10 +328,12 @@ static int devlink_resource_fill(struct genl_info *in= fo, =20 int devlink_nl_resource_dump_doit(struct sk_buff *skb, struct genl_info *i= nfo) { - struct devlink_port *devlink_port =3D info->user_ptr[1]; - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink_nl_ctx *ctx =3D devlink_nl_ctx(info); + struct devlink *devlink =3D ctx->devlink; + struct devlink_port *devlink_port; struct list_head *resource_list; =20 + devlink_port =3D ctx->devlink_port; if (info->attrs[DEVLINK_ATTR_PORT_INDEX] && !devlink_port) return -ENODEV; =20 diff --git a/net/devlink/sb.c b/net/devlink/sb.c index 49fcbfe08f15..129bd016e302 100644 --- a/net/devlink/sb.c +++ b/net/devlink/sb.c @@ -204,7 +204,7 @@ static int devlink_nl_sb_fill(struct sk_buff *msg, stru= ct devlink *devlink, =20 int devlink_nl_sb_get_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_sb *devlink_sb; struct sk_buff *msg; int err; @@ -306,7 +306,7 @@ static int devlink_nl_sb_pool_fill(struct sk_buff *msg,= struct devlink *devlink, =20 int devlink_nl_sb_pool_get_doit(struct sk_buff *skb, struct genl_info *inf= o) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_sb *devlink_sb; struct sk_buff *msg; u16 pool_index; @@ -415,7 +415,7 @@ static int devlink_sb_pool_set(struct devlink *devlink,= unsigned int sb_index, =20 int devlink_nl_sb_pool_set_doit(struct sk_buff *skb, struct genl_info *inf= o) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; enum devlink_sb_threshold_type threshold_type; struct devlink_sb *devlink_sb; u16 pool_index; @@ -506,7 +506,7 @@ static int devlink_nl_sb_port_pool_fill(struct sk_buff = *msg, int devlink_nl_sb_port_pool_get_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink_port *devlink_port =3D info->user_ptr[1]; + struct devlink_port *devlink_port =3D devlink_nl_ctx(info)->devlink_port; struct devlink *devlink =3D devlink_port->devlink; struct devlink_sb *devlink_sb; struct sk_buff *msg; @@ -624,8 +624,8 @@ static int devlink_sb_port_pool_set(struct devlink_port= *devlink_port, int devlink_nl_sb_port_pool_set_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink_port *devlink_port =3D info->user_ptr[1]; - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink_port *devlink_port =3D devlink_nl_ctx(info)->devlink_port; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_sb *devlink_sb; u16 pool_index; u32 threshold; @@ -716,7 +716,7 @@ devlink_nl_sb_tc_pool_bind_fill(struct sk_buff *msg, st= ruct devlink *devlink, int devlink_nl_sb_tc_pool_bind_get_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink_port *devlink_port =3D info->user_ptr[1]; + struct devlink_port *devlink_port =3D devlink_nl_ctx(info)->devlink_port; struct devlink *devlink =3D devlink_port->devlink; struct devlink_sb *devlink_sb; struct sk_buff *msg; @@ -864,8 +864,8 @@ static int devlink_sb_tc_pool_bind_set(struct devlink_p= ort *devlink_port, int devlink_nl_sb_tc_pool_bind_set_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink_port *devlink_port =3D info->user_ptr[1]; - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink_port *devlink_port =3D devlink_nl_ctx(info)->devlink_port; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; enum devlink_sb_pool_type pool_type; struct devlink_sb *devlink_sb; u16 tc_index; @@ -902,7 +902,7 @@ int devlink_nl_sb_tc_pool_bind_set_doit(struct sk_buff = *skb, =20 int devlink_nl_sb_occ_snapshot_doit(struct sk_buff *skb, struct genl_info = *info) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; const struct devlink_ops *ops =3D devlink->ops; struct devlink_sb *devlink_sb; =20 @@ -918,7 +918,7 @@ int devlink_nl_sb_occ_snapshot_doit(struct sk_buff *skb= , struct genl_info *info) int devlink_nl_sb_occ_max_clear_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; const struct devlink_ops *ops =3D devlink->ops; struct devlink_sb *devlink_sb; =20 diff --git a/net/devlink/trap.c b/net/devlink/trap.c index 8edb31654a68..793ffc66dc11 100644 --- a/net/devlink/trap.c +++ b/net/devlink/trap.c @@ -302,7 +302,7 @@ static int devlink_nl_trap_fill(struct sk_buff *msg, st= ruct devlink *devlink, int devlink_nl_trap_get_doit(struct sk_buff *skb, struct genl_info *info) { struct netlink_ext_ack *extack =3D info->extack; - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_trap_item *trap_item; struct sk_buff *msg; int err; @@ -412,7 +412,7 @@ static int devlink_trap_action_set(struct devlink *devl= ink, int devlink_nl_trap_set_doit(struct sk_buff *skb, struct genl_info *info) { struct netlink_ext_ack *extack =3D info->extack; - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_trap_item *trap_item; =20 if (list_empty(&devlink->trap_list)) @@ -511,7 +511,7 @@ devlink_nl_trap_group_fill(struct sk_buff *msg, struct = devlink *devlink, int devlink_nl_trap_group_get_doit(struct sk_buff *skb, struct genl_info *= info) { struct netlink_ext_ack *extack =3D info->extack; - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_trap_group_item *group_item; struct sk_buff *msg; int err; @@ -682,7 +682,7 @@ static int devlink_trap_group_set(struct devlink *devli= nk, int devlink_nl_trap_group_set_doit(struct sk_buff *skb, struct genl_info *= info) { struct netlink_ext_ack *extack =3D info->extack; - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_trap_group_item *group_item; bool modified =3D false; int err; @@ -804,7 +804,7 @@ int devlink_nl_trap_policer_get_doit(struct sk_buff *sk= b, { struct devlink_trap_policer_item *policer_item; struct netlink_ext_ack *extack =3D info->extack; - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; struct sk_buff *msg; int err; =20 @@ -924,7 +924,7 @@ int devlink_nl_trap_policer_set_doit(struct sk_buff *sk= b, { struct devlink_trap_policer_item *policer_item; struct netlink_ext_ack *extack =3D info->extack; - struct devlink *devlink =3D info->user_ptr[0]; + struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; =20 if (list_empty(&devlink->trap_policer_list)) return -EOPNOTSUPP; --=20 2.44.0 From nobody Wed Jul 1 16:10:59 2026 Received: from CY7PR03CU001.outbound.protection.outlook.com (mail-westcentralusazon11010037.outbound.protection.outlook.com [40.93.198.37]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2EE603009F6; Wed, 1 Jul 2026 07:34:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.198.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891278; cv=fail; b=qztrvVGvVs5TJIjfBLTe+g/SZ/X3SaaKRWLIDIZ2oQ5QAyYSIXgjhbUeaqrkQnlgm1bGiS4VvkBxrIPDYUzJ3XdtN24r4CZY5HZ3/pHtXanVHwc1glXK7VdH2VcrHnpwPjWxuxdO1KrbHVJzANZ1M8glKKpJ32l/rOQAnd05lsU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891278; c=relaxed/simple; bh=q1CSRouOkWQSNtwQ3rR7yGRZbyqNEZd1RAOFMKbBj2s=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=cuxYVQ22skQZAJBHS14tvlwFpvyuLeUqwjQiIZ9mp9z14CTAkSoiU0jTeK//Tkrd3b2xJcoG6bPSxW8vG9NuJVDl6ZaSiBDAImHl5IhMV5Y1bqppWpZi8i5rhqSEvpEMVQjIEhU8BU3fLLTCKcKp3rA1bHN6bxzYudxyQyAPgdc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=p98OX5Sr; arc=fail smtp.client-ip=40.93.198.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="p98OX5Sr" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=RzTwtwmbj7td2SQTWtxKB/4ezH5t70j++wQwbrYrneOnls2BgVU+7nd1d67rjsj5hFhZ1qLNWi3kBkwU8q414yneVw8bxi+El4e3s0kiqg9FwFznJ6Ld2zwxhJSFM06MxGGqTiQQycRGwLypqDRkO6zEwTlxM3cyMP9WIDku279qBcU76ZYY9fXoPUhvdSl3XFc7X0b4x6zYwU2NrN46+QEM2ZT5DcwC1S5de9stKpzHXIBOFNwlZIuwwSllDbPsb/d+J/fSoh1LFtlXKe8pFHxaS+W6ripb8RNaR/I8WdXtK+Y5aNWK30CXheDIOFzkc1El6xjgsU5KVQTndPJdlA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=bBJg/t/e0LmhRYT9rEMQJRNYOY4cbc6uoobEJS3OgHs=; b=n01YRFU2ije0GD8fvSRqZpEuXXSAiGcuA7tptYQUEtnmHYrDC8CPCWM6EZjBWZ3r01DVITLXAlRgc10fgy4lxC80p0+9J3N1kxy16cCgYoAw4diQgdJgMm8MdvRcTKbm5uSOM7rM6Cj3JeLbuk2gSuMcWuUsGDSRPCw5zrb7dAaOiS/5OVyq+8QDYpbYhSLzkIZqtkcfbzD0Rts9dwzy+AczpRsOpI6N0eb3oJb0qo4b685Sdl8pEmwFF/L+wcjomOU+CyVGQ6CRt8KCbLkLeP6tW+TEohdcMZNrwSRQcf7cjask837Mc5eOEIgaWxmQC1z8hFMvqkdgMOSNVlmmxg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=lunn.ch 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=bBJg/t/e0LmhRYT9rEMQJRNYOY4cbc6uoobEJS3OgHs=; b=p98OX5SrDfu8/oerfBDAGST1hzXmqF9R3J4Z3NxdWjKRZUAKVSxxOci7uer3uKc3wsYYt2J6EqO3fIADrBn6IHRgWqMV2xyKvtKpDiZPyhBQhUSjTwEAAAFi8NZ43HqG/Y/NuzclIfSfUB03D6XCy78n1Qm/akRUROAO+T1INWqRjtp5qSnAg6ro4ax/ajbJg0RWkAXDvDisX/vGrfoz48YnTpAlSux9/l10nbKVwWWEmPz2TYJS1Y3jUmNHwKgn2Y5He1budNze/gai7AO7nkxkMbgJYsnDJaQMRjq2wpEf9Ld0Z8Ubai8YYPZ3tEv97YM6Qq7nFieP9qeen5+TWA== Received: from DM6PR01CA0009.prod.exchangelabs.com (2603:10b6:5:296::14) by LV2PR12MB999073.namprd12.prod.outlook.com (2603:10b6:408:352::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.8; Wed, 1 Jul 2026 07:34:28 +0000 Received: from DS1PEPF00017094.namprd03.prod.outlook.com (2603:10b6:5:296:cafe::46) by DM6PR01CA0009.outlook.office365.com (2603:10b6:5:296::14) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.181.8 via Frontend Transport; Wed, 1 Jul 2026 07:34:28 +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 DS1PEPF00017094.mail.protection.outlook.com (10.167.17.137) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.6 via Frontend Transport; Wed, 1 Jul 2026 07:34:27 +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.2562.20; Wed, 1 Jul 2026 00:34:04 -0700 Received: from rnnvmail201.nvidia.com (10.129.68.8) 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.2562.20; Wed, 1 Jul 2026 00:34:03 -0700 Received: from vdi.nvidia.com (10.127.8.10) by mail.nvidia.com (10.129.68.8) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Wed, 1 Jul 2026 00:33:54 -0700 From: Tariq Toukan To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , , Paolo Abeni CC: Adithya Jayachandran , Bobby Eshleman , Carolina Jubran , Cosmin Ratiu , Daniel Borkmann , Daniel Jurgens , Daniel Zahka , David Wei , Donald Hunter , Dragos Tatulea , Jiri Pirko , Jiri Pirko , Joe Damato , Jonathan Corbet , Kees Cook , Leon Romanovsky , , , , , Mark Bloch , Moshe Shemesh , Or Har-Toov , Parav Pandit , Petr Machata , Ratheesh Kannoth , Saeed Mahameed , Shahar Shitrit , Shay Drori , Shuah Khan , Shuah Khan , Simon Horman , Stanislav Fomichev , Tariq Toukan , Willem de Bruijn , Gal Pressman Subject: [PATCH net-next V10 04/14] devlink: Decouple rate storage from associated devlink object Date: Wed, 1 Jul 2026 10:32:44 +0300 Message-ID: <20260701073254.754518-5-tariqt@nvidia.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20260701073254.754518-1-tariqt@nvidia.com> References: <20260701073254.754518-1-tariqt@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS1PEPF00017094:EE_|LV2PR12MB999073:EE_ X-MS-Office365-Filtering-Correlation-Id: 557df372-7f14-4f89-9063-08ded7432edb X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|1800799024|82310400026|23010399003|376014|7416014|56012099006|11063799006|18002099003|22082099003|6133799003; X-Microsoft-Antispam-Message-Info: XS2rHsPYBZIxEqCdcR4Osoks7sgw6tMkk3xbIDYX/aCDVI/IxRagLFqjpScRP0eJD9IOWeJPPe+kCojNY9yLA7mybNXW/LJpCpGSvFvIVU5lDl0/aUBiilmaprNvo0NXjOz74BCMg3werr7+rcSL6qTJw4gO3bHXR39eCJEmdX45zGze3PnBUbP4/EUKuotVhcThCXlkGrB0wwIwIp1zlAPfMToy4g+fZK6W+D/r30zI0hFIfbTrmHjp8NZK6sPOXUObQX7gDYYApxyOIPhZR5xV97wfr3eL+4l7gwbzGXBFMDuwLV1wLPTJGAX3z9m0gP5BEjX1SVcjQQ8yWu5XRezLu8Zp8MSNGma+QqrD+ShCmu2p8tbfuJ5puSd0DEIvYtHpjPbCD9ciVOYyEoo6nfkE5pBglhdQLFkGlt3ssPxXHvp7jnV2aF+4Crut3VQgVnSSLzF/w5dYPuyfJbDWXTHw/PF/B3NF8bMPTR8t+2Ssr7FOErUIxvGckUSSNSAMRBb4+zzngpfTfrXcXpeQE3KldmeowVqFAMzm0S/KD4pVZHCJYdLfeGtoedpPCSJ/iEK+aKf6HWyfT1msWsFbJyEbPXb+/fAjIzL///Yx5lQ9Y694IWGZmTjrYX61N835b+hrmmJpX7LME7Gy4imctZxPWJPjhL1axCzqi5QVQoOwwfQKrwe8/OCvM+162M+LmEVgJ82MMFnFlyxxSWbRbg== 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)(36860700016)(1800799024)(82310400026)(23010399003)(376014)(7416014)(56012099006)(11063799006)(18002099003)(22082099003)(6133799003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: kQ8ghgSeecxa7I/QGHneZr5BrNy/uFqP8hCeQAE+C7u8F0qgWYG7PZtl/tz5URzSy2LeHAkUd5x8Kq70Cw3h5RUxDyDo05DXKAvEPt4AmlqjD2s72BOTDOO32eyUC9Md2oll0tsYGSzrPuLxuAxqOXSBGNZANXktfIbbgxLY66C4ML3KuW8ULR3bf1g833xiAkMvBaJdYyi+hiwm6XbUDi+xnqv/OsA10kezQZ75Y6MtJJOJL6KBEnp8sa0TIfJUPUvDfgNxrp4qxD300u+KXAp55SQsr3i/+CokT3pevgq05pe7VKdjDBY+aizwO/s96UJ6Q7RyYZBxJhb1DeNl275g0WlDHGcc7pnLZIXOmOg2J/HRHsSWaVb3Ns0bUaLX+56zmCdb1LifyilnJKZljYA8xXZZZeW+3H91G10hVu7vq0OB3Kr7SD3hIDfhYpUI X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Jul 2026 07:34:27.9345 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 557df372-7f14-4f89-9063-08ded7432edb 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: DS1PEPF00017094.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV2PR12MB999073 Content-Type: text/plain; charset="utf-8" From: Cosmin Ratiu Devlink rate leafs and nodes were stored in their respective devlink objects pointed to by devlink_rate->devlink. This patch removes that association by introducing the concept of 'rate node devlink', which is where all rates that could link to each other are stored. For now this is the same as devlink_rate->devlink. After this patch, the devlink rates stored in this devlink instance could potentially be from multiple other devlink instances. So all rate node manipulation code was updated to: - correctly compare the actual devlink object during iteration. - maybe acquire additional locks (noop for now). Signed-off-by: Cosmin Ratiu Reviewed-by: Carolina Jubran Reviewed-by: Jiri Pirko Signed-off-by: Tariq Toukan --- net/devlink/rate.c | 249 ++++++++++++++++++++++++++++++++------------- 1 file changed, 177 insertions(+), 72 deletions(-) diff --git a/net/devlink/rate.c b/net/devlink/rate.c index 630441e429b3..295f4185fdfd 100644 --- a/net/devlink/rate.c +++ b/net/devlink/rate.c @@ -30,13 +30,25 @@ devlink_rate_leaf_get_from_info(struct devlink *devlink= , struct genl_info *info) return devlink_rate ?: ERR_PTR(-ENODEV); } =20 +static struct devlink *devl_rate_lock(struct devlink *devlink) +{ + return devlink; +} + +static void devl_rate_unlock(struct devlink *devlink, + struct devlink *rate_devlink) +{ +} + static struct devlink_rate * -devlink_rate_node_get_by_name(struct devlink *devlink, const char *node_na= me) +devlink_rate_node_get_by_name(struct devlink *rate_devlink, + struct devlink *devlink, const char *node_name) { struct devlink_rate *devlink_rate; =20 - list_for_each_entry(devlink_rate, &devlink->rate_list, list) { - if (devlink_rate_is_node(devlink_rate) && + list_for_each_entry(devlink_rate, &rate_devlink->rate_list, list) { + if (devlink_rate->devlink =3D=3D devlink && + devlink_rate_is_node(devlink_rate) && !strcmp(node_name, devlink_rate->name)) return devlink_rate; } @@ -44,7 +56,8 @@ devlink_rate_node_get_by_name(struct devlink *devlink, co= nst char *node_name) } =20 static struct devlink_rate * -devlink_rate_node_get_from_attrs(struct devlink *devlink, struct nlattr **= attrs) +devlink_rate_node_get_from_attrs(struct devlink *rate_devlink, + struct devlink *devlink, struct nlattr **attrs) { const char *rate_node_name; size_t len; @@ -57,24 +70,30 @@ devlink_rate_node_get_from_attrs(struct devlink *devlin= k, struct nlattr **attrs) if (!len || strspn(rate_node_name, "0123456789") =3D=3D len) return ERR_PTR(-EINVAL); =20 - return devlink_rate_node_get_by_name(devlink, rate_node_name); + return devlink_rate_node_get_by_name(rate_devlink, devlink, + rate_node_name); } =20 static struct devlink_rate * -devlink_rate_node_get_from_info(struct devlink *devlink, struct genl_info = *info) +devlink_rate_node_get_from_info(struct devlink *rate_devlink, + struct devlink *devlink, + struct genl_info *info) { - return devlink_rate_node_get_from_attrs(devlink, info->attrs); + return devlink_rate_node_get_from_attrs(rate_devlink, devlink, + info->attrs); } =20 static struct devlink_rate * -devlink_rate_get_from_info(struct devlink *devlink, struct genl_info *info) +devlink_rate_get_from_info(struct devlink *rate_devlink, + struct devlink *devlink, struct genl_info *info) { struct nlattr **attrs =3D info->attrs; =20 if (attrs[DEVLINK_ATTR_PORT_INDEX]) return devlink_rate_leaf_get_from_info(devlink, info); else if (attrs[DEVLINK_ATTR_RATE_NODE_NAME]) - return devlink_rate_node_get_from_info(devlink, info); + return devlink_rate_node_get_from_info(rate_devlink, devlink, + info); else return ERR_PTR(-EINVAL); } @@ -190,17 +209,25 @@ static void devlink_rate_notify(struct devlink_rate *= devlink_rate, void devlink_rates_notify_register(struct devlink *devlink) { struct devlink_rate *rate_node; + struct devlink *rate_devlink; =20 - list_for_each_entry(rate_node, &devlink->rate_list, list) - devlink_rate_notify(rate_node, DEVLINK_CMD_RATE_NEW); + rate_devlink =3D devl_rate_lock(devlink); + list_for_each_entry(rate_node, &rate_devlink->rate_list, list) + if (rate_node->devlink =3D=3D devlink) + devlink_rate_notify(rate_node, DEVLINK_CMD_RATE_NEW); + devl_rate_unlock(devlink, rate_devlink); } =20 void devlink_rates_notify_unregister(struct devlink *devlink) { struct devlink_rate *rate_node; + struct devlink *rate_devlink; =20 - list_for_each_entry_reverse(rate_node, &devlink->rate_list, list) - devlink_rate_notify(rate_node, DEVLINK_CMD_RATE_DEL); + rate_devlink =3D devl_rate_lock(devlink); + list_for_each_entry_reverse(rate_node, &rate_devlink->rate_list, list) + if (rate_node->devlink =3D=3D devlink) + devlink_rate_notify(rate_node, DEVLINK_CMD_RATE_DEL); + devl_rate_unlock(devlink, rate_devlink); } =20 static int @@ -209,17 +236,20 @@ devlink_nl_rate_get_dump_one(struct sk_buff *msg, str= uct devlink *devlink, { struct devlink_nl_dump_state *state =3D devlink_dump_state(cb); struct devlink_rate *devlink_rate; + struct devlink *rate_devlink; int idx =3D 0; int err =3D 0; =20 - list_for_each_entry(devlink_rate, &devlink->rate_list, list) { + rate_devlink =3D devl_rate_lock(devlink); + list_for_each_entry(devlink_rate, &rate_devlink->rate_list, list) { enum devlink_command cmd =3D DEVLINK_CMD_RATE_NEW; u32 id =3D NETLINK_CB(cb->skb).portid; =20 - if (idx < state->idx) { + if (idx < state->idx || devlink_rate->devlink !=3D devlink) { idx++; continue; } + err =3D devlink_nl_rate_fill(msg, devlink_rate, cmd, id, cb->nlh->nlmsg_seq, flags, NULL); if (err) { @@ -228,6 +258,7 @@ devlink_nl_rate_get_dump_one(struct sk_buff *msg, struc= t devlink *devlink, } idx++; } + devl_rate_unlock(devlink, rate_devlink); =20 return err; } @@ -239,28 +270,38 @@ int devlink_nl_rate_get_dumpit(struct sk_buff *skb, s= truct netlink_callback *cb) =20 int devlink_nl_rate_get_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; + struct devlink *rate_devlink, *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_rate *devlink_rate; struct sk_buff *msg; int err; =20 - devlink_rate =3D devlink_rate_get_from_info(devlink, info); - if (IS_ERR(devlink_rate)) - return PTR_ERR(devlink_rate); + rate_devlink =3D devl_rate_lock(devlink); + devlink_rate =3D devlink_rate_get_from_info(rate_devlink, devlink, info); + if (IS_ERR(devlink_rate)) { + err =3D PTR_ERR(devlink_rate); + goto unlock; + } =20 msg =3D nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); - if (!msg) - return -ENOMEM; + if (!msg) { + err =3D -ENOMEM; + goto unlock; + } =20 err =3D devlink_nl_rate_fill(msg, devlink_rate, DEVLINK_CMD_RATE_NEW, info->snd_portid, info->snd_seq, 0, info->extack); - if (err) { - nlmsg_free(msg); - return err; - } + if (err) + goto err_fill; =20 + devl_rate_unlock(devlink, rate_devlink); return genlmsg_reply(msg, info); + +err_fill: + nlmsg_free(msg); +unlock: + devl_rate_unlock(devlink, rate_devlink); + return err; } =20 static bool @@ -277,6 +318,7 @@ devlink_rate_is_parent_node(struct devlink_rate *devlin= k_rate, =20 static int devlink_nl_rate_parent_node_set(struct devlink_rate *devlink_rate, + struct devlink *rate_devlink, struct genl_info *info, struct nlattr *nla_parent) { @@ -304,7 +346,8 @@ devlink_nl_rate_parent_node_set(struct devlink_rate *de= vlink_rate, refcount_dec(&parent->refcnt); devlink_rate->parent =3D NULL; } else if (len) { - parent =3D devlink_rate_node_get_by_name(devlink, parent_name); + parent =3D devlink_rate_node_get_by_name(rate_devlink, devlink, + parent_name); if (IS_ERR(parent)) return -ENODEV; =20 @@ -423,6 +466,7 @@ static int devlink_nl_rate_tc_bw_set(struct devlink_rat= e *devlink_rate, } =20 static int devlink_nl_rate_set(struct devlink_rate *devlink_rate, + struct devlink *rate_devlink, const struct devlink_ops *ops, struct genl_info *info) { @@ -497,7 +541,8 @@ static int devlink_nl_rate_set(struct devlink_rate *dev= link_rate, */ nla_parent =3D attrs[DEVLINK_ATTR_RATE_PARENT_NODE_NAME]; if (nla_parent) { - err =3D devlink_nl_rate_parent_node_set(devlink_rate, info, + err =3D devlink_nl_rate_parent_node_set(devlink_rate, + rate_devlink, info, nla_parent); if (err) return err; @@ -588,29 +633,37 @@ static bool devlink_rate_set_ops_supported(const stru= ct devlink_ops *ops, =20 int devlink_nl_rate_set_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; + struct devlink *rate_devlink, *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_rate *devlink_rate; const struct devlink_ops *ops; int err; =20 - devlink_rate =3D devlink_rate_get_from_info(devlink, info); - if (IS_ERR(devlink_rate)) - return PTR_ERR(devlink_rate); + rate_devlink =3D devl_rate_lock(devlink); + devlink_rate =3D devlink_rate_get_from_info(rate_devlink, devlink, info); + if (IS_ERR(devlink_rate)) { + err =3D PTR_ERR(devlink_rate); + goto unlock; + } =20 ops =3D devlink->ops; - if (!ops || !devlink_rate_set_ops_supported(ops, info, devlink_rate->type= )) - return -EOPNOTSUPP; + if (!ops || + !devlink_rate_set_ops_supported(ops, info, devlink_rate->type)) { + err =3D -EOPNOTSUPP; + goto unlock; + } =20 - err =3D devlink_nl_rate_set(devlink_rate, ops, info); + err =3D devlink_nl_rate_set(devlink_rate, rate_devlink, ops, info); =20 if (!err) devlink_rate_notify(devlink_rate, DEVLINK_CMD_RATE_NEW); +unlock: + devl_rate_unlock(devlink, rate_devlink); return err; } =20 int devlink_nl_rate_new_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; + struct devlink *rate_devlink, *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_rate *rate_node; const struct devlink_ops *ops; int err; @@ -624,15 +677,22 @@ int devlink_nl_rate_new_doit(struct sk_buff *skb, str= uct genl_info *info) if (!devlink_rate_set_ops_supported(ops, info, DEVLINK_RATE_TYPE_NODE)) return -EOPNOTSUPP; =20 - rate_node =3D devlink_rate_node_get_from_attrs(devlink, info->attrs); - if (!IS_ERR(rate_node)) - return -EEXIST; - else if (rate_node =3D=3D ERR_PTR(-EINVAL)) - return -EINVAL; + rate_devlink =3D devl_rate_lock(devlink); + rate_node =3D devlink_rate_node_get_from_attrs(rate_devlink, devlink, + info->attrs); + if (!IS_ERR(rate_node)) { + err =3D -EEXIST; + goto unlock; + } else if (rate_node =3D=3D ERR_PTR(-EINVAL)) { + err =3D -EINVAL; + goto unlock; + } =20 rate_node =3D kzalloc_obj(*rate_node); - if (!rate_node) - return -ENOMEM; + if (!rate_node) { + err =3D -ENOMEM; + goto unlock; + } =20 rate_node->devlink =3D devlink; rate_node->type =3D DEVLINK_RATE_TYPE_NODE; @@ -646,13 +706,14 @@ int devlink_nl_rate_new_doit(struct sk_buff *skb, str= uct genl_info *info) if (err) goto err_node_new; =20 - err =3D devlink_nl_rate_set(rate_node, ops, info); + err =3D devlink_nl_rate_set(rate_node, rate_devlink, ops, info); if (err) goto err_rate_set; =20 refcount_set(&rate_node->refcnt, 1); - list_add(&rate_node->list, &devlink->rate_list); + list_add(&rate_node->list, &rate_devlink->rate_list); devlink_rate_notify(rate_node, DEVLINK_CMD_RATE_NEW); + devl_rate_unlock(devlink, rate_devlink); return 0; =20 err_rate_set: @@ -661,22 +722,29 @@ int devlink_nl_rate_new_doit(struct sk_buff *skb, str= uct genl_info *info) kfree(rate_node->name); err_strdup: kfree(rate_node); +unlock: + devl_rate_unlock(devlink, rate_devlink); return err; } =20 int devlink_nl_rate_del_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *devlink =3D devlink_nl_ctx(info)->devlink; + struct devlink *rate_devlink, *devlink =3D devlink_nl_ctx(info)->devlink; struct devlink_rate *rate_node; int err; =20 - rate_node =3D devlink_rate_node_get_from_info(devlink, info); - if (IS_ERR(rate_node)) - return PTR_ERR(rate_node); + rate_devlink =3D devl_rate_lock(devlink); + rate_node =3D devlink_rate_node_get_from_info(rate_devlink, devlink, + info); + if (IS_ERR(rate_node)) { + err =3D PTR_ERR(rate_node); + goto unlock; + } =20 if (refcount_read(&rate_node->refcnt) > 1) { NL_SET_ERR_MSG(info->extack, "Node has children. Cannot delete node."); - return -EBUSY; + err =3D -EBUSY; + goto unlock; } =20 devlink_rate_notify(rate_node, DEVLINK_CMD_RATE_DEL); @@ -687,6 +755,8 @@ int devlink_nl_rate_del_doit(struct sk_buff *skb, struc= t genl_info *info) list_del(&rate_node->list); kfree(rate_node->name); kfree(rate_node); +unlock: + devl_rate_unlock(devlink, rate_devlink); return err; } =20 @@ -695,14 +765,20 @@ int devlink_rates_check(struct devlink *devlink, struct netlink_ext_ack *extack) { struct devlink_rate *devlink_rate; + struct devlink *rate_devlink; + int err =3D 0; =20 - list_for_each_entry(devlink_rate, &devlink->rate_list, list) - if (!rate_filter || rate_filter(devlink_rate)) { + rate_devlink =3D devl_rate_lock(devlink); + list_for_each_entry(devlink_rate, &rate_devlink->rate_list, list) + if (devlink_rate->devlink =3D=3D devlink && + (!rate_filter || rate_filter(devlink_rate))) { if (extack) NL_SET_ERR_MSG(extack, "Rate node(s) exists."); - return -EBUSY; + err =3D -EBUSY; + break; } - return 0; + devl_rate_unlock(devlink, rate_devlink); + return err; } =20 /** @@ -719,14 +795,21 @@ devl_rate_node_create(struct devlink *devlink, void *= priv, char *node_name, struct devlink_rate *parent) { struct devlink_rate *rate_node; - - rate_node =3D devlink_rate_node_get_by_name(devlink, node_name); - if (!IS_ERR(rate_node)) - return ERR_PTR(-EEXIST); + struct devlink *rate_devlink; + + rate_devlink =3D devl_rate_lock(devlink); + rate_node =3D devlink_rate_node_get_by_name(rate_devlink, devlink, + node_name); + if (!IS_ERR(rate_node)) { + rate_node =3D ERR_PTR(-EEXIST); + goto unlock; + } =20 rate_node =3D kzalloc_obj(*rate_node); - if (!rate_node) - return ERR_PTR(-ENOMEM); + if (!rate_node) { + rate_node =3D ERR_PTR(-ENOMEM); + goto unlock; + } =20 rate_node->type =3D DEVLINK_RATE_TYPE_NODE; rate_node->devlink =3D devlink; @@ -735,7 +818,8 @@ devl_rate_node_create(struct devlink *devlink, void *pr= iv, char *node_name, rate_node->name =3D kstrdup(node_name, GFP_KERNEL); if (!rate_node->name) { kfree(rate_node); - return ERR_PTR(-ENOMEM); + rate_node =3D ERR_PTR(-ENOMEM); + goto unlock; } =20 if (parent) { @@ -744,8 +828,10 @@ devl_rate_node_create(struct devlink *devlink, void *p= riv, char *node_name, } =20 refcount_set(&rate_node->refcnt, 1); - list_add(&rate_node->list, &devlink->rate_list); + list_add(&rate_node->list, &rate_devlink->rate_list); devlink_rate_notify(rate_node, DEVLINK_CMD_RATE_NEW); +unlock: + devl_rate_unlock(devlink, rate_devlink); return rate_node; } EXPORT_SYMBOL_GPL(devl_rate_node_create); @@ -761,10 +847,10 @@ EXPORT_SYMBOL_GPL(devl_rate_node_create); int devl_rate_leaf_create(struct devlink_port *devlink_port, void *priv, struct devlink_rate *parent) { - struct devlink *devlink =3D devlink_port->devlink; + struct devlink *rate_devlink, *devlink =3D devlink_port->devlink; struct devlink_rate *devlink_rate; =20 - devl_assert_locked(devlink_port->devlink); + devl_assert_locked(devlink); =20 if (WARN_ON(devlink_port->devlink_rate)) return -EBUSY; @@ -773,6 +859,7 @@ int devl_rate_leaf_create(struct devlink_port *devlink_= port, void *priv, if (!devlink_rate) return -ENOMEM; =20 + rate_devlink =3D devl_rate_lock(devlink); if (parent) { devlink_rate->parent =3D parent; refcount_inc(&devlink_rate->parent->refcnt); @@ -782,9 +869,10 @@ int devl_rate_leaf_create(struct devlink_port *devlink= _port, void *priv, devlink_rate->devlink =3D devlink; devlink_rate->devlink_port =3D devlink_port; devlink_rate->priv =3D priv; - list_add_tail(&devlink_rate->list, &devlink->rate_list); + list_add_tail(&devlink_rate->list, &rate_devlink->rate_list); devlink_port->devlink_rate =3D devlink_rate; devlink_rate_notify(devlink_rate, DEVLINK_CMD_RATE_NEW); + devl_rate_unlock(devlink, rate_devlink); =20 return 0; } @@ -800,16 +888,19 @@ EXPORT_SYMBOL_GPL(devl_rate_leaf_create); void devl_rate_leaf_destroy(struct devlink_port *devlink_port) { struct devlink_rate *devlink_rate =3D devlink_port->devlink_rate; + struct devlink *rate_devlink, *devlink =3D devlink_port->devlink; =20 - devl_assert_locked(devlink_port->devlink); + devl_assert_locked(devlink); if (!devlink_rate) return; =20 + rate_devlink =3D devl_rate_lock(devlink); devlink_rate_notify(devlink_rate, DEVLINK_CMD_RATE_DEL); if (devlink_rate->parent) refcount_dec(&devlink_rate->parent->refcnt); list_del(&devlink_rate->list); devlink_port->devlink_rate =3D NULL; + devl_rate_unlock(devlink, rate_devlink); kfree(devlink_rate); } EXPORT_SYMBOL_GPL(devl_rate_leaf_destroy); @@ -818,20 +909,30 @@ EXPORT_SYMBOL_GPL(devl_rate_leaf_destroy); * devl_rate_nodes_destroy - destroy all devlink rate nodes on device * @devlink: devlink instance * - * Unset parent for all rate objects and destroy all rate nodes - * on specified device. + * Unset parent for all rate objects involving this device and destroy all= rate + * nodes on it. */ void devl_rate_nodes_destroy(struct devlink *devlink) { - const struct devlink_ops *ops =3D devlink->ops; struct devlink_rate *devlink_rate, *tmp; + const struct devlink_ops *ops; + struct devlink *rate_devlink; =20 devl_assert_locked(devlink); + rate_devlink =3D devl_rate_lock(devlink); =20 - list_for_each_entry(devlink_rate, &devlink->rate_list, list) { - if (!devlink_rate->parent) + list_for_each_entry(devlink_rate, &rate_devlink->rate_list, list) { + if (!devlink_rate->parent || + (devlink_rate->devlink !=3D devlink && + devlink_rate->parent->devlink !=3D devlink)) continue; =20 + /* This could destroy rate objects on other devlinks in the + * same hierarchy under 'rate_devlink'. This is safe because + * the shared common ancestor is locked so there can be no + * other concurrent rate operations on devlink_rate->devlink. + */ + ops =3D devlink_rate->devlink->ops; if (devlink_rate_is_leaf(devlink_rate)) ops->rate_leaf_parent_set(devlink_rate, NULL, devlink_rate->priv, NULL, NULL); @@ -842,13 +943,17 @@ void devl_rate_nodes_destroy(struct devlink *devlink) refcount_dec(&devlink_rate->parent->refcnt); devlink_rate->parent =3D NULL; } - list_for_each_entry_safe(devlink_rate, tmp, &devlink->rate_list, list) { - if (devlink_rate_is_node(devlink_rate)) { + ops =3D devlink->ops; + list_for_each_entry_safe(devlink_rate, tmp, &rate_devlink->rate_list, + list) { + if (devlink_rate->devlink =3D=3D devlink && + devlink_rate_is_node(devlink_rate)) { ops->rate_node_del(devlink_rate, devlink_rate->priv, NULL); list_del(&devlink_rate->list); kfree(devlink_rate->name); kfree(devlink_rate); } } + devl_rate_unlock(devlink, rate_devlink); } EXPORT_SYMBOL_GPL(devl_rate_nodes_destroy); --=20 2.44.0 From nobody Wed Jul 1 16:10:59 2026 Received: from BN1PR04CU002.outbound.protection.outlook.com (mail-eastus2azon11010004.outbound.protection.outlook.com [52.101.56.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 787E828C2BF; Wed, 1 Jul 2026 07:34:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.56.4 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891289; cv=fail; b=jzSZs5/tSvnokNIuEnoNu2QdSUwfIgqyNAVuuVZMmJ4+Yp2UJfsNh594Ra+On7obEBuVZAfuY3ZOEpf22FXFhvelV6gmP59pJEWbVV2I8/eUn51Cb+1lOYGrqgz2a+QdasdGyA2ZD6nGDfQpbuvjnSwl7NYimxU/Xr9oN9A1GLk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891289; c=relaxed/simple; bh=p7IpDsna3Ov6RA2NW2CnsU0KLvXxvm5/oLLnX+s0I80=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=DsYkY/vVnCTwCz2bz9JtYbnvq6jUNGNKeUKyt04agaV1qkYRaasVNNQVU/6hvBiqFPMM/z8b37W9hE7C5pd8xfScvp2ZJ88Sn11NbHYCmpZ4y6gTl9q68AV4IyJsnw2bJw+flQKy6nlxFqXrUB625vyM7DkxIZDSw+3aICML2LU= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=d3Tg/qtz; arc=fail smtp.client-ip=52.101.56.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="d3Tg/qtz" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=IkJdQxw35v/FrGvkVwEo1kQsIQ4sHtDfYOtL3icThYKfMGO8RFRErbbnqi0QUHNncH6NuzR1tIFARk9vbzF2aiBc+Hxb1/xFR7ljBi9ZhQDl70Ip5bEn2So3sr+g9eXYcMSsOOgh8NySlxZIcFckSD0KnSqkZVTnKhqTlv1EmI1QksIYILc28OlUvoYL5ALcsLwqy4CTP3vPjy2OtiA5Vlja9nW7BFx3AQqNl9T9a0+WVFzJ68csbbUek52dIzWZjZTSdlkWwuwOTAYOUBCrBEXqOYxIV6FaK6XsqmLLTnqpzzQpbD7ruV7MyGirE4X1cxqXSnWns6beN+V3wJpmiw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=oHLYi8dcw2pV79qluL5W/rwwza7CbhC0qkhc/cecEBA=; b=fNS2VPzvgl/1xLwTyUVo4nqlTyCi/Z30nCfN8r9Id53Redoxby8qnJix4B+ExmQD3OmRkkkiN1UAlkjJHvlmw1wxx5Pvbj4y7MTNPfB9zkkVTY0KCoPQpGgd0Fzkj0PuF8M70cJ62jLfBEzBDm2eHrNlMK5ZUkhXsLePBh3ivG2pMSBwUpLTS3L4iul2EcciYaKA/moELuTeADMD/rdGpE60NyKENdaPlUGNT/PmhVJpMf7ZZueDRBN+N+ZsbWhNk/ge7E3sXDOuUq7/MAbOK+S2FOwjyD4mfnR3uLDCo9z7OI3Jo7zN5EoddFvU7RFvTBi7YE/u5BAm6Bno7LZ4fg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=lunn.ch 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=oHLYi8dcw2pV79qluL5W/rwwza7CbhC0qkhc/cecEBA=; b=d3Tg/qtz+YPnMNDuMKANqUdzo5SpU7bRs5134Vqt5x0bKiNnZGOZllAHWXUWFSag/cNyaAy4swKq7NujR0fFwsDRsylNPVEXNltbfQMwxx0gKE+0qI+/Am6SkJIUEQ7t9Z08SlRDxhpLFmERq8k8mIKAKyBQeJM2mv8dY/6lPys9iXI0bZvtChsEXJ98SRFjwkCDsbeJpB2iIELZnJVSOunCQiU8HJcEtb8nIcOipOABXWr/g1Dgj/AajipTtpxaiu0sbQoaIDTsozIr3GCWYLX/1DNnOhmBTdv5a3wjupSkZJ4FiAm4Lpir1UEWY9yzMsLm1MZNJ5MobNeiDZO1bw== Received: from DS7PR07CA0012.namprd07.prod.outlook.com (2603:10b6:5:3af::20) by DS0PR12MB7827.namprd12.prod.outlook.com (2603:10b6:8:146::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.8; Wed, 1 Jul 2026 07:34:39 +0000 Received: from DS1PEPF00017095.namprd03.prod.outlook.com (2603:10b6:5:3af:cafe::4) by DS7PR07CA0012.outlook.office365.com (2603:10b6:5:3af::20) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.181.9 via Frontend Transport; Wed, 1 Jul 2026 07:34:39 +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 DS1PEPF00017095.mail.protection.outlook.com (10.167.17.138) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.6 via Frontend Transport; Wed, 1 Jul 2026 07:34:38 +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.2562.20; Wed, 1 Jul 2026 00:34:14 -0700 Received: from rnnvmail201.nvidia.com (10.129.68.8) 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.2562.20; Wed, 1 Jul 2026 00:34:14 -0700 Received: from vdi.nvidia.com (10.127.8.10) by mail.nvidia.com (10.129.68.8) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Wed, 1 Jul 2026 00:34:04 -0700 From: Tariq Toukan To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , , Paolo Abeni CC: Adithya Jayachandran , Bobby Eshleman , Carolina Jubran , Cosmin Ratiu , Daniel Borkmann , Daniel Jurgens , Daniel Zahka , David Wei , Donald Hunter , Dragos Tatulea , Jiri Pirko , Jiri Pirko , Joe Damato , Jonathan Corbet , Kees Cook , Leon Romanovsky , , , , , Mark Bloch , Moshe Shemesh , Or Har-Toov , Parav Pandit , Petr Machata , Ratheesh Kannoth , Saeed Mahameed , Shahar Shitrit , Shay Drori , Shuah Khan , Shuah Khan , Simon Horman , Stanislav Fomichev , Tariq Toukan , Willem de Bruijn , Gal Pressman Subject: [PATCH net-next V10 05/14] devlink: Add parent dev to devlink API Date: Wed, 1 Jul 2026 10:32:45 +0300 Message-ID: <20260701073254.754518-6-tariqt@nvidia.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20260701073254.754518-1-tariqt@nvidia.com> References: <20260701073254.754518-1-tariqt@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS1PEPF00017095:EE_|DS0PR12MB7827:EE_ X-MS-Office365-Filtering-Correlation-Id: 1dd0662e-621f-4c7d-b35f-08ded7433543 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|1800799024|7416014|376014|82310400026|36860700016|22082099003|18002099003|3023799007|11063799006|56012099006|6133799003; X-Microsoft-Antispam-Message-Info: OSaRHLEImoziKbzqMruD1nbaqWDaHwfrL4t+gUEBpiVMUbTXc/wvqri6mkzaZesSl//noQYRFW9iCuccNLGbdmd1CnQOAsGiRYqxAJPE7P8PSje7CR7++sK3xKhzJxg9YLdBYc0ITF0LYvRfvFyWon9D4nmQGG9KTSp5aBDgsECCEB8ZI1LRuStRRR2jLU6Mu9ckRIYu0rcOXByvGLmie7xcs46re67T+CZziCUgfwy7w+5SeoBG3Ih53jfHp2wucu5N4bVITRnJTNVD5iyqZqcGlToe1IzKGI3NbsqwRgKJ8aVfM3rQLZgBwxvA841WBSEeEBaqi69Ghjw/mcbRf2fkhMJk81jf/mc183y6snDvAHJ8pR+K40GghvWBA88AoiMOuRSSrb1DpRsERJbB8/TpEW+z7fF/vJjy8HqzAk8Ds6Of6HYtgqmRcIlYYogJfG9N5PITddCwgpo6hp/jRTZktqL0ybJNUvZ42LQh90QsiHndVYgxyMxtM/0FFPhadcJ0mwXMT7mxQw9FxTbSBEVoxjlV1MxrCAs5rA94Ns67BrecuS/HFig3RaF+4va7/LHJeJf//PWy4rozTaABjdgSQFivZl5vBJssD0CWlnUTIsJ0Dkyr+ZyWab8jJ30AR/c66EmavGpaNK/09OBLyR2wkSCg5uxkBpBIl/ivMS1Aq/GS0JkVS75ZSkWXcz8dNWQ51whnQCFL9egYomwKBg== 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)(23010399003)(1800799024)(7416014)(376014)(82310400026)(36860700016)(22082099003)(18002099003)(3023799007)(11063799006)(56012099006)(6133799003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Ux93eM1ytoTaFlKBWqU/IC0e75EFuAjEkpcqip9IcZDobh00dZZFV9fF/A0GRjRCMB66HFsWIoWB3SIpqaXIxnWRnqXkxKlV4hvcwsQWibpG0W/Bkn/0zBQABWRm5i3dA2WpSMIOUomZjrUBrEhdSk9+LY+SbBM0Gy7zaq7jZ5M/vshiRbUNWHbjbtGHVxvnvGhqPTRfyPpZJOtRcLHsQcWcsa2od5Ih2cam0ExHj03Sw5HREmCByqISGcGWj1LqL6BSzx9HSEbTxzScjN+3Q/dZbxA3uQLMZbROg970leHQfNcGiW0jk6NEPVlL7FS8OFio0mV+opWHV6xqcDGRl5mSQ1xB7LavY3AWLn956UUlnMPP2WeWMVQtMWm3+2hp1CA791tc/sOhcTjZf6ef4n9hvLwYWqd9qI/zmck0o9aTObLbLDB7HdmilP+bRGHI X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Jul 2026 07:34:38.7375 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 1dd0662e-621f-4c7d-b35f-08ded7433543 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: DS1PEPF00017095.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB7827 Content-Type: text/plain; charset="utf-8" From: Cosmin Ratiu Upcoming changes to the rate commands need the parent devlink specified. This change adds a nested 'parent-dev' attribute to the API and helpers to obtain and put a reference to the parent devlink instance in info->ctx. To avoid deadlocks, the parent devlink is unlocked before obtaining the main devlink instance that is the target of the request. A reference to the parent is kept until the end of the request to avoid it suddenly disappearing. This means that this reference is of limited use without additional protection. Signed-off-by: Cosmin Ratiu Reviewed-by: Carolina Jubran Reviewed-by: Jiri Pirko Signed-off-by: Tariq Toukan --- Documentation/netlink/specs/devlink.yaml | 20 +++++++++++++ include/uapi/linux/devlink.h | 2 ++ net/devlink/devl_internal.h | 3 ++ net/devlink/netlink.c | 36 ++++++++++++++++++++---- 4 files changed, 56 insertions(+), 5 deletions(-) diff --git a/Documentation/netlink/specs/devlink.yaml b/Documentation/netli= nk/specs/devlink.yaml index 52ad1e7805d1..13d960b3abb1 100644 --- a/Documentation/netlink/specs/devlink.yaml +++ b/Documentation/netlink/specs/devlink.yaml @@ -895,6 +895,16 @@ attribute-sets: resource-dump response. Bit 0 (dev) selects device-level resources; bit 1 (port) selects port-level resources. When absent all classes are returned. + - + name: parent-dev + type: nest + nested-attributes: dl-parent-dev + doc: | + Identifies the devlink instance which owns the parent rate node. + Used with rate-set and rate-new to parent a rate object to a nod= e on + a different devlink instance, enabling cross-device rate schedul= ing. + When absent, the parent node is resolved on the same instance. + - name: dl-dev-stats subset-of: devlink @@ -1317,6 +1327,16 @@ attribute-sets: Specifies the bandwidth share assigned to the Traffic Class. The bandwidth for the traffic class is determined in proportion to the sum of the shares of all configured clas= ses. + - + name: dl-parent-dev + subset-of: devlink + attributes: + - + name: bus-name + - + name: dev-name + - + name: index =20 operations: enum-model: directional diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h index ca713bcc47b9..a6801feb7744 100644 --- a/include/uapi/linux/devlink.h +++ b/include/uapi/linux/devlink.h @@ -648,6 +648,8 @@ enum devlink_attr { DEVLINK_ATTR_INDEX, /* uint */ DEVLINK_ATTR_RESOURCE_SCOPE_MASK, /* u32 */ =20 + DEVLINK_ATTR_PARENT_DEV, /* nested */ + /* Add new attributes above here, update the spec in * Documentation/netlink/specs/devlink.yaml and re-generate * net/devlink/netlink_gen.c. diff --git a/net/devlink/devl_internal.h b/net/devlink/devl_internal.h index 52c8bf359dd4..cdf894ba5a9d 100644 --- a/net/devlink/devl_internal.h +++ b/net/devlink/devl_internal.h @@ -154,6 +154,7 @@ int devlink_rel_devlink_handle_put(struct sk_buff *msg,= struct devlink *devlink, struct devlink_nl_ctx { struct devlink *devlink; struct devlink_port *devlink_port; + struct devlink *parent_devlink; }; =20 static inline struct devlink_nl_ctx * @@ -197,6 +198,8 @@ typedef int devlink_nl_dump_one_func_t(struct sk_buff *= msg, struct devlink * devlink_get_from_attrs_lock(struct net *net, struct nlattr **attrs, bool dev_lock); +struct devlink * +devlink_get_parent_from_attrs_lock(struct net *net, struct nlattr **attrs); =20 int devlink_nl_dumpit(struct sk_buff *msg, struct netlink_callback *cb, devlink_nl_dump_one_func_t *dump_one); diff --git a/net/devlink/netlink.c b/net/devlink/netlink.c index f0a857e286bc..5a057dc86b0f 100644 --- a/net/devlink/netlink.c +++ b/net/devlink/netlink.c @@ -12,6 +12,7 @@ #define DEVLINK_NL_FLAG_NEED_PORT BIT(0) #define DEVLINK_NL_FLAG_NEED_DEVLINK_OR_PORT BIT(1) #define DEVLINK_NL_FLAG_NEED_DEV_LOCK BIT(2) +#define DEVLINK_NL_FLAG_OPTIONAL_PARENT_DEV BIT(3) =20 static const struct genl_multicast_group devlink_nl_mcgrps[] =3D { [DEVLINK_MCGRP_CONFIG] =3D { .name =3D DEVLINK_GENL_MCGRP_CONFIG_NAME }, @@ -239,19 +240,39 @@ devlink_get_from_attrs_lock(struct net *net, struct n= lattr **attrs, return ERR_PTR(-ENODEV); } =20 +struct devlink * +devlink_get_parent_from_attrs_lock(struct net *net, struct nlattr **attrs) +{ + return ERR_PTR(-EOPNOTSUPP); +} + static int __devlink_nl_pre_doit(struct sk_buff *skb, struct genl_info *in= fo, u8 flags) { + bool parent_dev =3D flags & DEVLINK_NL_FLAG_OPTIONAL_PARENT_DEV; bool dev_lock =3D flags & DEVLINK_NL_FLAG_NEED_DEV_LOCK; + struct devlink *devlink, *parent_devlink =3D NULL; + struct net *net =3D genl_info_net(info); + struct nlattr **attrs =3D info->attrs; struct devlink_port *devlink_port; - struct devlink *devlink; int err; =20 - devlink =3D devlink_get_from_attrs_lock(genl_info_net(info), info->attrs, - dev_lock); - if (IS_ERR(devlink)) - return PTR_ERR(devlink); + if (parent_dev && attrs[DEVLINK_ATTR_PARENT_DEV]) { + parent_devlink =3D devlink_get_parent_from_attrs_lock(net, attrs); + if (IS_ERR(parent_devlink)) + return PTR_ERR(parent_devlink); + devlink_nl_ctx(info)->parent_devlink =3D parent_devlink; + /* Drop the parent devlink lock but don't release the reference. + * This will keep it alive until the end of the request. + */ + devl_unlock(parent_devlink); + } =20 + devlink =3D devlink_get_from_attrs_lock(net, attrs, dev_lock); + if (IS_ERR(devlink)) { + err =3D PTR_ERR(devlink); + goto parent_put; + } devlink_nl_ctx(info)->devlink =3D devlink; if (flags & DEVLINK_NL_FLAG_NEED_PORT) { devlink_port =3D devlink_port_get_from_info(devlink, info); @@ -270,6 +291,9 @@ static int __devlink_nl_pre_doit(struct sk_buff *skb, s= truct genl_info *info, unlock: devl_dev_unlock(devlink, dev_lock); devlink_put(devlink); +parent_put: + if (parent_dev && parent_devlink) + devlink_put(parent_devlink); return err; } =20 @@ -307,6 +331,8 @@ static void __devlink_nl_post_doit(struct sk_buff *skb,= struct genl_info *info, devlink =3D devlink_nl_ctx(info)->devlink; devl_dev_unlock(devlink, dev_lock); devlink_put(devlink); + if (devlink_nl_ctx(info)->parent_devlink) + devlink_put(devlink_nl_ctx(info)->parent_devlink); } =20 void devlink_nl_post_doit(const struct genl_split_ops *ops, --=20 2.44.0 From nobody Wed Jul 1 16:10:59 2026 Received: from SN4PR0501CU005.outbound.protection.outlook.com (mail-southcentralusazon11011033.outbound.protection.outlook.com [40.93.194.33]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 773613B6BF7; Wed, 1 Jul 2026 07:34:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.194.33 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891301; cv=fail; b=KBojxIDHvmiDGEwBelB/tK1wNJfEYSI5vQ0po7N+/BJ7JtFkbLI6XjYS0hfpE4woFe83gwE8yEPYr8ZEtZCZUrN4isv9dLQZae9gIAsLKYZQVZhtOss8BQq5TxMW9U3fAPoaCk0w1IxfeFaK69Z+HprDFRYIJksjYhynyE1KRR4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891301; c=relaxed/simple; bh=BeibnZzFAZcTglLiYwhmBRTeTJiyGt+Lv5fgztT7ft8=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=UzMUJpAOK/1XsfIbC61DnsCevKthTmaeUvW2bU6rhvDfVbI905wYL9gwk8r0PBKSjsMyGy6nTSrSB27hRVtSzAwnXHQNWDy+Ii/zKZt5e59HIOT+GzJ8vcFZmyf638SMZiYPNPvcDQwcrPNvJELpm8r7BKAX0w0KJGrvGzQC8uM= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=njYxvkqS; arc=fail smtp.client-ip=40.93.194.33 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="njYxvkqS" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=QH3P0k0hIvdUqoz3ovllG84gjMnAp8Wbc7VwUhNbHktaIP/vVsPTV8bii5ZnpfHZl7IzLx+DJMRimwFIxZrrzaMNxKHTgJqrW7ws7TR5bMdMkaebtawiWcJUN4a+T1FJ4WFt/EzFE7N2W1wRvEVMlwS70yD74byMo/F138jryP7AZ7wUPf1kgaF4xNCthOFFKaa6DEK+hgAoF8pjG3nN8khHijqZdU3kjc1MYjiA9ZVvdpTbpl6i7iO4W+8S1i4fzp2SdWZjWigQjpF02LGIHquho9ei0e9cypnCjMCpwWLHTAB9oepc05Pl1IjKLjpV6E1dwR4sIDHbLri1sRYjbQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=Ti/gHfiOTh1r8TNHBnp3PXz7HqN0+6MedjYlgJ5KE3Q=; b=Vl0G5LNKMd20uiJoT0nMMTc/U1XvQohHXtRCYtSBvtsji6WnvXTcJnXhd+7t/kLC+9PdN3Eej2AOH4lrRx0rn3rK1SpZo/YX+DeWCzGCUoWJB2h9kN0TzMnmvoRIOG3pS4QO832faCpkHRh5mKQV0EMfUbFpo34sdHus9s6GhA94oXaMmnRLEu3/DDXCrbesjeBRXJSE8dtUmok8IUE/A8nxTczQpdR+FVCG5c1vZ5GBIAuIrDTIvxuO5C+4sqfzksFaRMZ0qLhv4KuuK43LSeZjdYl9tTMcIguSlVOTMGjphNMueorbFu4G+txEpe/AjORm92ZJ4AQlcG+YHgLqRw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=lunn.ch 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=Ti/gHfiOTh1r8TNHBnp3PXz7HqN0+6MedjYlgJ5KE3Q=; b=njYxvkqS+mSFf3ezXxhy8bHHNWfZWHHVBChjfBtiVXe5ToMea0AtTBvqyARSpkf/B/pKL9OY8stdodVTG0HY+zaWiycUdAUUYiubfL0GHE0Nbri+wgTE5MZa2gNzs38UaImK8AalT6IVy9fPf6QifRqV1pMnmApAjTh2WimEvIaFZ1YURsEdIvO+m+bBX/MCt2pCHWttnrZ24xSitlz0+GwI8ODss1OLH6LF9r5yP/eXcg21O6wILnTMeOJ6ZMPzNADT9ObIzS/3CsK1qXn2wa76NlHLiL/uIiFJYhYdPmGyrp8PBy4YlY1IaK/X5YxNrARBWzO/wNlHuB2RZORKOQ== Received: from DS7PR05CA0035.namprd05.prod.outlook.com (2603:10b6:8:2f::18) by DS0PR12MB8456.namprd12.prod.outlook.com (2603:10b6:8:161::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.8; Wed, 1 Jul 2026 07:34:48 +0000 Received: from DS1PEPF00017093.namprd03.prod.outlook.com (2603:10b6:8:2f:cafe::26) by DS7PR05CA0035.outlook.office365.com (2603:10b6:8:2f::18) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.181.8 via Frontend Transport; Wed, 1 Jul 2026 07:34:48 +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 DS1PEPF00017093.mail.protection.outlook.com (10.167.17.136) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.6 via Frontend Transport; Wed, 1 Jul 2026 07:34:47 +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.2562.20; Wed, 1 Jul 2026 00:34:25 -0700 Received: from rnnvmail201.nvidia.com (10.129.68.8) 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.2562.20; Wed, 1 Jul 2026 00:34:24 -0700 Received: from vdi.nvidia.com (10.127.8.10) by mail.nvidia.com (10.129.68.8) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Wed, 1 Jul 2026 00:34:14 -0700 From: Tariq Toukan To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , , Paolo Abeni CC: Adithya Jayachandran , Bobby Eshleman , Carolina Jubran , Cosmin Ratiu , Daniel Borkmann , Daniel Jurgens , Daniel Zahka , David Wei , Donald Hunter , Dragos Tatulea , Jiri Pirko , Jiri Pirko , Joe Damato , Jonathan Corbet , Kees Cook , Leon Romanovsky , , , , , Mark Bloch , Moshe Shemesh , Or Har-Toov , Parav Pandit , Petr Machata , Ratheesh Kannoth , Saeed Mahameed , Shahar Shitrit , Shay Drori , Shuah Khan , Shuah Khan , Simon Horman , Stanislav Fomichev , Tariq Toukan , Willem de Bruijn , Gal Pressman Subject: [PATCH net-next V10 06/14] devlink: Allow parent dev for rate-set and rate-new Date: Wed, 1 Jul 2026 10:32:46 +0300 Message-ID: <20260701073254.754518-7-tariqt@nvidia.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20260701073254.754518-1-tariqt@nvidia.com> References: <20260701073254.754518-1-tariqt@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS1PEPF00017093:EE_|DS0PR12MB8456:EE_ X-MS-Office365-Filtering-Correlation-Id: aca7660d-4b7c-4830-e581-08ded7433a8d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|23010399003|36860700016|1800799024|82310400026|6133799003|11063799006|56012099006|18002099003|22082099003|3023799007; X-Microsoft-Antispam-Message-Info: 4TQwBatp1ksdCXG99JL7UHyftkGPS3vmUWZXB6BwB9GddYodUlWY407x5F3+8TmTWuK5SEFDVt5hUrU9L/amDkJpY7X5jQ0HvxAYWSuDFztmU5MAansKHOnau0dHjirBiZd9QA1IKnGfj/H1UKEO+iaF0KcSJzUr2VN/y9GmmEEDlGYvOE9DObQOdwZ1W6iaeKPP7jyPzdvR0GjNm/wuz+8QUvhcyyoPsMR2S1FL50O20HAl6Ip8S2LycY4IrCfWsPQ1BsmDrJadKu0oyc07esE950b1rf4VR4Uqy8bFqJOwxfIajKe+nVkPjryECVhCpIyUXWd3np7Meni5iEfHNSv2hRthVVEc3+9AkrmC4BIClxdCvFY+AYcftgKUgJJE15NYlL6yITL311zrfqtUDvVEzMcr0vKT1WLCYrWhSeOpeU+txtPQYh6TSTbFjQMI341BN7RAi4UFbGJbFFei8C7I2KRVOq1Jp45Zbw92pk+6392xI6iaIsVmZ7YQ1SCEZYe/c1PLD2wl7Lj/DBlu14WISOcsU2BabsB3YJv4YHr/N0Py9Ucep76rtEliR8rLdLY1nCxYRs2S71YRIhUHW1/Gc1pjOmRqRIstDS1Y+ryr+kD5IAUTWeejI5pCg4vlN0Tp3nLkJqDNriYkitLAKjssCZoRkLH+/G5gaL0sTSP8revoqpGQzUtCiAVQgdpYH9OHPaFvkY4cc9THZlshXQ== 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)(7416014)(376014)(23010399003)(36860700016)(1800799024)(82310400026)(6133799003)(11063799006)(56012099006)(18002099003)(22082099003)(3023799007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: uZGTQAGF1YnrsJKBtM8DS5326GFoJV2JL1ooxaa0wQIJRLx46BBdPDbnvHjb3qL2hi5ZSsExb8i5QVJklJgi7dufSvcWgosAXN2WjPnsmhR2VZPx+l/cOqmJ4K24z9r5S9cr1cAy9BLGiaaSmoJ5vlJYpc7mw2ZF6zR31VYdvhRXqePH14T5I/fhHJy/yWk41Q+tH1tnum2ksoq95otF+FFsdZPY9Ysnpyd1zHJA46kFDU0VGZHT7uG/e+/cRIDeq745sIz6ZAnwYlbC4WVm954EzvvUDLh9eqE4HXhvXKyklamjOqR24DiqW/HjE2x2JxClzds6uIi6HmJ0z6ryQeCTd7EMPMRn/iXv0Yr+hMokHDEFt0/Tz8GKcXhYtznKIGjx1XmBTRNrzHqVQyjpEKnIyK+YouKtxTr1xgiybiCUaXBDPddA5VHbhnCkYVPr X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Jul 2026 07:34:47.5201 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: aca7660d-4b7c-4830-e581-08ded7433a8d 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: DS1PEPF00017093.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB8456 Content-Type: text/plain; charset="utf-8" From: Cosmin Ratiu Currently, a devlink rate's parent device is assumed to be the same as the one where the devlink rate is created. This patch changes that to allow rate commands to accept an additional argument that specifies the parent dev. This will allow devlink rate groups with leafs from other devices. Example of the new usage with ynl: Creating a group on pci/0000:08:00.1 with a parent to an already existing pci/0000:08:00.1/group1: ./tools/net/ynl/pyynl/cli.py --spec \ Documentation/netlink/specs/devlink.yaml --do rate-new --json '{ "bus-name": "pci", "dev-name": "0000:08:00.1", "rate-node-name": "group2", "rate-parent-node-name": "group1", "parent-dev": { "bus-name": "pci", "dev-name": "0000:08:00.1" } }' Setting the parent of leaf node pci/0000:08:00.1/65537 to pci/0000:08:00.0/group1: ./tools/net/ynl/pyynl/cli.py --spec \ Documentation/netlink/specs/devlink.yaml --do rate-set --json '{ "bus-name": "pci", "dev-name": "0000:08:00.1", "port-index": 65537, "parent-dev": { "bus-name": "pci", "dev-name": "0000:08:00.0" }, "rate-parent-node-name": "group1" }' Signed-off-by: Cosmin Ratiu Reviewed-by: Carolina Jubran Reviewed-by: Jiri Pirko Signed-off-by: Tariq Toukan --- Documentation/netlink/specs/devlink.yaml | 10 +++--- net/devlink/netlink.c | 40 +++++++++++++++++++++++- net/devlink/netlink_gen.c | 24 +++++++++----- net/devlink/netlink_gen.h | 8 +++++ net/devlink/rate.c | 4 ++- 5 files changed, 72 insertions(+), 14 deletions(-) diff --git a/Documentation/netlink/specs/devlink.yaml b/Documentation/netli= nk/specs/devlink.yaml index 13d960b3abb1..38b1190f3d26 100644 --- a/Documentation/netlink/specs/devlink.yaml +++ b/Documentation/netlink/specs/devlink.yaml @@ -2309,8 +2309,8 @@ operations: dont-validate: [strict] flags: [admin-perm] do: - pre: devlink-nl-pre-doit - post: devlink-nl-post-doit + pre: devlink-nl-pre-doit-parent-dev-optional + post: devlink-nl-post-doit-parent-dev-optional request: attributes: - bus-name @@ -2323,6 +2323,7 @@ operations: - rate-tx-weight - rate-parent-node-name - rate-tc-bws + - parent-dev =20 - name: rate-new @@ -2331,8 +2332,8 @@ operations: dont-validate: [strict] flags: [admin-perm] do: - pre: devlink-nl-pre-doit - post: devlink-nl-post-doit + pre: devlink-nl-pre-doit-parent-dev-optional + post: devlink-nl-post-doit-parent-dev-optional request: attributes: - bus-name @@ -2345,6 +2346,7 @@ operations: - rate-tx-weight - rate-parent-node-name - rate-tc-bws + - parent-dev =20 - name: rate-del diff --git a/net/devlink/netlink.c b/net/devlink/netlink.c index 5a057dc86b0f..300580c1a217 100644 --- a/net/devlink/netlink.c +++ b/net/devlink/netlink.c @@ -243,7 +243,29 @@ devlink_get_from_attrs_lock(struct net *net, struct nl= attr **attrs, struct devlink * devlink_get_parent_from_attrs_lock(struct net *net, struct nlattr **attrs) { - return ERR_PTR(-EOPNOTSUPP); + unsigned int maxtype =3D ARRAY_SIZE(devlink_dl_parent_dev_nl_policy) - 1; + struct devlink *devlink; + struct nlattr **tb; + int err; + + if (!attrs[DEVLINK_ATTR_PARENT_DEV]) + return ERR_PTR(-EINVAL); + + tb =3D kcalloc(maxtype + 1, sizeof(*tb), GFP_KERNEL); + if (!tb) + return ERR_PTR(-ENOMEM); + + err =3D nla_parse_nested(tb, maxtype, attrs[DEVLINK_ATTR_PARENT_DEV], + devlink_dl_parent_dev_nl_policy, NULL); + if (err) + goto out; + + devlink =3D devlink_get_from_attrs_lock(net, tb, false); + kfree(tb); + return devlink; +out: + kfree(tb); + return ERR_PTR(err); } =20 static int __devlink_nl_pre_doit(struct sk_buff *skb, struct genl_info *in= fo, @@ -322,6 +344,14 @@ int devlink_nl_pre_doit_port_optional(const struct gen= l_split_ops *ops, return __devlink_nl_pre_doit(skb, info, DEVLINK_NL_FLAG_NEED_DEVLINK_OR_P= ORT); } =20 +int devlink_nl_pre_doit_parent_dev_optional(const struct genl_split_ops *o= ps, + struct sk_buff *skb, + struct genl_info *info) +{ + return __devlink_nl_pre_doit(skb, info, + DEVLINK_NL_FLAG_OPTIONAL_PARENT_DEV); +} + static void __devlink_nl_post_doit(struct sk_buff *skb, struct genl_info *= info, u8 flags) { @@ -348,6 +378,14 @@ devlink_nl_post_doit_dev_lock(const struct genl_split_= ops *ops, __devlink_nl_post_doit(skb, info, DEVLINK_NL_FLAG_NEED_DEV_LOCK); } =20 +void +devlink_nl_post_doit_parent_dev_optional(const struct genl_split_ops *ops, + struct sk_buff *skb, + struct genl_info *info) +{ + __devlink_nl_post_doit(skb, info, DEVLINK_NL_FLAG_OPTIONAL_PARENT_DEV); +} + static int devlink_nl_inst_single_dumpit(struct sk_buff *msg, struct netlink_callback *cb, int flags, devlink_nl_dump_one_func_t *dump_one, diff --git a/net/devlink/netlink_gen.c b/net/devlink/netlink_gen.c index f52b0c2b19ed..dec00133178d 100644 --- a/net/devlink/netlink_gen.c +++ b/net/devlink/netlink_gen.c @@ -46,6 +46,12 @@ devlink_attr_param_type_validate(const struct nlattr *at= tr, } =20 /* Common nested types */ +const struct nla_policy devlink_dl_parent_dev_nl_policy[DEVLINK_ATTR_INDEX= + 1] =3D { + [DEVLINK_ATTR_BUS_NAME] =3D { .type =3D NLA_NUL_STRING, }, + [DEVLINK_ATTR_DEV_NAME] =3D { .type =3D NLA_NUL_STRING, }, + [DEVLINK_ATTR_INDEX] =3D NLA_POLICY_FULL_RANGE(NLA_UINT, &devlink_attr_in= dex_range), +}; + const struct nla_policy devlink_dl_port_function_nl_policy[DEVLINK_PORT_FN= _ATTR_CAPS + 1] =3D { [DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR] =3D { .type =3D NLA_BINARY, }, [DEVLINK_PORT_FN_ATTR_STATE] =3D NLA_POLICY_MAX(NLA_U8, 1), @@ -608,7 +614,7 @@ static const struct nla_policy devlink_rate_get_dump_nl= _policy[DEVLINK_ATTR_INDE }; =20 /* DEVLINK_CMD_RATE_SET - do */ -static const struct nla_policy devlink_rate_set_nl_policy[DEVLINK_ATTR_IND= EX + 1] =3D { +static const struct nla_policy devlink_rate_set_nl_policy[DEVLINK_ATTR_PAR= ENT_DEV + 1] =3D { [DEVLINK_ATTR_BUS_NAME] =3D { .type =3D NLA_NUL_STRING, }, [DEVLINK_ATTR_DEV_NAME] =3D { .type =3D NLA_NUL_STRING, }, [DEVLINK_ATTR_INDEX] =3D NLA_POLICY_FULL_RANGE(NLA_UINT, &devlink_attr_in= dex_range), @@ -619,10 +625,11 @@ static const struct nla_policy devlink_rate_set_nl_po= licy[DEVLINK_ATTR_INDEX + 1 [DEVLINK_ATTR_RATE_TX_WEIGHT] =3D { .type =3D NLA_U32, }, [DEVLINK_ATTR_RATE_PARENT_NODE_NAME] =3D { .type =3D NLA_NUL_STRING, }, [DEVLINK_ATTR_RATE_TC_BWS] =3D NLA_POLICY_NESTED(devlink_dl_rate_tc_bws_n= l_policy), + [DEVLINK_ATTR_PARENT_DEV] =3D NLA_POLICY_NESTED(devlink_dl_parent_dev_nl_= policy), }; =20 /* DEVLINK_CMD_RATE_NEW - do */ -static const struct nla_policy devlink_rate_new_nl_policy[DEVLINK_ATTR_IND= EX + 1] =3D { +static const struct nla_policy devlink_rate_new_nl_policy[DEVLINK_ATTR_PAR= ENT_DEV + 1] =3D { [DEVLINK_ATTR_BUS_NAME] =3D { .type =3D NLA_NUL_STRING, }, [DEVLINK_ATTR_DEV_NAME] =3D { .type =3D NLA_NUL_STRING, }, [DEVLINK_ATTR_INDEX] =3D NLA_POLICY_FULL_RANGE(NLA_UINT, &devlink_attr_in= dex_range), @@ -633,6 +640,7 @@ static const struct nla_policy devlink_rate_new_nl_poli= cy[DEVLINK_ATTR_INDEX + 1 [DEVLINK_ATTR_RATE_TX_WEIGHT] =3D { .type =3D NLA_U32, }, [DEVLINK_ATTR_RATE_PARENT_NODE_NAME] =3D { .type =3D NLA_NUL_STRING, }, [DEVLINK_ATTR_RATE_TC_BWS] =3D NLA_POLICY_NESTED(devlink_dl_rate_tc_bws_n= l_policy), + [DEVLINK_ATTR_PARENT_DEV] =3D NLA_POLICY_NESTED(devlink_dl_parent_dev_nl_= policy), }; =20 /* DEVLINK_CMD_RATE_DEL - do */ @@ -1290,21 +1298,21 @@ const struct genl_split_ops devlink_nl_ops[75] =3D { { .cmd =3D DEVLINK_CMD_RATE_SET, .validate =3D GENL_DONT_VALIDATE_STRICT, - .pre_doit =3D devlink_nl_pre_doit, + .pre_doit =3D devlink_nl_pre_doit_parent_dev_optional, .doit =3D devlink_nl_rate_set_doit, - .post_doit =3D devlink_nl_post_doit, + .post_doit =3D devlink_nl_post_doit_parent_dev_optional, .policy =3D devlink_rate_set_nl_policy, - .maxattr =3D DEVLINK_ATTR_INDEX, + .maxattr =3D DEVLINK_ATTR_PARENT_DEV, .flags =3D GENL_ADMIN_PERM | GENL_CMD_CAP_DO, }, { .cmd =3D DEVLINK_CMD_RATE_NEW, .validate =3D GENL_DONT_VALIDATE_STRICT, - .pre_doit =3D devlink_nl_pre_doit, + .pre_doit =3D devlink_nl_pre_doit_parent_dev_optional, .doit =3D devlink_nl_rate_new_doit, - .post_doit =3D devlink_nl_post_doit, + .post_doit =3D devlink_nl_post_doit_parent_dev_optional, .policy =3D devlink_rate_new_nl_policy, - .maxattr =3D DEVLINK_ATTR_INDEX, + .maxattr =3D DEVLINK_ATTR_PARENT_DEV, .flags =3D GENL_ADMIN_PERM | GENL_CMD_CAP_DO, }, { diff --git a/net/devlink/netlink_gen.h b/net/devlink/netlink_gen.h index 20034b0929a8..a70e0e4769aa 100644 --- a/net/devlink/netlink_gen.h +++ b/net/devlink/netlink_gen.h @@ -13,6 +13,7 @@ #include =20 /* Common nested types */ +extern const struct nla_policy devlink_dl_parent_dev_nl_policy[DEVLINK_ATT= R_INDEX + 1]; extern const struct nla_policy devlink_dl_port_function_nl_policy[DEVLINK_= PORT_FN_ATTR_CAPS + 1]; extern const struct nla_policy devlink_dl_rate_tc_bws_nl_policy[DEVLINK_RA= TE_TC_ATTR_BW + 1]; extern const struct nla_policy devlink_dl_selftest_id_nl_policy[DEVLINK_AT= TR_SELFTEST_ID_FLASH + 1]; @@ -29,12 +30,19 @@ int devlink_nl_pre_doit_port_optional(const struct genl= _split_ops *ops, struct genl_info *info); int devlink_nl_pre_doit_dev_lock(const struct genl_split_ops *ops, struct sk_buff *skb, struct genl_info *info); +int devlink_nl_pre_doit_parent_dev_optional(const struct genl_split_ops *o= ps, + struct sk_buff *skb, + struct genl_info *info); void devlink_nl_post_doit(const struct genl_split_ops *ops, struct sk_buff *skb, struct genl_info *info); void devlink_nl_post_doit_dev_lock(const struct genl_split_ops *ops, struct sk_buff *skb, struct genl_info *info); +void +devlink_nl_post_doit_parent_dev_optional(const struct genl_split_ops *ops, + struct sk_buff *skb, + struct genl_info *info); =20 int devlink_nl_get_doit(struct sk_buff *skb, struct genl_info *info); int devlink_nl_get_dumpit(struct sk_buff *skb, struct netlink_callback *cb= ); diff --git a/net/devlink/rate.c b/net/devlink/rate.c index 295f4185fdfd..78a59d79c2ea 100644 --- a/net/devlink/rate.c +++ b/net/devlink/rate.c @@ -663,9 +663,11 @@ int devlink_nl_rate_set_doit(struct sk_buff *skb, stru= ct genl_info *info) =20 int devlink_nl_rate_new_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *rate_devlink, *devlink =3D devlink_nl_ctx(info)->devlink; + struct devlink_nl_ctx *ctx =3D devlink_nl_ctx(info); + struct devlink *devlink =3D ctx->devlink; struct devlink_rate *rate_node; const struct devlink_ops *ops; + struct devlink *rate_devlink; int err; =20 ops =3D devlink->ops; --=20 2.44.0 From nobody Wed Jul 1 16:10:59 2026 Received: from CY7PR03CU001.outbound.protection.outlook.com (mail-westcentralusazon11010039.outbound.protection.outlook.com [40.93.198.39]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DCC3C3AE701; Wed, 1 Jul 2026 07:35:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.198.39 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891329; cv=fail; b=QMhTQOt+9BBn1kI2z7auPGJFVc1UHqMUqyFYybzT8+IGLYMBV5yzSLj6N5/4RIVccr6IXrp1kCifOi+487gJ/1/Dd/z9Iwiw500MplosOatv5DmZuasgPTIi+crL2gDWKEVdfWpEFY1ZSHlej5v2RNPGD1d+jU/s7iuOnUF4CH4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891329; c=relaxed/simple; bh=dD/H6SaiAKtuCCrLqCIU3gdH8S/TlkokSPN6w/6hJ+o=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=MQWUtAn3XlR7f9Fkcxb8NBajQARmQ5yx+XRJtS9Vrv6kHdnlPc2DQ7Npea2KBPemUl51O4+VKFmz5NE/m8eyLEF0CbiTb5ay2rULYCJ+8U03+WFUWAZAptLW56bws4zOOpFRZE3F7AB2rlyzUM5vqMrSovs0zUXvZo4JbXqVLxo= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=lxs9vzN0; arc=fail smtp.client-ip=40.93.198.39 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="lxs9vzN0" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=De0aexhDGnYK5AiwC1TmmlG+sXSK9/DzLRQR1MWmhel9WCms8BoxMl7USujvuF4pqXBxE+3WKFA9J5l0cqTUFmf/3DSat0taA0fBLRjwbTTjycHQyBUjS8G5eeE10y5eX7/dz3J2jI5sK4csWJNC+7PJw+0EtWghuUTD22DzLyqPWluJE1HDY5UzAqxQayd0tgB6VPcgzt1tPVdlALY0hopn2ST+OA0T7PlZVrjiPSQHQB8dhsZd/FZHxPLe5E4ldcz8hLC7SLKb3zrghBz7ZKvd1yYYLvEMr50q1ocGM58M+wzTxZfy6p2LYdoOWpKHPkj0dN0PbPAW0YqWhKWviA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=A81cpU63WD/ncPW3tdY4/+F8Sb32G/Ul2zH6i8azMqM=; b=S+wLx9+C7II4XdQYzivjY+PbzU2BZYTR3JN/PjZAE8XrNT6p2VGjc0adh769BU4FVQaxRoviPCKfjdOlVA8MXy8hzM16eFtcDqFvOaVLYdtQLj4OY6/rWu5AVNNJEZZaTrdp7efIwCJLxhGI10R7URcOa0ik7bYyCfM2pL+Y0fFeQiRQL7RpVk09r8dkq9SLdn3T72wcxpLxWGZs5Jhe1y3EeNhYUaGSvb9Yxmkb1QT22knxjLyeG0EmnhUSRqRNwu0b8ikFk49hQR0QrJ7muquv8qhgsCv4mBQUBGE60ueTEXRVr3X9HNBI9feJJHgkJHLCU15BPhUT3JCoiAW3Nw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=lunn.ch 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=A81cpU63WD/ncPW3tdY4/+F8Sb32G/Ul2zH6i8azMqM=; b=lxs9vzN0o2kgZHKtqFU4rDQhCZAIs7iqDlQgCU9hzIBicjg6GKHnVPJNT5tMapbfLlQtVgjKoY2OIcDPhVmjgNVVEMoPYYLSyxccD3/UfQE7tMAXuun29HKdjUdlaTA2knL/qKzxPIDf7OFlONPNs/CVylKDyVyaYXYcRcTHHhvdExQFwJPe+rt5kmrVaoLkvKEZM/h6MDLByVjnAmRT5hqupcAzr7suRVGa2xS7Kh9AzyfzbmmToI/gAnyveNncR/hTvjFE7HWODtGxEKtwQLRytlYNRnfxQW2lNVm2kIyVYMnTqNivPlskvYnN/6PyL8rNo9Tc+K15c/sQQJyVaw== Received: from SJ0PR03CA0173.namprd03.prod.outlook.com (2603:10b6:a03:338::28) by SJ1PR12MB6339.namprd12.prod.outlook.com (2603:10b6:a03:454::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.8; Wed, 1 Jul 2026 07:35:20 +0000 Received: from SJ1PEPF000023DA.namprd21.prod.outlook.com (2603:10b6:a03:338:cafe::99) by SJ0PR03CA0173.outlook.office365.com (2603:10b6:a03:338::28) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.181.8 via Frontend Transport; Wed, 1 Jul 2026 07:35:20 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) 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.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by SJ1PEPF000023DA.mail.protection.outlook.com (10.167.244.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.202.0 via Frontend Transport; Wed, 1 Jul 2026 07:35:17 +0000 Received: from rnnvmail202.nvidia.com (10.129.68.7) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 1 Jul 2026 00:34:35 -0700 Received: from rnnvmail201.nvidia.com (10.129.68.8) by rnnvmail202.nvidia.com (10.129.68.7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 1 Jul 2026 00:34:34 -0700 Received: from vdi.nvidia.com (10.127.8.10) by mail.nvidia.com (10.129.68.8) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Wed, 1 Jul 2026 00:34:25 -0700 From: Tariq Toukan To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , , Paolo Abeni CC: Adithya Jayachandran , Bobby Eshleman , Carolina Jubran , Cosmin Ratiu , Daniel Borkmann , Daniel Jurgens , Daniel Zahka , David Wei , Donald Hunter , Dragos Tatulea , Jiri Pirko , Jiri Pirko , Joe Damato , Jonathan Corbet , Kees Cook , Leon Romanovsky , , , , , Mark Bloch , Moshe Shemesh , Or Har-Toov , Parav Pandit , Petr Machata , Ratheesh Kannoth , Saeed Mahameed , Shahar Shitrit , Shay Drori , Shuah Khan , Shuah Khan , Simon Horman , Stanislav Fomichev , Tariq Toukan , Willem de Bruijn , Gal Pressman Subject: [PATCH net-next V10 07/14] devlink: Allow rate node parents from other devlinks Date: Wed, 1 Jul 2026 10:32:47 +0300 Message-ID: <20260701073254.754518-8-tariqt@nvidia.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20260701073254.754518-1-tariqt@nvidia.com> References: <20260701073254.754518-1-tariqt@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF000023DA:EE_|SJ1PR12MB6339:EE_ X-MS-Office365-Filtering-Correlation-Id: cfcede0e-31e9-43f3-aeaf-08ded7434de4 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|82310400026|7416014|376014|1800799024|36860700016|18002099003|22082099003|11063799006|3023799007|56012099006; X-Microsoft-Antispam-Message-Info: toPG/egf12x+vZa6Dh3OGvM4tUJ4Ip6hh7zCYxYLLwKc1H+IbpHabIzUBz4IOFwpSooUjwQUTfAJFDebn9Enh3tm1X2SE7rR8+8mOTSf2HvXC8pMJ9NfD5+XDjQAncNp90pmbRexEWDCYmqnFR6KY4FN3I16Kc/AO6cicnbW/Xm5E5LtVMysjS6rNYcTYzGzjoXio3lc59QJGxDjkS1Iu2G0StHxllWdTaRMnc/y1+n8pSmTJdHY4HruzIJlvgARMIOWu1Eg+JibHK/wqjTofEXfDxw7Ma+Upd1v5sfyk44g+XTJ848BeHBh7/h6hMyivq1l3GMI8TGmrs+/jOKnuVfGxTndMvs+G6vpFa44Hi/eG7GFO3rHHiGINgdNsl2OeRo9ojxFnjXhvmVB1KJ2L6vS2esOIyVuThJuXt6OOtzDtpxmHl2cQUcdFSujrUSi2HWsKbsg2q+G+daMDuctMAbtLunBIzCi5DTN+TGRtqmhdJiVE5QazYlnPT5PA94Bpces2JakQOXfOAYhD/TRd1vDFHSoBhLJ7nY0nsW8uX6xsYh5kFq+SH/urdxHkQfPsv4O01oisO2ceqBD1Bj+DQ9XDQ25oWNwzVYuR9L+G5ee/r/9U4Ykdc4El4vijADUWyJRah6KjMAjBpylrakVCLFLyZaopyyqF+n3HEtsCaDS7F7ILdaPydu789mejFFd6GzDby8bq1oFxcN7R1WavA== X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(23010399003)(82310400026)(7416014)(376014)(1800799024)(36860700016)(18002099003)(22082099003)(11063799006)(3023799007)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 4FZB6LCIL59F5uJrT/cTU+vfBtZyTaglvIOj9HFSnYbg0SKc7ulQipPX6iy5WQJAN7ymKFnudp2ahVwUl2ZP1pOcI7CThtb7hHZBsPaUr3FykkuSktu5IMVUbjtCxA8ryOoJSI0w73WLRcJ7xN7N658+5n9oRe5Y5EEVb41DvOzHbqhrabtpwAVMvZCv0eP7e0s1NNcI9tkHdCcT9Jl8/vz5LC66xkqMTGyyspy3sLiwWEGfQVYu6xjXIpOe1IGMCCEMV8rL7am8HWuPOHv82YYCmaFdlODE9pV4V6lLuZD8rdriJBtx/seyR9s0otx8bf1iAge06UdjWRMSheNGCYntCFP8K1I5SBIiK9DZoq9ga2N+eGfVDa4TMMVSaoVWY5t2ULz12jUlX0WOyBjFRZYzas0bKUbR8Vj8LvIexQ9I1leIBH7C3KLKCqiaVR5R X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Jul 2026 07:35:17.1383 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: cfcede0e-31e9-43f3-aeaf-08ded7434de4 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.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF000023DA.namprd21.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ1PR12MB6339 Content-Type: text/plain; charset="utf-8" From: Cosmin Ratiu This commit makes use of the building blocks previously added to implement cross-device rate nodes. A new 'supported_cross_device_rate_nodes' bool is added to devlink_ops which lets drivers advertise support for cross-device rate objects. If enabled and if there is a common shared devlink instance, then: - all rate objects will be stored in the top-most common nested instance and - rate objects can have parents from other devices sharing the same common instance. Storing rates in the common shared ancestor is safe, because it is reference counted by its nested devlink instances, so it's guaranteed to outlive them. Furthermore, the shared devlink infra guarantees a given nested devlink hierarchy is managed by the same driver. The parent devlink from info->ctx is not locked, so none of its mutable fields can be used. But parent setting only requires comparing devlink pointer comparisons. Additionally, since the shared devlink is locked, other rate operations cannot concurrently happen. Signed-off-by: Cosmin Ratiu Reviewed-by: Carolina Jubran Reviewed-by: Jiri Pirko Signed-off-by: Tariq Toukan --- .../networking/devlink/devlink-port.rst | 2 + include/net/devlink.h | 9 ++ net/devlink/core.c | 4 +- net/devlink/rate.c | 86 +++++++++++++++++-- 4 files changed, 92 insertions(+), 9 deletions(-) diff --git a/Documentation/networking/devlink/devlink-port.rst b/Documentat= ion/networking/devlink/devlink-port.rst index 9374ebe70f48..18aca77006d5 100644 --- a/Documentation/networking/devlink/devlink-port.rst +++ b/Documentation/networking/devlink/devlink-port.rst @@ -420,6 +420,8 @@ API allows to configure following rate object's paramet= ers: Parent node name. Parent node rate limits are considered as additional l= imits to all node children limits. ``tx_max`` is an upper limit for children. ``tx_share`` is a total bandwidth distributed among children. + If the device supports cross-function scheduling, the parent can be from= a + different function of the same underlying device. =20 ``tc_bw`` Allow users to set the bandwidth allocation per traffic class on rate diff --git a/include/net/devlink.h b/include/net/devlink.h index dd546dbd57cf..ffe1ad5fb70b 100644 --- a/include/net/devlink.h +++ b/include/net/devlink.h @@ -1594,6 +1594,15 @@ struct devlink_ops { struct devlink_rate *parent, void *priv_child, void *priv_parent, struct netlink_ext_ack *extack); + /* Indicates if cross-device rate nodes are supported. + * This also requires a shared common ancestor object all devices that + * could share rate nodes are nested in. + * If enabled, rate operations may be called on an instance with only + * the common ancestor lock held and *without that instance lock held*. + * It is the driver's responsibility to ensure proper serialization + * with other operations. + */ + bool supported_cross_device_rate_nodes; /** * selftests_check() - queries if selftest is supported * @devlink: devlink instance diff --git a/net/devlink/core.c b/net/devlink/core.c index ee26c50b4118..c53a42e17a58 100644 --- a/net/devlink/core.c +++ b/net/devlink/core.c @@ -534,6 +534,9 @@ void devlink_free(struct devlink *devlink) { ASSERT_DEVLINK_NOT_REGISTERED(devlink); =20 + devl_lock(devlink); + WARN_ON(devlink_rates_check(devlink, NULL, NULL)); + devl_unlock(devlink); devlink_rel_put(devlink); =20 WARN_ON(!list_empty(&devlink->trap_policer_list)); @@ -544,7 +547,6 @@ void devlink_free(struct devlink *devlink) WARN_ON(!list_empty(&devlink->resource_list)); WARN_ON(!list_empty(&devlink->dpipe_table_list)); WARN_ON(!list_empty(&devlink->sb_list)); - WARN_ON(devlink_rates_check(devlink, NULL, NULL)); WARN_ON(!list_empty(&devlink->linecard_list)); WARN_ON(!xa_empty(&devlink->ports)); =20 diff --git a/net/devlink/rate.c b/net/devlink/rate.c index 78a59d79c2ea..e727c8b8b33e 100644 --- a/net/devlink/rate.c +++ b/net/devlink/rate.c @@ -30,14 +30,42 @@ devlink_rate_leaf_get_from_info(struct devlink *devlink= , struct genl_info *info) return devlink_rate ?: ERR_PTR(-ENODEV); } =20 +/* Repeatedly walks the nested devlink chain while cross device rate nodes= are + * supported and finds the topmost instance where rates should be stored. + * That instance is locked, referenced and returned. + * When cross device rate nodes aren't supported the original devlink inst= ance + * is returned. + */ static struct devlink *devl_rate_lock(struct devlink *devlink) { - return devlink; + struct devlink *rate_devlink =3D devlink, *parent; + + devl_assert_locked(devlink); + + while (rate_devlink->ops && + rate_devlink->ops->supported_cross_device_rate_nodes) { + parent =3D devlink_nested_in_get_lock(rate_devlink); + if (!parent) + break; + if (rate_devlink !=3D devlink) { + /* Unlock intermediate instances. */ + devl_unlock(rate_devlink); + devlink_put(rate_devlink); + } + rate_devlink =3D parent; + } + return rate_devlink; } =20 +/* Unlocks and puts 'rate devlink' if different than 'devlink'. */ static void devl_rate_unlock(struct devlink *devlink, struct devlink *rate_devlink) { + if (devlink =3D=3D rate_devlink) + return; + + devl_unlock(rate_devlink); + devlink_put(rate_devlink); } =20 static struct devlink_rate * @@ -121,6 +149,25 @@ static int devlink_rate_put_tc_bws(struct sk_buff *msg= , u32 *tc_bw) return -EMSGSIZE; } =20 +static int devlink_nl_rate_parent_fill(struct sk_buff *msg, + struct devlink_rate *devlink_rate) +{ + struct devlink_rate *parent =3D devlink_rate->parent; + struct devlink *devlink =3D parent->devlink; + + if (nla_put_string(msg, DEVLINK_ATTR_RATE_PARENT_NODE_NAME, + parent->name)) + return -EMSGSIZE; + + if (devlink !=3D devlink_rate->devlink && + devlink_nl_put_nested_handle(msg, + devlink_net(devlink_rate->devlink), + devlink, DEVLINK_ATTR_PARENT_DEV)) + return -EMSGSIZE; + + return 0; +} + static int devlink_nl_rate_fill(struct sk_buff *msg, struct devlink_rate *devlink_rate, enum devlink_command cmd, u32 portid, u32 seq, @@ -165,10 +212,9 @@ static int devlink_nl_rate_fill(struct sk_buff *msg, devlink_rate->tx_weight)) goto nla_put_failure; =20 - if (devlink_rate->parent) - if (nla_put_string(msg, DEVLINK_ATTR_RATE_PARENT_NODE_NAME, - devlink_rate->parent->name)) - goto nla_put_failure; + if (devlink_rate->parent && + devlink_nl_rate_parent_fill(msg, devlink_rate)) + goto nla_put_failure; =20 if (devlink_rate_put_tc_bws(msg, devlink_rate->tc_bw)) goto nla_put_failure; @@ -322,13 +368,14 @@ devlink_nl_rate_parent_node_set(struct devlink_rate *= devlink_rate, struct genl_info *info, struct nlattr *nla_parent) { - struct devlink *devlink =3D devlink_rate->devlink; + struct devlink *devlink =3D devlink_rate->devlink, *parent_devlink; const char *parent_name =3D nla_data(nla_parent); const struct devlink_ops *ops =3D devlink->ops; size_t len =3D strlen(parent_name); struct devlink_rate *parent; int err =3D -EOPNOTSUPP; =20 + parent_devlink =3D devlink_nl_ctx(info)->parent_devlink ? : devlink; parent =3D devlink_rate->parent; =20 if (parent && !len) { @@ -346,7 +393,13 @@ devlink_nl_rate_parent_node_set(struct devlink_rate *d= evlink_rate, refcount_dec(&parent->refcnt); devlink_rate->parent =3D NULL; } else if (len) { - parent =3D devlink_rate_node_get_by_name(rate_devlink, devlink, + /* parent_devlink (when different than devlink) isn't locked, + * but the rate node devlink instance is, so nobody from the + * same group of devices sharing rates could change the used + * fields or unregister the parent. + */ + parent =3D devlink_rate_node_get_by_name(rate_devlink, + parent_devlink, parent_name); if (IS_ERR(parent)) return -ENODEV; @@ -633,9 +686,11 @@ static bool devlink_rate_set_ops_supported(const struc= t devlink_ops *ops, =20 int devlink_nl_rate_set_doit(struct sk_buff *skb, struct genl_info *info) { - struct devlink *rate_devlink, *devlink =3D devlink_nl_ctx(info)->devlink; + struct devlink_nl_ctx *ctx =3D devlink_nl_ctx(info); + struct devlink *devlink =3D ctx->devlink; struct devlink_rate *devlink_rate; const struct devlink_ops *ops; + struct devlink *rate_devlink; int err; =20 rate_devlink =3D devl_rate_lock(devlink); @@ -652,6 +707,14 @@ int devlink_nl_rate_set_doit(struct sk_buff *skb, stru= ct genl_info *info) goto unlock; } =20 + if (ctx->parent_devlink && ctx->parent_devlink !=3D devlink && + !ops->supported_cross_device_rate_nodes) { + NL_SET_ERR_MSG(info->extack, + "Cross-device rate parents aren't supported"); + err =3D -EOPNOTSUPP; + goto unlock; + } + err =3D devlink_nl_rate_set(devlink_rate, rate_devlink, ops, info); =20 if (!err) @@ -679,6 +742,13 @@ int devlink_nl_rate_new_doit(struct sk_buff *skb, stru= ct genl_info *info) if (!devlink_rate_set_ops_supported(ops, info, DEVLINK_RATE_TYPE_NODE)) return -EOPNOTSUPP; =20 + if (ctx->parent_devlink && ctx->parent_devlink !=3D devlink && + !ops->supported_cross_device_rate_nodes) { + NL_SET_ERR_MSG(info->extack, + "Cross-device rate parents aren't supported"); + return -EOPNOTSUPP; + } + rate_devlink =3D devl_rate_lock(devlink); rate_node =3D devlink_rate_node_get_from_attrs(rate_devlink, devlink, info->attrs); --=20 2.44.0 From nobody Wed Jul 1 16:10:59 2026 Received: from BN1PR04CU002.outbound.protection.outlook.com (mail-eastus2azon11010010.outbound.protection.outlook.com [52.101.56.10]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0E3AE3AE701; Wed, 1 Jul 2026 07:35:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.56.10 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891337; cv=fail; b=gjbgf4j8Yx0wxXHgybiZ8yp/1ev6PCa6jVM4YSq9+Uesy/DaDdETB63YVesKvN8lxy33Wv45LhgcyPJh12xPC2PtC3Lm4mBSQEqFEQWSdZjWM4NVX+/H1TnYlJhGzOoCStHf/gvmfM0UIeWm3v9wuEs9acELd/w1OkFmJ62Qroc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891337; c=relaxed/simple; bh=QGv54V7hK2CAIEzhn4H9m9sSyEkeF+w2Pcw2KBOTCGo=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=GUqrOSN+Xqw97DUuY8WcXEqk6OwDJbjnuTjjgtafWurrrZ26erypBOMsPuzwjFyi83652aSL5EVZAOUYFFwaDXJiVB6PpgJAT8uvI10bToqUYzfghSf9xR0KmmKshrDuPrYM5ctF9cK0b3XWcDsfytRRV1jXR1e0+It68oUOX6I= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=KzmhidJa; arc=fail smtp.client-ip=52.101.56.10 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="KzmhidJa" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=gmDLvgYoVjl2wT/K38ARiUujpizi6mw5NWeSYAWsG5qZmDyscVlg8EblcSY/xqkegqcue80sq+I5MbYCsc54m+qQpj9fylRRZaNGqUObudg7JPtCbRt9qjeVcylrA5cX61DlmKT3UN/Z+lB8Ew2jwhtyPmabdXTAjRfRy8Scw4VNuEOlAjoMFuvENt4EdzZwkqmAQCxbOfL7PPTyGBTLQLYNsOUfcMmrMbPK1+PVRSrMQhYN8eJtfvK6pUZwEoenXym5yrajfuAHH3XFyTSMml+2c7P8ydTex1SibKRD516by8ydtIbuB3l2g+MQUzP+R1ueTK3KyPVy8UOPxFxb9A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=rBUpjInFLVeZq4G9d5itiAaVZ/kyu9u97IT77qcsgbw=; b=OwUQPgHX43dJEFrhcCbp/Lyhlk9yFcr9+l/DUxxqHskWdrXF425l/XGq6Uoiafv4Vg0fvh66Q/WHU4bv2ybPuA8PNWbKBpwHRrnqEF5ni8kW1j074T3rCMl7PGlEfkppkkiCSEZyUy+Gd7cAgJBCPO+UXcxtrHnQG5ntwv1jSGy1aMnSmZ/azr0UX4m/KfqOgrCDuaDBNsD3+Y2mJcdclmv5srNfZBodtBkgPlDu1pgvtY8xaIVWWt0eGSdvYotPn15I0c7JcZlPRYR33lRiPLjAKkrADi1Icj/zPQuaPxPpwDuB+xrhpcsqu5pCqbKibQCkveM0kOXt6mr0AH4aBg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=lunn.ch 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=rBUpjInFLVeZq4G9d5itiAaVZ/kyu9u97IT77qcsgbw=; b=KzmhidJaWMq6tW+vNRq7eKiTMhxhERef4LyVrDwETEt9VJDidsGfQnWcOmUMeGFKnV4LLhuWgi1qL5/aW3vvZs1Ab6v1CAnwX5ymTWbFTg8vRs19wbiljCDAwG2YTPky3sCAi9lNl2Enk9bPVpeDOk52VTFXgAC+d9q+ebAnNaBYEu4Ba6zBXluLDAd5VLH04tdZgGSwjSUJ33fX63C7TKkL356esLvYfu9sjXttgBGgW249+vcRSaFlvyIV022bzYi23kP/MGyZ9PcIMDhmLi9VUvnD7KcvaY0vpgBzoYvNGLZ+TO+od+K4KJ5ffStCId7VHbluxw7fgJU8P4dOfQ== Received: from PH7PR17CA0036.namprd17.prod.outlook.com (2603:10b6:510:323::20) by DS7PR12MB6311.namprd12.prod.outlook.com (2603:10b6:8:94::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.8; Wed, 1 Jul 2026 07:35:27 +0000 Received: from SJ1PEPF000023D9.namprd21.prod.outlook.com (2603:10b6:510:323:cafe::aa) by PH7PR17CA0036.outlook.office365.com (2603:10b6:510:323::20) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.181.8 via Frontend Transport; Wed, 1 Jul 2026 07:35:27 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) 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.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by SJ1PEPF000023D9.mail.protection.outlook.com (10.167.244.74) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.202.0 via Frontend Transport; Wed, 1 Jul 2026 07:35:25 +0000 Received: from rnnvmail202.nvidia.com (10.129.68.7) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 1 Jul 2026 00:34:45 -0700 Received: from rnnvmail201.nvidia.com (10.129.68.8) by rnnvmail202.nvidia.com (10.129.68.7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 1 Jul 2026 00:34:44 -0700 Received: from vdi.nvidia.com (10.127.8.10) by mail.nvidia.com (10.129.68.8) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Wed, 1 Jul 2026 00:34:35 -0700 From: Tariq Toukan To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , , Paolo Abeni CC: Adithya Jayachandran , Bobby Eshleman , Carolina Jubran , Cosmin Ratiu , Daniel Borkmann , Daniel Jurgens , Daniel Zahka , David Wei , Donald Hunter , Dragos Tatulea , Jiri Pirko , Jiri Pirko , Joe Damato , Jonathan Corbet , Kees Cook , Leon Romanovsky , , , , , Mark Bloch , Moshe Shemesh , Or Har-Toov , Parav Pandit , Petr Machata , Ratheesh Kannoth , Saeed Mahameed , Shahar Shitrit , Shay Drori , Shuah Khan , Shuah Khan , Simon Horman , Stanislav Fomichev , Tariq Toukan , Willem de Bruijn , Gal Pressman Subject: [PATCH net-next V10 08/14] net/mlx5: qos: Use mlx5_lag_query_bond_speed to query LAG speed Date: Wed, 1 Jul 2026 10:32:48 +0300 Message-ID: <20260701073254.754518-9-tariqt@nvidia.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20260701073254.754518-1-tariqt@nvidia.com> References: <20260701073254.754518-1-tariqt@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF000023D9:EE_|DS7PR12MB6311:EE_ X-MS-Office365-Filtering-Correlation-Id: 7baba91d-cfd2-4464-e725-08ded74351f2 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|82310400026|23010399003|1800799024|7416014|376014|11063799006|56012099006|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: b3crdXuU8quAqBmDTBxtT6jl3SYFlVuxuy7ZH8PPUoGgrNQpQ6dHOrk58ShVfjmIFn8aD10lqO41t5OPSZYu5Xbocith4nWGYHHy8s3dkrNEiEZdbrqTALo+Mr8p9WXgGm8vEpukhVkoGGdduTfBVQHeGVsvCL464k4SYUcnPWThQXJfVx7Y7ReKT7zycAc71XMExeJ9fWRPW8l/9DayGYl1bYq8qGytVIJhlbOc3CkNZwBNeNbYp2HRUpCxeEpA71B2flbDxA6sjFg1ja5pnuucoUEOQ5hyWqzZj5y/XbZZrJbrD2lGxojRUTvvcsHDgH15cX2NP6b6Vtku4bWuM7mtF6B3KLcFW26xUAoqAemQUDXZG8WGr3yXw2obRcmXNHByCwbQ7ZneMhI1pTXRifVrka26nxqwCC1G4g2DZsXLku62IGJDzglrmX2SE/rV2ZUw+Mg4tLtdX/GDsixtrR6/Au5gqiwYqugfmjcJhGMYpNWgAPvISByqIzjAZ3kzbGQg6T0qcQ5Gvq0sdviZYfwImB2MCbwVyjcz4O3xUAncUotyB0brzImM88MqJpvozkG8k4ju/VKxIOGtasd4dmKcD3QhY5HrCwVYkiY76F7r7eIHpiu9ok7kwgv5NDkQFUnYITxuDWVewhMp9Dp8pyGiZ++ODjonMfzJXStD2ZsIa63KxE5Uh4gezfQUw+dFygGPp3kkjBXotSKXUrKdMA== X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(36860700016)(82310400026)(23010399003)(1800799024)(7416014)(376014)(11063799006)(56012099006)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: ERslEPKOGVZ7wQd+LsoPdFhtjgL6oULdpuLvrWt9m9v9H83sT9clCEustqRec8Uaiy86Q6+9VvnXseTuN1OVZNdTqqzQz8UdPE7qrmQgvjHid4A6KhYukMZRfQ86kL4WkkrmUMYviN5mB/a3KRTNR9g5l5xGbkfgQLZLOZFOQLnm92SfdtU3WsbXijtwwc4HGVZkMXxtRd3+6bB8MXXl5okkQhZ7qwuSooFDaQxIcNy59jRPZQpGndQaGftMB8Xe7CdO45iReHF/J+/QbEOsNmJBSGeH0nOtlxfJJlLpshwDvHZbM9ibHylACLZALk9/bnjO2pSEsIS2yn/46oXkfzXn9pl9aEdFHThow7i4A6Pi+Q316uwRpeFJu8luXXOMk52M+op3fR3iVqjLCEGoe6vhARQz5a4KDVuPWI+bU6YFXJ1n+zzB1C+QBbD6mTOA X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Jul 2026 07:35:25.9635 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 7baba91d-cfd2-4464-e725-08ded74351f2 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.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF000023D9.namprd21.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS7PR12MB6311 Content-Type: text/plain; charset="utf-8" From: Cosmin Ratiu Previously, the master device of the uplink netdev was queried for its maximum link speed from the QoS layer, requiring the uplink_netdev mutex and possibly the RTNL (if the call originated from the TC matchall layer). Acquiring these locks here is risky, as lock cycles could form. The locking for the QoS layer is about to change, so to avoid issues, replace the code querying the LAG's max link speed with the existing infrastructure added in commit [1]. This simplifies this part and avoids potential lock cycles. One caveat is that there's a new edge case, when the bond device is not fully formed to represent the LAG device, the speed isn't calculated and is left at 0. This now handled explicitly. [1] commit f0b2fde98065 ("net/mlx5: Add support for querying bond speed") Signed-off-by: Cosmin Ratiu Reviewed-by: Carolina Jubran Signed-off-by: Tariq Toukan --- .../net/ethernet/mellanox/mlx5/core/esw/qos.c | 36 ++++--------------- 1 file changed, 6 insertions(+), 30 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c b/drivers/ne= t/ethernet/mellanox/mlx5/core/esw/qos.c index faccc60fc93a..d04fda4b3778 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c @@ -1489,41 +1489,16 @@ static int esw_qos_node_enable_tc_arbitration(struc= t mlx5_esw_sched_node *node, return err; } =20 -static u32 mlx5_esw_qos_lag_link_speed_get(struct mlx5_core_dev *mdev, - bool take_rtnl) -{ - struct ethtool_link_ksettings lksettings; - struct net_device *slave, *master; - u32 speed =3D SPEED_UNKNOWN; - - slave =3D mlx5_uplink_netdev_get(mdev); - if (!slave) - goto out; - - if (take_rtnl) - rtnl_lock(); - master =3D netdev_master_upper_dev_get(slave); - if (master && !__ethtool_get_link_ksettings(master, &lksettings)) - speed =3D lksettings.base.speed; - if (take_rtnl) - rtnl_unlock(); - -out: - mlx5_uplink_netdev_put(mdev, slave); - return speed; -} - static int mlx5_esw_qos_max_link_speed_get(struct mlx5_core_dev *mdev, u32= *link_speed_max, - bool take_rtnl, struct netlink_ext_ack *extack) { int err; =20 - if (!mlx5_lag_is_active(mdev)) + if (!mlx5_lag_is_active(mdev) || + mlx5_lag_query_bond_speed(mdev, link_speed_max) < 0 || + *link_speed_max =3D=3D 0) goto skip_lag; =20 - *link_speed_max =3D mlx5_esw_qos_lag_link_speed_get(mdev, take_rtnl); - if (*link_speed_max !=3D (u32)SPEED_UNKNOWN) return 0; =20 @@ -1560,7 +1535,8 @@ int mlx5_esw_qos_modify_vport_rate(struct mlx5_eswitc= h *esw, u16 vport_num, u32 return PTR_ERR(vport); =20 if (rate_mbps) { - err =3D mlx5_esw_qos_max_link_speed_get(esw->dev, &link_speed_max, false= , NULL); + err =3D mlx5_esw_qos_max_link_speed_get(esw->dev, &link_speed_max, + NULL); if (err) return err; =20 @@ -1598,7 +1574,7 @@ static int esw_qos_devlink_rate_to_mbps(struct mlx5_c= ore_dev *mdev, const char * return -EINVAL; } =20 - err =3D mlx5_esw_qos_max_link_speed_get(mdev, &link_speed_max, true, exta= ck); + err =3D mlx5_esw_qos_max_link_speed_get(mdev, &link_speed_max, extack); if (err) return err; =20 --=20 2.44.0 From nobody Wed Jul 1 16:10:59 2026 Received: from BL2PR02CU003.outbound.protection.outlook.com (mail-eastusazon11011041.outbound.protection.outlook.com [52.101.52.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4961733A9E2; Wed, 1 Jul 2026 07:35:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.52.41 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891322; cv=fail; b=qpt0E3PbNmE26gUcM+dvIEm3attRoyQ8tmSGYI9zI3l7KvOCtyUr48TykSDP33bgYnkXv7lb+bdvTfsEZjyBF7v/6AIl62X9kbgk2dIvBWRFkzLCQqYl49c0aFkhWUToKuCGJALmN/k/Ou1RlqtCAB3sp1RLCBDupAnw2fWRZj0= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891322; c=relaxed/simple; bh=HK/PNCDj7wJNmskPDbGWQfoKzg+rR5J2hgfrUEz+d1s=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=lCY5JMxCqNVvaDuiFTgfcuLeq6bggaFfK06fweTVZ6Nht7Ghv6wc1HT+L7XSiYjErqbiYrq2gV1tW7dSlvDko8G+rrmqlUbcEVRFb4qHZZ+HWhMdNJVxl6QZy634bxqzVmPWBIj9EWetOI7ApNv4lcif4Ppc4V0vvxhSB1Q7tDk= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=jdhRqtf8; arc=fail smtp.client-ip=52.101.52.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="jdhRqtf8" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Cysaox+jBo3rFJ3NpLdSXPw0t43sx/KZfAgVhA5Sxn6T/CE9Y31Q5iCLY6OBEzlz8w22hAX/mc5fnDs6uBIM2fnMwkByWeNMry4W0JCYMVmQvcIjqr/PuensxdmFEK8N2Lkeu4D1D/1bEiKpbCBl3bNo8OGfR68DLysSfoHxS2Bbgto+zVlSxB5sRb2mEy8HVTc/jIDPlKLrFj/7DJib4BdhkrXC/b8YOisOs+vRGByEOtpe/fm26x9gB5c5rCm33ahNaxjGyg9gFBHXNGNH+WmyUOMC1UlWgWxAVvEI3RZpQ3pI6Bef+vI4e9roTwrqXWJJxXrZz1Z9yxm7rgCgAg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=tEOctaRx0wkt3E0eLNJH5PU/eIMHWT05U6iXAhJmqPo=; b=AMAR9YCKpCufc386ldHQL+0CK/4vx+NK6WXeajm24XkkrCf0avlEavfBh2eN0hm9TuA+BvGB8Eq8IA4HmsdCWe5mzy9DD8XfjcNhYOiUgZV6Sht/MiO5o1+VzAfyh35vEYp7iixHE9DdKCdSAVgHUMZlIpJW3jbVxC7fXvv6orcLnFfqWXvI7DWmffJl/eBqJf5GpEnoGBzQv9oPZMjl9Qk7al4DCPq0IEcv32uTyJSfNnqNEJ1vxTeA5DtI/jQo0e3/4+0h2px7nYSRWwAVbbLrU5FnVcnRvU8P1/rFUITnfG59AaRc1qrMHxj7JVZoE/nuOcKNCVhUA8ybsR98vQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=lunn.ch 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=tEOctaRx0wkt3E0eLNJH5PU/eIMHWT05U6iXAhJmqPo=; b=jdhRqtf8sVtJkwNdUjuqBbKdaatuAhMQq1uILtdIcDLh3vOwJJXjAFkOpnMA2O2AVkCqZS+T1P2l79dbQiExUt4AwR+E726mFZ4WAvHY+8xXP7nr1ewD0YKAF5dJjoLRf5oHqImiIT7e1C1lEGSyXAty0CRt+BqFJVtNXxMs6UtwDGFtV66HgwY5OXXzrnyPBFqTp3KFFEpdoy2blOV1AWXos2mU8HbwJUTm1Al3m7ZpS3l56nGh4GCe1VyQj6ueo/4YxI62SPlAAdoRfjX2a/rJjjS4G6Nb7i9bID7o4nhEAjkJghJ4RYD9eXNdFu4Y5ipBAB5fcyUww47XgNEP5Q== Received: from DS1PR05CA0026.namprd05.prod.outlook.com (2603:10b6:8:23f::8) by PH7PR12MB6394.namprd12.prod.outlook.com (2603:10b6:510:1fe::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.8; Wed, 1 Jul 2026 07:35:14 +0000 Received: from DS1PEPF00017091.namprd03.prod.outlook.com (2603:10b6:8:23f:cafe::53) by DS1PR05CA0026.outlook.office365.com (2603:10b6:8:23f::8) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.202.3 via Frontend Transport; Wed, 1 Jul 2026 07:35:14 +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 DS1PEPF00017091.mail.protection.outlook.com (10.167.17.133) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.6 via Frontend Transport; Wed, 1 Jul 2026 07:35:13 +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.2562.20; Wed, 1 Jul 2026 00:34:55 -0700 Received: from rnnvmail201.nvidia.com (10.129.68.8) 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.2562.20; Wed, 1 Jul 2026 00:34:55 -0700 Received: from vdi.nvidia.com (10.127.8.10) by mail.nvidia.com (10.129.68.8) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Wed, 1 Jul 2026 00:34:45 -0700 From: Tariq Toukan To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , , Paolo Abeni CC: Adithya Jayachandran , Bobby Eshleman , Carolina Jubran , Cosmin Ratiu , Daniel Borkmann , Daniel Jurgens , Daniel Zahka , David Wei , Donald Hunter , Dragos Tatulea , Jiri Pirko , Jiri Pirko , Joe Damato , Jonathan Corbet , Kees Cook , Leon Romanovsky , , , , , Mark Bloch , Moshe Shemesh , Or Har-Toov , Parav Pandit , Petr Machata , Ratheesh Kannoth , Saeed Mahameed , Shahar Shitrit , Shay Drori , Shuah Khan , Shuah Khan , Simon Horman , Stanislav Fomichev , Tariq Toukan , Willem de Bruijn , Gal Pressman Subject: [PATCH net-next V10 09/14] net/mlx5: qos: Refactor vport QoS cleanup Date: Wed, 1 Jul 2026 10:32:49 +0300 Message-ID: <20260701073254.754518-10-tariqt@nvidia.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20260701073254.754518-1-tariqt@nvidia.com> References: <20260701073254.754518-1-tariqt@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS1PEPF00017091:EE_|PH7PR12MB6394:EE_ X-MS-Office365-Filtering-Correlation-Id: 2c8786df-d92a-43fd-6375-08ded7434a2b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|7416014|82310400026|23010399003|36860700016|18002099003|22082099003|56012099006|11063799006|6133799003; X-Microsoft-Antispam-Message-Info: EIuwMEfD5V9WND7Smbpc0J6/2FF158nUlwrNkA8Pip0jmRevnE/h2gIgIeq9tcpSZ/dgJi3yjn6FM3fOCD1QWxz8NiCjebrlu/wJIBDNekvOjnBRiONZz8Kamp+GhQcNjCFnyB4TKGXEBt9B1IpX4eINYGMqeov0zV919YGl9BEbzp0KfxJ1zyKzdLzxFue8GR68us+ltx06MfkOEOde0/Zs5i22GW9VKSXKyEas6R1FRNYlEoUYqu9DBTCEEAofXoCx6y2A2tS1nXKxJM0gHnLR+X4Z8FxbdJQpOrJZ7DI0aWND3Ady5I1CxD0gEXnngDwsnwOMvlX+npR3KrTKNUFIdIxfrbHm9v8vuRTm52/S3vAhGV7iWN5wANeulIxaC5NXNAXihwdLuoWm3T7hyWz1CF2qqa+2QabCF5FDcHB4Qj4x++B36TPuCfqoqiGyGkeo5WAdCQGSwufDH0T1LbmpXFMJRI3AD5WXOuN65rkKYG8G/VVlLFgpCtEYMO9GjVURKmRnRie8Lim5RP9T1np20AzboRcpjIpxTVfiQul+rr0bIzPOiArH8h7pV7v6BaI22mnd74mZyifAD+Bz/z8kOWqyruWRxr67283b1M6zQsysPg38GOzgzOzSZ171AJ2XF4M+f2jo4T6/sjNW0hknBlw8wNQv1rLNl5IHQSxWWqa/whhnp4DHADxcLSWE 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)(1800799024)(376014)(7416014)(82310400026)(23010399003)(36860700016)(18002099003)(22082099003)(56012099006)(11063799006)(6133799003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: cxTIHhYtWK4GS783pB9IX1Ra1O6LpJaOSP9+c+g52VU+LPI6msYoqQTfLY5y6vzg9Jm+aE1/ELFvx7AuZQBFQp6jievdX4UQtYVhQEjRUgmuvPpKGklg1N6SvhR1Z7xp509ZtupHLN7N6nLlcz5h/ePuMlLwy8lwa3D0SvpaYrKarl99Pw89KqgHwIwSbOtxyCvfphqRCgg3hlxBY3wrgNl6uOIvBQDToc+wGGKyVlG4I5JanJMQ/Kyqg0ADAe9oXc0wZphA2yYfA7g3V/ivCdO31mowdoRhrC7tXYqkGp+4+8doMbR76Q4oV01Ocp9bQwW25t86Ymz6xWVz0GxbOHurcpxKFyNpLkSd7VVVfwslD6affupekgVi0SBDukqL2pw0hk9SWTBAofXlC8ZKIdvb5amwkfHEcwklwIcLFkzidPkkBELqajH0T8TkXC5X X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Jul 2026 07:35:13.8284 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 2c8786df-d92a-43fd-6375-08ded7434a2b 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: DS1PEPF00017091.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB6394 Content-Type: text/plain; charset="utf-8" From: Cosmin Ratiu Qos cleanup is a complex affair, because of the two modes of operation (legacy and switchdev). Leaf QoS is removed: 1. In legacy mode by esw_vport_cleanup() -> mlx5_esw_qos_vport_disable() 2. In switchdev mode by mlx5_esw_offloads_devlink_port_unregister() -> mlx5_esw_qos_vport_update_parent(). A little later in the same flow, the calls in 1 happen but they are noops. Zooming out a bit, from both mlx5_eswitch_disable_locked() and mlx5_eswitch_disable_sriov() the leaves are destroyed before the nodes, which is the reverse of what should be. For SFs there's no devl_rate_nodes_destroy() call to unparent the affected leaf. Sanitize all of this by: 1. Destroying nodes before leaves in both legacy and switchdev mode. 2. Only removing vport qos from esw_vport_cleanup(), reachable from both legacy and switchdev and also reachable by SF removal. 3. Unexpose mlx5_esw_qos_vport_update_parent(), which becomes internal to qos. 4. Remove the WARN in mlx5_esw_qos_vport_disable(). This also takes care of a theoretical corner case, when mlx5_esw_qos_vport_update_parent() tried to reattach the vport to the original parent on failure, which can fail as well, leaving the vport in a broken state. Signed-off-by: Cosmin Ratiu Reviewed-by: Carolina Jubran Signed-off-by: Tariq Toukan --- .../mellanox/mlx5/core/esw/devlink_port.c | 1 - .../net/ethernet/mellanox/mlx5/core/esw/qos.c | 14 ++++---------- .../net/ethernet/mellanox/mlx5/core/eswitch.c | 19 ++++++++++--------- .../net/ethernet/mellanox/mlx5/core/eswitch.h | 2 -- 4 files changed, 14 insertions(+), 22 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/esw/devlink_port.c b/d= rivers/net/ethernet/mellanox/mlx5/core/esw/devlink_port.c index 6e50311faa27..8c27a33f9d7b 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/esw/devlink_port.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/esw/devlink_port.c @@ -268,7 +268,6 @@ void mlx5_esw_offloads_devlink_port_unregister(struct m= lx5_vport *vport) dl_port =3D vport->dl_port; mlx5_esw_devlink_port_res_unregister(&dl_port->dl_port); =20 - mlx5_esw_qos_vport_update_parent(vport, NULL, NULL); devl_rate_leaf_destroy(&dl_port->dl_port); =20 devl_port_unregister(&dl_port->dl_port); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c b/drivers/ne= t/ethernet/mellanox/mlx5/core/esw/qos.c index d04fda4b3778..204f47c99142 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c @@ -1139,18 +1139,10 @@ static void mlx5_esw_qos_vport_disable_locked(struc= t mlx5_vport *vport) void mlx5_esw_qos_vport_disable(struct mlx5_vport *vport) { struct mlx5_eswitch *esw =3D vport->dev->priv.eswitch; - struct mlx5_esw_sched_node *parent; =20 lockdep_assert_held(&esw->state_lock); esw_qos_lock(esw); - if (!vport->qos.sched_node) - goto unlock; - - parent =3D vport->qos.sched_node->parent; - WARN(parent, "Disabling QoS on port before detaching it from node"); - mlx5_esw_qos_vport_disable_locked(vport); -unlock: esw_qos_unlock(esw); } =20 @@ -1866,8 +1858,10 @@ int mlx5_esw_devlink_rate_node_del(struct devlink_ra= te *rate_node, void *priv, return 0; } =20 -int mlx5_esw_qos_vport_update_parent(struct mlx5_vport *vport, struct mlx5= _esw_sched_node *parent, - struct netlink_ext_ack *extack) +static int +mlx5_esw_qos_vport_update_parent(struct mlx5_vport *vport, + struct mlx5_esw_sched_node *parent, + struct netlink_ext_ack *extack) { struct mlx5_eswitch *esw =3D vport->dev->priv.eswitch; int err =3D 0; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/ne= t/ethernet/mellanox/mlx5/core/eswitch.c index a0e2ca87b8d8..b67f15a8f766 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c @@ -1990,6 +1990,13 @@ void mlx5_eswitch_disable_sriov(struct mlx5_eswitch = *esw, bool clear_vf) esw->esw_funcs.num_vfs, esw->esw_funcs.num_ec_vfs, esw->enabled_vports); =20 mlx5_eswitch_invalidate_wq(esw); + + if (esw->mode =3D=3D MLX5_ESWITCH_OFFLOADS) { + struct devlink *devlink =3D priv_to_devlink(esw->dev); + + devl_rate_nodes_destroy(devlink); + } + mlx5_esw_reps_block(esw); =20 if (!mlx5_core_is_ecpf(esw->dev)) { @@ -2003,12 +2010,6 @@ void mlx5_eswitch_disable_sriov(struct mlx5_eswitch = *esw, bool clear_vf) } =20 mlx5_esw_reps_unblock(esw); - - if (esw->mode =3D=3D MLX5_ESWITCH_OFFLOADS) { - struct devlink *devlink =3D priv_to_devlink(esw->dev); - - devl_rate_nodes_destroy(devlink); - } /* Destroy legacy fdb when disabling sriov in legacy mode. */ if (esw->mode =3D=3D MLX5_ESWITCH_LEGACY) mlx5_eswitch_disable_locked(esw); @@ -2039,6 +2040,9 @@ void mlx5_eswitch_disable_locked(struct mlx5_eswitch = *esw) esw->mode =3D=3D MLX5_ESWITCH_LEGACY ? "LEGACY" : "OFFLOADS", esw->esw_funcs.num_vfs, esw->esw_funcs.num_ec_vfs, esw->enabled_vports); =20 + if (esw->mode =3D=3D MLX5_ESWITCH_OFFLOADS) + devl_rate_nodes_destroy(devlink); + if (esw->fdb_table.flags & MLX5_ESW_FDB_CREATED) { esw->fdb_table.flags &=3D ~MLX5_ESW_FDB_CREATED; if (esw->mode =3D=3D MLX5_ESWITCH_OFFLOADS) @@ -2047,9 +2051,6 @@ void mlx5_eswitch_disable_locked(struct mlx5_eswitch = *esw) esw_legacy_disable(esw); mlx5_esw_acls_ns_cleanup(esw); } - - if (esw->mode =3D=3D MLX5_ESWITCH_OFFLOADS) - devl_rate_nodes_destroy(devlink); } =20 void mlx5_eswitch_disable(struct mlx5_eswitch *esw) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h b/drivers/ne= t/ethernet/mellanox/mlx5/core/eswitch.h index fea72b1dedab..140343f2b913 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h @@ -482,8 +482,6 @@ int mlx5_eswitch_set_vport_trust(struct mlx5_eswitch *e= sw, u16 vport_num, bool setting); int mlx5_eswitch_set_vport_rate(struct mlx5_eswitch *esw, u16 vport, u32 max_rate, u32 min_rate); -int mlx5_esw_qos_vport_update_parent(struct mlx5_vport *vport, struct mlx5= _esw_sched_node *node, - struct netlink_ext_ack *extack); int mlx5_eswitch_set_vepa(struct mlx5_eswitch *esw, u8 setting); int mlx5_eswitch_get_vepa(struct mlx5_eswitch *esw, u8 *setting); int mlx5_eswitch_get_vport_config(struct mlx5_eswitch *esw, --=20 2.44.0 From nobody Wed Jul 1 16:10:59 2026 Received: from BL2PR02CU003.outbound.protection.outlook.com (mail-eastusazon11011037.outbound.protection.outlook.com [52.101.52.37]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DBDFF2798EA; Wed, 1 Jul 2026 07:35:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.52.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891340; cv=fail; b=MlL9Qsiv30SB+NzIoLM/HO2+5tmQcKbwg4v3Kosxuy2qN9jVl6PE3TDoYHDMZC6l0VAzvo5ZW1azMiMpcKFklIrdjFTGmgJzAgDe8feQt/hwESYEXm2SBWCvDfHk3CvkjlFrC/ElDbtPtVC63MSla8wbeqP+OrPhXz/1tVloRVY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891340; c=relaxed/simple; bh=ii+YroficNx0hMR+Io/DrsJIQHIDSQjALKkDcv3feyE=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=K1dPUFtcUKD6aXBMj8jJHmyR7ESr7GQ+ugujTRQbB7YHAYGeA6leWqKyXpLJwDBIXH2AilLyorEhYuaFKl7Y00ysqibRyMHz/NTjLAAkXNLgmO2ECNVGMebfEqJeEAn6Tqg8Gc6nkl98qXjFGLiOVxoxClAiTDF7cztivTWdoOk= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=aEquHVbp; arc=fail smtp.client-ip=52.101.52.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="aEquHVbp" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=M3VANZQtzVFt6UOton6u5Fkor2a3LV6hMZERB2GmCwrMpCYjQCBSr/jl8qHFyt/qNp5/89JVMS8f3//n/R+dJJZ9AIwhr78Ei3UvolQZavg/XUi3dXFlUHfirb/O3K+uTmz/x+HgDjElgiAAh5X1DnenK3/zE5eSwAhyNX3XMn4/ZG8plXLykMTt9WO3Mc9Lp1IegrMv0j0vJImuFvbCjMnqKfjSaZfT9gFuJfr30Cg/HMxzR1KeOhKYg2KEz68+yciDFb5ma+oUWds9zw99Q7tHT48YbFiMCGyFbvdjU9UwXxJl5X9xWwhret9tpyys2iavZVxFYt7O2U7GYaKGfg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=VssKR3DAxtrqDdNd6czQlfd/4Px9dNP/mA2N80UXEgM=; b=CQt2/waneZanD6wQ4IXAmWxNFHYR9mhBH+2z4q0VlfJGTXQTvS54QZQWmgRoQUV+Y5Mgvofgq+F4VUAB0Jms3EEGazadxwOb8avxYH/Hb1tHBP3Cwe1NjIHL5lmYhMXUU+Xq0vDoR6ClQKERO7LO1hRdQxGx2oyfSXZWcX6JSUrrCWbBOABgwBdse6YLuALNcYHLFVCtNPQUqPUkBmMvSE0Li5m01oDBuRl43TFjwdLocjJzBSbPWI3aZ7QL9plIpuemLTr6F3Ns9LAC4AYVaMZ4bKR2weH3Hq8xp5cgRBJL/URe4ijMGoEPF50x/qC9yJ4tiMT8U5HjAr/TiQIJDA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=lunn.ch 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=VssKR3DAxtrqDdNd6czQlfd/4Px9dNP/mA2N80UXEgM=; b=aEquHVbpki+i4g78o/QMAjgnfZ/PhWlLhmkF1BeFiMT8eQ5BsXQEV/5PkE1h6rzXyPubLogrfnaIWLKQw1SZxwMOXQ9G0e5Q1ouicQh+s3VheZO7kpLeinqjDj9Q8DemtaVNcBD911DIBwT0z1y4fsjxQOvvKUCTR3ER3qTyZ44vi1XG3GqTlFmC4FVidTcMYIJERdiZa5X4CehWsWXQNfK+Dy/ybLg6PGtzvCA1ZCvNDoCQa6zxCP3KKSFb8L5LyISFRJa6lvp0DT4JGK/ciS8xZkVtNFLfqTYSjCmugV/Ie3xM9kQYwGzaRhit1eVrvzO7ORn843HC2NQLjVhLhA== Received: from DS7PR07CA0009.namprd07.prod.outlook.com (2603:10b6:5:3af::9) by CY8PR12MB7585.namprd12.prod.outlook.com (2603:10b6:930:98::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.8; Wed, 1 Jul 2026 07:35:25 +0000 Received: from DS1PEPF00017095.namprd03.prod.outlook.com (2603:10b6:5:3af:cafe::5c) by DS7PR07CA0009.outlook.office365.com (2603:10b6:5:3af::9) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.181.9 via Frontend Transport; Wed, 1 Jul 2026 07:35:25 +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 DS1PEPF00017095.mail.protection.outlook.com (10.167.17.138) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.6 via Frontend Transport; Wed, 1 Jul 2026 07:35:25 +0000 Received: from rnnvmail205.nvidia.com (10.129.68.10) 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.2562.20; Wed, 1 Jul 2026 00:35:05 -0700 Received: from rnnvmail201.nvidia.com (10.129.68.8) by rnnvmail205.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.2562.20; Wed, 1 Jul 2026 00:35:05 -0700 Received: from vdi.nvidia.com (10.127.8.10) by mail.nvidia.com (10.129.68.8) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Wed, 1 Jul 2026 00:34:55 -0700 From: Tariq Toukan To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , , Paolo Abeni CC: Adithya Jayachandran , Bobby Eshleman , Carolina Jubran , Cosmin Ratiu , Daniel Borkmann , Daniel Jurgens , Daniel Zahka , David Wei , Donald Hunter , Dragos Tatulea , Jiri Pirko , Jiri Pirko , Joe Damato , Jonathan Corbet , Kees Cook , Leon Romanovsky , , , , , Mark Bloch , Moshe Shemesh , Or Har-Toov , Parav Pandit , Petr Machata , Ratheesh Kannoth , Saeed Mahameed , Shahar Shitrit , Shay Drori , Shuah Khan , Shuah Khan , Simon Horman , Stanislav Fomichev , Tariq Toukan , Willem de Bruijn , Gal Pressman Subject: [PATCH net-next V10 10/14] net/mlx5: qos: Model the root node in the scheduling hierarchy Date: Wed, 1 Jul 2026 10:32:50 +0300 Message-ID: <20260701073254.754518-11-tariqt@nvidia.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20260701073254.754518-1-tariqt@nvidia.com> References: <20260701073254.754518-1-tariqt@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS1PEPF00017095:EE_|CY8PR12MB7585:EE_ X-MS-Office365-Filtering-Correlation-Id: 724d6dad-e5b2-479f-ba6c-08ded74350e7 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|36860700016|7416014|376014|1800799024|82310400026|11063799006|56012099006|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: rw3d15FRyGzwZNIu/GZ5qiYynsrHOGHf95sq/edPA2x04ClVRqxVaeFP+rRgkhXtqnClHaexs/JcHddK+CxsiIPQRls73vGNcHXSzmOAk+vtL9iIkHpLHI8KwnjVS1KLEREqIkdxJcgR4FVohfB7KnGVg+7rVt7iq0izvPzuOgtfbk2xdfxDyc0ehMcpcdFHPPTl6/FWCfs7P3EM4XYKegWi1x8Y1CtSytvsCSF0bKtoDXq6dMBpS7wY2AudYABW/gRxt6RDf3AbpVEOgX7MUy1aPHWS0558dvDQmSjMQIcEcvwRcOYGs0b1Dr/TH7iLTvbnBYVCr5hG0phL56pmehbJ0bXA6PvN1DRfpKJn4m6pSX8fzg4h78HHLCNoIOGZ0hp1kGmZ+QYxSuVGPQ71PTgxftOE9UnhT58Ur4IDlDXkcE+KoX/Y07YGou/bufOqx7sIjc21TBz/H1cuxmCyyTY3afVyAGeLGdAme0yqq3nPKHdB5VKsfqNkyXMWPjreqqirA0t7K15q7EcmBNTj7WCclhWyjZpTs3dwWatrg+nD2mM8Inz5xrs5v7IW0DoYUYHeiVvdDDV50xcQ8afNaUrXHChGxO+hcGND0XAdhCdtRBLGqSIpVhJxSC1NyxZ6GuganB0c4jcyoapYJgSNnV1WulxEgm5MfePUjlWxl7BeQ9ZZHUhGyr5FhhrNS09Yz01IakUys98sfZcczuHbwQ== 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)(23010399003)(36860700016)(7416014)(376014)(1800799024)(82310400026)(11063799006)(56012099006)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: pURg1vfq9nQ9KmsCxBumRgmtQ4+S0hzn1rvzCvVnj13gN+n5fEgwMd/8skxolQ/7QIlNFe81uyCRV4+Iwld4sSd1yKBlJrp4LwXR469NnwBwAuC5Zh9eaMoMUEA2LM9D4F64LfsmXPvnJXcal5y4vsce3gIGxADTt0Y+U6LbzLla5L+7Yu8zojFjtRf0EWlKuMosiWru8CKxT+Ab4fu8d8YCcWFGYg8nCMOvtWhCjfnTUlSEf6H/4z/f2GACRgUYvrwQXIfYEaJlkHjP0kWpD7V+5e3DMRbdUbzBrt7SQF6vq+FmfdrTYMpNJJmQAIye9hSrhkQ8yOYd2Pb94z1HLtgV4oMQdCM2n9ztnJPsfIJjumzFc14VUB1sjc4TdOMMgh2iUHjm3+Ix7aVHgrEKWS0wERRfb3f6vhpvSp3mAYN/viANf7ObkHzMKWG9SSEl X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Jul 2026 07:35:25.0819 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 724d6dad-e5b2-479f-ba6c-08ded74350e7 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: DS1PEPF00017095.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY8PR12MB7585 Content-Type: text/plain; charset="utf-8" From: Cosmin Ratiu In commit [1] the concept of the root node in the qos hierarchy was removed due to a bug with how tx_share worked. The side effect is that in many places, there are now corner cases related to parent handling. However, since that change, support for tc_bw was added and now, with upcoming cross-esw support, the code is about to become even more complicated, increasing the number of such corner cases. Bring back the concept of the root node, to which all esw vports and nodes are connected to. This benefits multiple operations which can assume there's always a valid parent and don't have to do ternary gymnastics to determine the correct esw to talk to. As side effect, there's no longer a need to store the groups in the qos domain, since normalization can simply iterate over all children of the root node. Normalization gets simplified as a result. There should be no functionality changes as a result of this change. [1] commit 330f0f6713a3 ("net/mlx5: Remove default QoS group and attach vports directly to root TSAR") Signed-off-by: Cosmin Ratiu Reviewed-by: Carolina Jubran Signed-off-by: Tariq Toukan --- .../net/ethernet/mellanox/mlx5/core/esw/qos.c | 206 ++++++++---------- .../net/ethernet/mellanox/mlx5/core/eswitch.h | 3 +- 2 files changed, 89 insertions(+), 120 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c b/drivers/ne= t/ethernet/mellanox/mlx5/core/esw/qos.c index 204f47c99142..49c8ec0dac9a 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c @@ -15,8 +15,6 @@ struct mlx5_qos_domain { /* Serializes access to all qos changes in the qos domain. */ struct mutex lock; - /* List of all mlx5_esw_sched_nodes. */ - struct list_head nodes; }; =20 static void esw_qos_lock(struct mlx5_eswitch *esw) @@ -43,7 +41,6 @@ static struct mlx5_qos_domain *esw_qos_domain_alloc(void) return NULL; =20 mutex_init(&qos_domain->lock); - INIT_LIST_HEAD(&qos_domain->nodes); =20 return qos_domain; } @@ -62,6 +59,7 @@ static void esw_qos_domain_release(struct mlx5_eswitch *e= sw) } =20 enum sched_node_type { + SCHED_NODE_TYPE_ROOT, SCHED_NODE_TYPE_VPORTS_TSAR, SCHED_NODE_TYPE_VPORT, SCHED_NODE_TYPE_TC_ARBITER_TSAR, @@ -106,18 +104,6 @@ struct mlx5_esw_sched_node { u32 tc_bw[DEVLINK_RATE_TCS_MAX]; }; =20 -static void esw_qos_node_attach_to_parent(struct mlx5_esw_sched_node *node) -{ - if (!node->parent) { - /* Root children are assigned a depth level of 2. */ - node->level =3D 2; - list_add_tail(&node->entry, &node->esw->qos.domain->nodes); - } else { - node->level =3D node->parent->level + 1; - list_add_tail(&node->entry, &node->parent->children); - } -} - static int esw_qos_num_tcs(struct mlx5_core_dev *dev) { int num_tcs =3D mlx5_max_tc(dev) + 1; @@ -125,14 +111,14 @@ static int esw_qos_num_tcs(struct mlx5_core_dev *dev) return num_tcs < DEVLINK_RATE_TCS_MAX ? num_tcs : DEVLINK_RATE_TCS_MAX; } =20 -static void -esw_qos_node_set_parent(struct mlx5_esw_sched_node *node, struct mlx5_esw_= sched_node *parent) +static void esw_qos_node_set_parent(struct mlx5_esw_sched_node *node, + struct mlx5_esw_sched_node *parent) { - list_del_init(&node->entry); node->parent =3D parent; - if (parent) - node->esw =3D parent->esw; - esw_qos_node_attach_to_parent(node); + node->esw =3D parent->esw; + node->level =3D parent->level + 1; + list_del(&node->entry); + list_add_tail(&node->entry, &parent->children); } =20 static void esw_qos_nodes_set_parent(struct list_head *nodes, @@ -321,22 +307,19 @@ static int esw_qos_create_rate_limit_element(struct m= lx5_esw_sched_node *node, return esw_qos_node_create_sched_element(node, sched_ctx, extack); } =20 -static u32 esw_qos_calculate_min_rate_divider(struct mlx5_eswitch *esw, - struct mlx5_esw_sched_node *parent) +static u32 +esw_qos_calculate_min_rate_divider(struct mlx5_esw_sched_node *parent) { - struct list_head *nodes =3D parent ? &parent->children : &esw->qos.domain= ->nodes; - u32 fw_max_bw_share =3D MLX5_CAP_QOS(esw->dev, max_tsar_bw_share); + u32 fw_max_bw_share =3D MLX5_CAP_QOS(parent->esw->dev, max_tsar_bw_share); struct mlx5_esw_sched_node *node; u32 max_guarantee =3D 0; =20 /* Find max min_rate across all nodes. * This will correspond to fw_max_bw_share in the final bw_share calculat= ion. */ - list_for_each_entry(node, nodes, entry) { - if (node->esw =3D=3D esw && node->ix !=3D esw->qos.root_tsar_ix && - node->min_rate > max_guarantee) + list_for_each_entry(node, &parent->children, entry) + if (node->min_rate > max_guarantee) max_guarantee =3D node->min_rate; - } =20 if (max_guarantee) return max_t(u32, max_guarantee / fw_max_bw_share, 1); @@ -368,18 +351,13 @@ static void esw_qos_update_sched_node_bw_share(struct= mlx5_esw_sched_node *node, esw_qos_sched_elem_config(node, node->max_rate, bw_share, extack); } =20 -static void esw_qos_normalize_min_rate(struct mlx5_eswitch *esw, - struct mlx5_esw_sched_node *parent, +static void esw_qos_normalize_min_rate(struct mlx5_esw_sched_node *parent, struct netlink_ext_ack *extack) { - struct list_head *nodes =3D parent ? &parent->children : &esw->qos.domain= ->nodes; - u32 divider =3D esw_qos_calculate_min_rate_divider(esw, parent); + u32 divider =3D esw_qos_calculate_min_rate_divider(parent); struct mlx5_esw_sched_node *node; =20 - list_for_each_entry(node, nodes, entry) { - if (node->esw !=3D esw || node->ix =3D=3D esw->qos.root_tsar_ix) - continue; - + list_for_each_entry(node, &parent->children, entry) { /* Vports TC TSARs don't have a minimum rate configured, * so there's no need to update the bw_share on them. */ @@ -391,7 +369,7 @@ static void esw_qos_normalize_min_rate(struct mlx5_eswi= tch *esw, if (list_empty(&node->children)) continue; =20 - esw_qos_normalize_min_rate(node->esw, node, extack); + esw_qos_normalize_min_rate(node, extack); } } =20 @@ -412,14 +390,11 @@ static u32 esw_qos_calculate_tc_bw_divider(u32 *tc_bw) static int esw_qos_set_node_min_rate(struct mlx5_esw_sched_node *node, u32 min_rate, struct netlink_ext_ack *extack) { - struct mlx5_eswitch *esw =3D node->esw; - if (min_rate =3D=3D node->min_rate) return 0; =20 node->min_rate =3D min_rate; - esw_qos_normalize_min_rate(esw, node->parent, extack); - + esw_qos_normalize_min_rate(node->parent, extack); return 0; } =20 @@ -472,8 +447,7 @@ esw_qos_vport_create_sched_element(struct mlx5_esw_sche= d_node *vport_node, SCHEDULING_CONTEXT_ELEMENT_TYPE_VPORT); attr =3D MLX5_ADDR_OF(scheduling_context, sched_ctx, element_attributes); MLX5_SET(vport_element, attr, vport_number, vport_node->vport->vport); - MLX5_SET(scheduling_context, sched_ctx, parent_element_id, - parent ? parent->ix : vport_node->esw->qos.root_tsar_ix); + MLX5_SET(scheduling_context, sched_ctx, parent_element_id, parent->ix); MLX5_SET(scheduling_context, sched_ctx, max_average_bw, vport_node->max_rate); =20 @@ -513,7 +487,7 @@ esw_qos_vport_tc_create_sched_element(struct mlx5_esw_s= ched_node *vport_tc_node, } =20 static struct mlx5_esw_sched_node * -__esw_qos_alloc_node(struct mlx5_eswitch *esw, u32 tsar_ix, enum sched_nod= e_type type, +__esw_qos_alloc_node(u32 tsar_ix, enum sched_node_type type, struct mlx5_esw_sched_node *parent) { struct mlx5_esw_sched_node *node; @@ -522,20 +496,12 @@ __esw_qos_alloc_node(struct mlx5_eswitch *esw, u32 ts= ar_ix, enum sched_node_type if (!node) return NULL; =20 - node->esw =3D esw; node->ix =3D tsar_ix; node->type =3D type; - node->parent =3D parent; INIT_LIST_HEAD(&node->children); - esw_qos_node_attach_to_parent(node); - if (!parent) { - /* The caller is responsible for inserting the node into the - * parent list if necessary. This function can also be used with - * a NULL parent, which doesn't necessarily indicate that it - * refers to the root scheduling element. - */ - list_del_init(&node->entry); - } + INIT_LIST_HEAD(&node->entry); + if (parent) + esw_qos_node_set_parent(node, parent); =20 return node; } @@ -570,7 +536,7 @@ static int esw_qos_create_vports_tc_node(struct mlx5_es= w_sched_node *parent, SCHEDULING_HIERARCHY_E_SWITCH)) return -EOPNOTSUPP; =20 - vports_tc_node =3D __esw_qos_alloc_node(parent->esw, 0, + vports_tc_node =3D __esw_qos_alloc_node(0, SCHED_NODE_TYPE_VPORTS_TC_TSAR, parent); if (!vports_tc_node) { @@ -665,7 +631,6 @@ static int esw_qos_create_tc_arbiter_sched_elem( struct netlink_ext_ack *extack) { u32 tsar_ctx[MLX5_ST_SZ_DW(scheduling_context)] =3D {}; - u32 tsar_parent_ix; void *attr; =20 if (!mlx5_qos_tsar_type_supported(tc_arbiter_node->esw->dev, @@ -678,10 +643,8 @@ static int esw_qos_create_tc_arbiter_sched_elem( =20 attr =3D MLX5_ADDR_OF(scheduling_context, tsar_ctx, element_attributes); MLX5_SET(tsar_element, attr, tsar_type, TSAR_ELEMENT_TSAR_TYPE_TC_ARB); - tsar_parent_ix =3D tc_arbiter_node->parent ? tc_arbiter_node->parent->ix : - tc_arbiter_node->esw->qos.root_tsar_ix; MLX5_SET(scheduling_context, tsar_ctx, parent_element_id, - tsar_parent_ix); + tc_arbiter_node->parent->ix); MLX5_SET(scheduling_context, tsar_ctx, element_type, SCHEDULING_CONTEXT_ELEMENT_TYPE_TSAR); MLX5_SET(scheduling_context, tsar_ctx, max_average_bw, @@ -694,37 +657,36 @@ static int esw_qos_create_tc_arbiter_sched_elem( } =20 static struct mlx5_esw_sched_node * -__esw_qos_create_vports_sched_node(struct mlx5_eswitch *esw, struct mlx5_e= sw_sched_node *parent, +__esw_qos_create_vports_sched_node(struct mlx5_esw_sched_node *parent, struct netlink_ext_ack *extack) { struct mlx5_esw_sched_node *node; - u32 tsar_ix; int err; + u32 ix; =20 - err =3D esw_qos_create_node_sched_elem(esw->dev, esw->qos.root_tsar_ix, 0, - 0, &tsar_ix); + err =3D esw_qos_create_node_sched_elem(parent->esw->dev, parent->ix, 0, 0, + &ix); if (err) { NL_SET_ERR_MSG_MOD(extack, "E-Switch create TSAR for node failed"); return ERR_PTR(err); } =20 - node =3D __esw_qos_alloc_node(esw, tsar_ix, SCHED_NODE_TYPE_VPORTS_TSAR, = parent); + node =3D __esw_qos_alloc_node(ix, SCHED_NODE_TYPE_VPORTS_TSAR, parent); if (!node) { NL_SET_ERR_MSG_MOD(extack, "E-Switch alloc node failed"); err =3D -ENOMEM; goto err_alloc_node; } =20 - list_add_tail(&node->entry, &esw->qos.domain->nodes); - esw_qos_normalize_min_rate(esw, NULL, extack); - trace_mlx5_esw_node_qos_create(esw->dev, node, node->ix); + esw_qos_normalize_min_rate(parent, extack); + trace_mlx5_esw_node_qos_create(parent->esw->dev, node, node->ix); =20 return node; =20 err_alloc_node: - if (mlx5_destroy_scheduling_element_cmd(esw->dev, + if (mlx5_destroy_scheduling_element_cmd(parent->esw->dev, SCHEDULING_HIERARCHY_E_SWITCH, - tsar_ix)) + ix)) NL_SET_ERR_MSG_MOD(extack, "E-Switch destroy TSAR for node failed"); return ERR_PTR(err); } @@ -746,7 +708,7 @@ esw_qos_create_vports_sched_node(struct mlx5_eswitch *e= sw, struct netlink_ext_ac if (err) return ERR_PTR(err); =20 - node =3D __esw_qos_create_vports_sched_node(esw, NULL, extack); + node =3D __esw_qos_create_vports_sched_node(esw->qos.root, extack); if (IS_ERR(node)) esw_qos_put(esw); =20 @@ -762,38 +724,47 @@ static void __esw_qos_destroy_node(struct mlx5_esw_sc= hed_node *node, struct netl =20 trace_mlx5_esw_node_qos_destroy(esw->dev, node, node->ix); esw_qos_destroy_node(node, extack); - esw_qos_normalize_min_rate(esw, NULL, extack); + esw_qos_normalize_min_rate(esw->qos.root, extack); } =20 static int esw_qos_create(struct mlx5_eswitch *esw, struct netlink_ext_ack= *extack) { struct mlx5_core_dev *dev =3D esw->dev; + struct mlx5_esw_sched_node *root; + u32 root_ix; int err; =20 if (!MLX5_CAP_GEN(dev, qos) || !MLX5_CAP_QOS(dev, esw_scheduling)) return -EOPNOTSUPP; =20 - err =3D esw_qos_create_node_sched_elem(esw->dev, 0, 0, 0, - &esw->qos.root_tsar_ix); + err =3D esw_qos_create_node_sched_elem(esw->dev, 0, 0, 0, &root_ix); if (err) { esw_warn(dev, "E-Switch create root TSAR failed (%d)\n", err); return err; } =20 + root =3D __esw_qos_alloc_node(root_ix, SCHED_NODE_TYPE_ROOT, NULL); + if (!root) { + esw_warn(dev, "E-Switch create root node failed\n"); + err =3D -ENOMEM; + goto out_err; + } + root->esw =3D esw; + root->level =3D 1; + esw->qos.root =3D root; refcount_set(&esw->qos.refcnt, 1); =20 return 0; +out_err: + mlx5_destroy_scheduling_element_cmd(dev, SCHEDULING_HIERARCHY_E_SWITCH, + root_ix); + return err; } =20 static void esw_qos_destroy(struct mlx5_eswitch *esw) { - int err; - - err =3D mlx5_destroy_scheduling_element_cmd(esw->dev, - SCHEDULING_HIERARCHY_E_SWITCH, - esw->qos.root_tsar_ix); - if (err) - esw_warn(esw->dev, "E-Switch destroy root TSAR failed (%d)\n", err); + esw_qos_destroy_node(esw->qos.root, NULL); + esw->qos.root =3D NULL; } =20 static int esw_qos_get(struct mlx5_eswitch *esw, struct netlink_ext_ack *e= xtack) @@ -866,8 +837,7 @@ esw_qos_create_vport_tc_sched_node(struct mlx5_vport *v= port, u8 tc =3D vports_tc_node->tc; int err; =20 - vport_tc_node =3D __esw_qos_alloc_node(vport_node->esw, 0, - SCHED_NODE_TYPE_VPORT_TC, + vport_tc_node =3D __esw_qos_alloc_node(0, SCHED_NODE_TYPE_VPORT_TC, vports_tc_node); if (!vport_tc_node) return -ENOMEM; @@ -959,7 +929,7 @@ esw_qos_vport_tc_enable(struct mlx5_vport *vport, enum = sched_node_type type, /* Increase the parent's level by 2 to account for both the * TC arbiter and the vports TC scheduling element. */ - new_level =3D (parent ? parent->level : 2) + 2; + new_level =3D parent->level + 2; max_level =3D 1 << MLX5_CAP_QOS(vport_node->esw->dev, log_esw_max_sched_depth); if (new_level > max_level) { @@ -997,7 +967,7 @@ esw_qos_vport_tc_enable(struct mlx5_vport *vport, enum = sched_node_type type, err_sched_nodes: if (type =3D=3D SCHED_NODE_TYPE_RATE_LIMITER) { esw_qos_node_destroy_sched_element(vport_node, NULL); - esw_qos_node_attach_to_parent(vport_node); + esw_qos_node_set_parent(vport_node, vport_node->parent); } else { esw_qos_tc_arbiter_scheduling_teardown(vport_node, NULL); } @@ -1055,7 +1025,7 @@ static void esw_qos_vport_disable(struct mlx5_vport *= vport, struct netlink_ext_a vport_node->bw_share =3D 0; memset(vport_node->tc_bw, 0, sizeof(vport_node->tc_bw)); list_del_init(&vport_node->entry); - esw_qos_normalize_min_rate(vport_node->esw, vport_node->parent, extack); + esw_qos_normalize_min_rate(vport_node->parent, extack); =20 trace_mlx5_esw_vport_qos_destroy(vport_node->esw->dev, vport); } @@ -1068,7 +1038,7 @@ static int esw_qos_vport_enable(struct mlx5_vport *vp= ort, struct mlx5_esw_sched_node *vport_node =3D vport->qos.sched_node; int err; =20 - esw_assert_qos_lock_held(vport->dev->priv.eswitch); + esw_assert_qos_lock_held(vport_node->esw); =20 esw_qos_node_set_parent(vport_node, parent); if (type =3D=3D SCHED_NODE_TYPE_VPORT) @@ -1079,7 +1049,7 @@ static int esw_qos_vport_enable(struct mlx5_vport *vp= ort, return err; =20 vport_node->type =3D type; - esw_qos_normalize_min_rate(vport_node->esw, parent, extack); + esw_qos_normalize_min_rate(parent, extack); trace_mlx5_esw_vport_qos_create(vport->dev, vport, vport_node->max_rate, vport_node->bw_share); =20 @@ -1092,7 +1062,6 @@ static int mlx5_esw_qos_vport_enable(struct mlx5_vpor= t *vport, enum sched_node_t { struct mlx5_eswitch *esw =3D vport->dev->priv.eswitch; struct mlx5_esw_sched_node *sched_node; - struct mlx5_eswitch *parent_esw; int err; =20 esw_assert_qos_lock_held(esw); @@ -1100,14 +1069,13 @@ static int mlx5_esw_qos_vport_enable(struct mlx5_vp= ort *vport, enum sched_node_t if (err) return err; =20 - parent_esw =3D parent ? parent->esw : esw; - sched_node =3D __esw_qos_alloc_node(parent_esw, 0, type, parent); + if (!parent) + parent =3D esw->qos.root; + sched_node =3D __esw_qos_alloc_node(0, type, parent); if (!sched_node) { esw_qos_put(esw); return -ENOMEM; } - if (!parent) - list_add_tail(&sched_node->entry, &esw->qos.domain->nodes); =20 sched_node->max_rate =3D max_rate; sched_node->min_rate =3D min_rate; @@ -1279,10 +1247,9 @@ static int esw_qos_vport_update_parent(struct mlx5_v= port *vport, struct mlx5_esw /* Set vport QoS type based on parent node type if different from * default QoS; otherwise, use the vport's current QoS type. */ - if (parent && parent->type =3D=3D SCHED_NODE_TYPE_TC_ARBITER_TSAR) + if (parent->type =3D=3D SCHED_NODE_TYPE_TC_ARBITER_TSAR) type =3D SCHED_NODE_TYPE_RATE_LIMITER; - else if (curr_parent && - curr_parent->type =3D=3D SCHED_NODE_TYPE_TC_ARBITER_TSAR) + else if (curr_parent->type =3D=3D SCHED_NODE_TYPE_TC_ARBITER_TSAR) type =3D SCHED_NODE_TYPE_VPORT; else type =3D vport->qos.sched_node->type; @@ -1311,11 +1278,9 @@ static int esw_qos_switch_tc_arbiter_node_to_vports( struct mlx5_esw_sched_node *node, struct netlink_ext_ack *extack) { - u32 parent_tsar_ix =3D node->parent ? - node->parent->ix : node->esw->qos.root_tsar_ix; int err; =20 - err =3D esw_qos_create_node_sched_elem(node->esw->dev, parent_tsar_ix, + err =3D esw_qos_create_node_sched_elem(node->esw->dev, node->parent->ix, node->max_rate, node->bw_share, &node->ix); if (err) { @@ -1370,8 +1335,8 @@ esw_qos_move_node(struct mlx5_esw_sched_node *curr_no= de) { struct mlx5_esw_sched_node *new_node; =20 - new_node =3D __esw_qos_alloc_node(curr_node->esw, curr_node->ix, - curr_node->type, NULL); + new_node =3D __esw_qos_alloc_node(curr_node->ix, curr_node->type, + curr_node->parent); if (!new_node) return ERR_PTR(-ENOMEM); =20 @@ -1595,9 +1560,8 @@ static bool esw_qos_vport_validate_unsupported_tc_bw(= struct mlx5_vport *vport, u32 *tc_bw) { struct mlx5_esw_sched_node *node =3D vport->qos.sched_node; - struct mlx5_eswitch *esw =3D vport->dev->priv.eswitch; - - esw =3D (node && node->parent) ? node->parent->esw : esw; + struct mlx5_eswitch *esw =3D node ? + node->parent->esw : vport->dev->priv.eswitch; =20 return esw_qos_validate_unsupported_tc_bw(esw, tc_bw); } @@ -1622,8 +1586,9 @@ static void esw_vport_qos_prune_empty(struct mlx5_vpo= rt *vport) if (!vport_node) return; =20 - if (vport_node->parent || vport_node->max_rate || - vport_node->min_rate || !esw_qos_tc_bw_disabled(vport_node->tc_bw)) + if (vport_node->parent !=3D vport_node->esw->qos.root || + vport_node->max_rate || vport_node->min_rate || + !esw_qos_tc_bw_disabled(vport_node->tc_bw)) return; =20 mlx5_esw_qos_vport_disable_locked(vport); @@ -1880,7 +1845,9 @@ mlx5_esw_qos_vport_update_parent(struct mlx5_vport *v= port, err =3D mlx5_esw_qos_vport_enable(vport, type, parent, 0, 0, extack); } else if (vport->qos.sched_node) { - err =3D esw_qos_vport_update_parent(vport, parent, extack); + err =3D esw_qos_vport_update_parent(vport, + parent ? : esw->qos.root, + extack); } esw_qos_unlock(esw); return err; @@ -1928,7 +1895,7 @@ mlx5_esw_qos_node_validate_set_parent(struct mlx5_esw= _sched_node *node, { u8 new_level, max_level; =20 - if (parent && parent->esw !=3D node->esw) { + if (parent->esw !=3D node->esw) { NL_SET_ERR_MSG_MOD(extack, "Cannot assign node to another E-Switch"); return -EOPNOTSUPP; @@ -1940,13 +1907,13 @@ mlx5_esw_qos_node_validate_set_parent(struct mlx5_e= sw_sched_node *node, return -EOPNOTSUPP; } =20 - if (parent && parent->type =3D=3D SCHED_NODE_TYPE_TC_ARBITER_TSAR) { + if (parent->type =3D=3D SCHED_NODE_TYPE_TC_ARBITER_TSAR) { NL_SET_ERR_MSG_MOD(extack, "Cannot attach a node to a parent with TC bandwidth configured"); return -EOPNOTSUPP; } =20 - new_level =3D parent ? parent->level + 1 : 2; + new_level =3D parent->level + 1; if (node->type =3D=3D SCHED_NODE_TYPE_TC_ARBITER_TSAR) { /* Increase by one to account for the vports TC scheduling * element. @@ -1997,14 +1964,12 @@ static int esw_qos_vports_node_update_parent(struct= mlx5_esw_sched_node *node, { struct mlx5_esw_sched_node *curr_parent =3D node->parent; struct mlx5_eswitch *esw =3D node->esw; - u32 parent_ix; int err; =20 - parent_ix =3D parent ? parent->ix : node->esw->qos.root_tsar_ix; mlx5_destroy_scheduling_element_cmd(esw->dev, SCHEDULING_HIERARCHY_E_SWITCH, node->ix); - err =3D esw_qos_create_node_sched_elem(esw->dev, parent_ix, + err =3D esw_qos_create_node_sched_elem(esw->dev, parent->ix, node->max_rate, 0, &node->ix); if (err) { NL_SET_ERR_MSG_MOD(extack, @@ -2031,12 +1996,15 @@ static int mlx5_esw_qos_node_update_parent(struct m= lx5_esw_sched_node *node, struct mlx5_eswitch *esw =3D node->esw; int err; =20 + esw_qos_lock(esw); + curr_parent =3D node->parent; + if (!parent) + parent =3D esw->qos.root; + err =3D mlx5_esw_qos_node_validate_set_parent(node, parent, extack); if (err) - return err; + goto out; =20 - esw_qos_lock(esw); - curr_parent =3D node->parent; if (node->type =3D=3D SCHED_NODE_TYPE_TC_ARBITER_TSAR) { err =3D esw_qos_tc_arbiter_node_update_parent(node, parent, extack); @@ -2047,8 +2015,8 @@ static int mlx5_esw_qos_node_update_parent(struct mlx= 5_esw_sched_node *node, if (err) goto out; =20 - esw_qos_normalize_min_rate(esw, curr_parent, extack); - esw_qos_normalize_min_rate(esw, parent, extack); + esw_qos_normalize_min_rate(curr_parent, extack); + esw_qos_normalize_min_rate(parent, extack); =20 out: esw_qos_unlock(esw); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h b/drivers/ne= t/ethernet/mellanox/mlx5/core/eswitch.h index 140343f2b913..10c4eacd43b4 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h @@ -415,8 +415,9 @@ struct mlx5_eswitch { struct { /* Initially 0, meaning no QoS users and QoS is disabled. */ refcount_t refcnt; - u32 root_tsar_ix; struct mlx5_qos_domain *domain; + /* The root node of the hierarchy. */ + struct mlx5_esw_sched_node *root; } qos; =20 struct mlx5_esw_bridge_offloads *br_offloads; --=20 2.44.0 From nobody Wed Jul 1 16:10:59 2026 Received: from SA9PR02CU001.outbound.protection.outlook.com (mail-southcentralusazon11013030.outbound.protection.outlook.com [40.93.196.30]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B5B6E3C1400; Wed, 1 Jul 2026 07:36:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.196.30 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891380; cv=fail; b=pfYrkxNsn2quz5FjuL/ifbuWZGGDz2yJ3/WVYn0BaLUGCOgC9diJvehWLocRqvHK3BSjrLB6f5P8OPgTRurdv9i3BtuIUgVbRspJaE9KQA6wGulahz8qy3VgxUySSjjcymCkRoddmQJbebGEdbHDKdufqUYr0TT1qt9pLoEjRdM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891380; c=relaxed/simple; bh=NOFOEDjnrrv+RlKLNLXCpfY9L78P2u6TA+03+WRY1PU=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ijsu6pLhoguQzmt5lD74Ub5l9QVUOyaqF5sHwUZa3IG/+VEXWamIXguSFjtSxbZDorSR0RK1Wn4Sb6M4q+2c6q8AorEl5kU9Uk17nRrPA5JL5CKf4Wen1bqy9KJysmsOcWfQKkEf3gm/ziOMfbk95kqndPJ4fijedc4g78gBehM= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=m1i3r72e; arc=fail smtp.client-ip=40.93.196.30 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="m1i3r72e" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=jBZmtAwEdQvsb+jyqFDZCz5wt8cMOf/KFzLLIz+Jh0LydAxk8SrJEDcI2u2oRjqLR50qC9UvfsNxAkF6ZCtpxkyp0U3wcsg79b4bAvGuSWNJyGqtBxZwjMKHSGEyFAgpNIoNrqsElZ8gaNZe4q3GarNk50n2sPRLcR69BqLmKfjMj+MHibvUzlRiGsXvus+VYWJEeI9agDqRLYSzrdiXY8sl0T1qU7945Dp0TdAmkFn26lWgfvvfowpgPc92azvG+m6jlKxKTiSz/Qo4lyBoDyB3+sHzPN3TYRinNq4H7kP46NAilTue9Ttw3TMbGFnW3NZb7fSmhMRTp+QxjQEYxQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=FX0nF7IBVtQB/aJLNh9XN2HqHt34OLEuNQvqpwAB4xQ=; b=JvSR2I+1vPIEY7PXSMINDBsXUQPJO+/LL0pyNW5Eg7WV9qSVwUpIe+2T8ZPjSOPz5AmFeX5R47/NGKlhIiDyQhPPVTYBuCtHUPeIyqAmhX3gaWZ4LZL0LIl3DezXuoPDXjvmYn1MisUEnxwHHZA+o2jbgTlFfl1naBsNR1rI5JzTiue0rfTGovp2gMf6KFbny7rcs6Q933901doJpq7ruZ4+40AU6hKSVZcF4GxpblMH8HqJyLch3oHnTh9rJsE66BK9GZIEi9qZDHduI9AnuYcAmg7140jB1extfMtJxvXcyNENwRhtPPjweDLlvv1WhCmqAh+L4Zs4WlgC5+gHvA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=lunn.ch 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=FX0nF7IBVtQB/aJLNh9XN2HqHt34OLEuNQvqpwAB4xQ=; b=m1i3r72evMhmubne9v3bICZQp1+ua+6+5FslDc8bXBnHdD5zXJgqJ/+uWRoijwx43hcVvWVyd0qCG32KsPI/pJQsJmIi+eLwnlN675hTd8y+oBsk4wmon6xzI7z2yQ87WTql+rQinp6tl+RtbYgD0M8R5EpoaLvDrDfjYOxXG3/YkQgyW+/0oQjTcrw7kSVKPwISBbo4yv+gl5pVkSkbZuWh6kFCgH6ESuD5O4ooc2+wEEVwcxsct4337j1h9IZHI8vlV88Ae6ya1lhtSSs4oUsp+no4bJ4SXaUhhaqiIpMkxDZOHFuSJwDvKybS+o+x2SDi3iesTxqHKdXZeZAAdg== Received: from BL1PR13CA0341.namprd13.prod.outlook.com (2603:10b6:208:2c6::16) by CY8PR12MB7513.namprd12.prod.outlook.com (2603:10b6:930:91::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.8; Wed, 1 Jul 2026 07:36:07 +0000 Received: from BN2PEPF00004FBD.namprd04.prod.outlook.com (2603:10b6:208:2c6:cafe::a6) by BL1PR13CA0341.outlook.office365.com (2603:10b6:208:2c6::16) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.181.8 via Frontend Transport; Wed, 1 Jul 2026 07:36:07 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) 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.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by BN2PEPF00004FBD.mail.protection.outlook.com (10.167.243.183) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.6 via Frontend Transport; Wed, 1 Jul 2026 07:36:06 +0000 Received: from rnnvmail202.nvidia.com (10.129.68.7) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 1 Jul 2026 00:35:16 -0700 Received: from rnnvmail201.nvidia.com (10.129.68.8) by rnnvmail202.nvidia.com (10.129.68.7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 1 Jul 2026 00:35:15 -0700 Received: from vdi.nvidia.com (10.127.8.10) by mail.nvidia.com (10.129.68.8) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Wed, 1 Jul 2026 00:35:05 -0700 From: Tariq Toukan To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , , Paolo Abeni CC: Adithya Jayachandran , Bobby Eshleman , Carolina Jubran , Cosmin Ratiu , Daniel Borkmann , Daniel Jurgens , Daniel Zahka , David Wei , Donald Hunter , Dragos Tatulea , Jiri Pirko , Jiri Pirko , Joe Damato , Jonathan Corbet , Kees Cook , Leon Romanovsky , , , , , Mark Bloch , Moshe Shemesh , Or Har-Toov , Parav Pandit , Petr Machata , Ratheesh Kannoth , Saeed Mahameed , Shahar Shitrit , Shay Drori , Shuah Khan , Shuah Khan , Simon Horman , Stanislav Fomichev , Tariq Toukan , Willem de Bruijn , Gal Pressman Subject: [PATCH net-next V10 11/14] net/mlx5: qos: Remove qos domains and use shd Date: Wed, 1 Jul 2026 10:32:51 +0300 Message-ID: <20260701073254.754518-12-tariqt@nvidia.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20260701073254.754518-1-tariqt@nvidia.com> References: <20260701073254.754518-1-tariqt@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN2PEPF00004FBD:EE_|CY8PR12MB7513:EE_ X-MS-Office365-Filtering-Correlation-Id: 45206b27-09e2-4a77-e998-08ded74369e2 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|1800799024|36860700016|376014|7416014|23010399003|22082099003|18002099003|5023799004|11063799006|56012099006|13003099007; X-Microsoft-Antispam-Message-Info: IA0h0R7/YLP3HZUgzVblCt8seOJmwi52Sj+GeH/jTUm1tUCMHYejWNpgQo7rZ8xeEFtz7bRhc4CI2y5un0K4Apd4sqKlDQdHQ9do7doPRsYgFDtjgY7o+Zg/jii6S7xRAwj0t+RJ3vBcP9j4gj+2HLk96H9w/ptGONOwzq/53VaBBxWvRlm1g2FS/ZDLLrvJK2ze3LG5lNygyocmxS3EhRhwFUF/TaKIOzaVOqTfBreXBnAcoZ180oKr4mJ3D30OByFmWE8mE74Iv5l/4OMHL2opi1FRpzP3AvyEVtpeIeOfQ7JiFqG6WsyW1JWWseNDQCnkKTELPCbXI8TohOuLi2NJOsqA/Qa7OHYa0NYl+mgjchpN4GyM3sZT9SA1nylN6sjQ+ke9inLKxU9P6nAgRG8MNIMDoZsL/QYV9uW/Ac72OrZC0linm6SPegT6ao3568Ye75LdCGrv3CPLoZOHJc6fGRW2Hknx8fsa/ljGtZAJEJYe9/3TZ/SXSfhck+3vnnPmYUjmolHnurm9XRcre0GytAusc5zwiAvAKnSy9hGIcDDAIbdpChRhPg351AIwzIq7Mnj6aypDHORFGPYckyfcO4gnbTAjSnvzMo87y1x+xvFBPgJ52KiKDkfpzCe37j7levJQs+jWVrk4nPWMckxbnzrq1ksvqzDmOIETh9k58gHvU/GP7RuIV8DInVCzxCNmipE21+QEJF6OBMR5Iw== X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(82310400026)(1800799024)(36860700016)(376014)(7416014)(23010399003)(22082099003)(18002099003)(5023799004)(11063799006)(56012099006)(13003099007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: bdADGuCn0QpRHVJ27yHLh3llRtTRzMi86Htd0VyWClDUuT4Fm/Xq1CtpJtrRqKXNPe81VmraEhVu9ZMKRUNr9D6KL5CTFKpj4tlEUPaHiM/LYeS9kK3Ae+XnAsSLehChLvnnkrwz/qzaKmw0K0YF3MlpvFpdC3XYWC2JjQ/P/pd11kqFXRYhKcDf245ctAj2RSEDsU1zeJayEDvBjWESGfkYtUVxQadOv8PCO3Slgs9VAeVbFc7VW7UwMWSxiYiHV5UXJwdib9NvMbV9h3j4XqAEBgqO7Z9Fo0mC/S0aPxJ1m8f/WrsXCIQFCE2VF8ZkaSxRlFty0De4r2/OMDi3RWSrjnPbCoGGHXTgHquop8sdc/rkGKTho5+RYBqt5UNX4ilccfzMXupQ8S3ouPL/mjPlSF5ZfGfu17ZPfsEtOzorTqTZHPYxRP4+YAEPLIub X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Jul 2026 07:36:06.8996 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 45206b27-09e2-4a77-e998-08ded74369e2 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.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN2PEPF00004FBD.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY8PR12MB7513 Content-Type: text/plain; charset="utf-8" From: Cosmin Ratiu E-Switch QoS domains were added with the intention of eventually implementing shared qos domains to support cross-esw scheduling in the previous approach ([1]), but they are no longer necessary in the new approach. Remove QoS domains and switch to using the shd lock for protecting against concurrent QoS modifications. Enable the supported_cross_device_rate_nodes devlink ops attribute so that all calls originating from devlink rate acquire the shd lock. Only the additional entry points into QoS need to acquire the shd lock. The wrinkle is that since shd can be NULL (e.g. on older HW without serial number available), there needs to be a fallback locking mechanism. The devlink instance lock cannot be used, as some code paths into QoS (get, set & modify vport rate) happen with RTNL held, and the existing devlink -> RTNL order prevents devlink lock usage there. The other two options are either esw->state_lock or a new lock as fallback when shd is NULL. This patch adds esw->state_lock, which implies: - 3 new lock/unlock helper pairs to acquire/release the missing lock: - esw_qos_{,un}lock: acquire/release esw->state_lock when shd is NULL. - esw_qos_shd_{,un}lock: when esw->state_lock is already held. - esw_qos_devlink_{,un}lock: when shd is already held. - esw_assert_qos_lock_held now asserts esw->state_lock is held when shd is NULL. Use the corresponding lock/unlock function in all places where either shd or state_lock would need to be acquired. Document all of this trickery next to esw_assert_qos_lock_held. Enabling supported_cross_device_rate_nodes now is safe, because mlx5_esw_qos_vport_update_parent rejects cross-esw parent updates. This will change in the next patch. [1] https://lore.kernel.org/netdev/20250213180134.323929-1-tariqt@nvidia.com/ Signed-off-by: Cosmin Ratiu Reviewed-by: Carolina Jubran Signed-off-by: Tariq Toukan --- .../net/ethernet/mellanox/mlx5/core/devlink.c | 1 + .../net/ethernet/mellanox/mlx5/core/esw/qos.c | 245 ++++++++---------- .../net/ethernet/mellanox/mlx5/core/esw/qos.h | 3 - .../net/ethernet/mellanox/mlx5/core/eswitch.c | 8 - .../net/ethernet/mellanox/mlx5/core/eswitch.h | 13 +- 5 files changed, 120 insertions(+), 150 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/devlink.c b/drivers/ne= t/ethernet/mellanox/mlx5/core/devlink.c index c31e05529fc4..b9026cc64383 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/devlink.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/devlink.c @@ -383,6 +383,7 @@ static const struct devlink_ops mlx5_devlink_ops =3D { .rate_node_del =3D mlx5_esw_devlink_rate_node_del, .rate_leaf_parent_set =3D mlx5_esw_devlink_rate_leaf_parent_set, .rate_node_parent_set =3D mlx5_esw_devlink_rate_node_parent_set, + .supported_cross_device_rate_nodes =3D true, #endif #ifdef CONFIG_MLX5_SF_MANAGER .port_new =3D mlx5_devlink_sf_port_new, diff --git a/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c b/drivers/ne= t/ethernet/mellanox/mlx5/core/esw/qos.c index 49c8ec0dac9a..80a28596349b 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c @@ -11,53 +11,6 @@ /* Minimum supported BW share value by the HW is 1 Mbit/sec */ #define MLX5_MIN_BW_SHARE 1 =20 -/* Holds rate nodes associated with an E-Switch. */ -struct mlx5_qos_domain { - /* Serializes access to all qos changes in the qos domain. */ - struct mutex lock; -}; - -static void esw_qos_lock(struct mlx5_eswitch *esw) -{ - mutex_lock(&esw->qos.domain->lock); -} - -static void esw_qos_unlock(struct mlx5_eswitch *esw) -{ - mutex_unlock(&esw->qos.domain->lock); -} - -static void esw_assert_qos_lock_held(struct mlx5_eswitch *esw) -{ - lockdep_assert_held(&esw->qos.domain->lock); -} - -static struct mlx5_qos_domain *esw_qos_domain_alloc(void) -{ - struct mlx5_qos_domain *qos_domain; - - qos_domain =3D kzalloc_obj(*qos_domain); - if (!qos_domain) - return NULL; - - mutex_init(&qos_domain->lock); - - return qos_domain; -} - -static int esw_qos_domain_init(struct mlx5_eswitch *esw) -{ - esw->qos.domain =3D esw_qos_domain_alloc(); - - return esw->qos.domain ? 0 : -ENOMEM; -} - -static void esw_qos_domain_release(struct mlx5_eswitch *esw) -{ - kfree(esw->qos.domain); - esw->qos.domain =3D NULL; -} - enum sched_node_type { SCHED_NODE_TYPE_ROOT, SCHED_NODE_TYPE_VPORTS_TSAR, @@ -104,6 +57,65 @@ struct mlx5_esw_sched_node { u32 tc_bw[DEVLINK_RATE_TCS_MAX]; }; =20 +/* Locking notes: + * QoS changes are normally protected by the shd lock. But on older HW shd + * might not be created at all, so there needs to be a fallback serializat= ion + * mechanism. This is esw->state_lock. + * Callers into QoS hold a combination of RTNL, devlink instance lock and + * esw->state_lock. Devlink rate ops additionally hold the shd lock if it + * exists. + * - VF rate ops use esw_qos_lock/esw_qos_unlock. + * - callers with esw->state_lock held use esw_qos_shd_lock/esw_qos_shd_un= lock. + * - devlink callers use esw_qos_devlink_lock/esw_qos_devlink_unlock. + */ +static void esw_assert_qos_lock_held(struct mlx5_core_dev *dev) +{ + if (dev->shd) + devl_assert_locked(dev->shd); + else + lockdep_assert_held(&dev->priv.eswitch->state_lock); +} + +static void esw_qos_lock(struct mlx5_core_dev *dev) +{ + if (dev->shd) + devl_lock(dev->shd); + else + mutex_lock(&dev->priv.eswitch->state_lock); +} + +static void esw_qos_unlock(struct mlx5_core_dev *dev) +{ + if (dev->shd) + devl_unlock(dev->shd); + else + mutex_unlock(&dev->priv.eswitch->state_lock); +} + +static void esw_qos_shd_lock(struct mlx5_core_dev *dev) +{ + if (dev->shd) + devl_lock(dev->shd); +} + +static void esw_qos_shd_unlock(struct mlx5_core_dev *dev) +{ + if (dev->shd) + devl_unlock(dev->shd); +} + +static void esw_qos_devlink_lock(struct mlx5_core_dev *dev) +{ + if (!dev->shd) + mutex_lock(&dev->priv.eswitch->state_lock); +} + +static void esw_qos_devlink_unlock(struct mlx5_core_dev *dev) +{ + if (!dev->shd) + mutex_unlock(&dev->priv.eswitch->state_lock); +} + static int esw_qos_num_tcs(struct mlx5_core_dev *dev) { int num_tcs =3D mlx5_max_tc(dev) + 1; @@ -700,7 +712,7 @@ esw_qos_create_vports_sched_node(struct mlx5_eswitch *e= sw, struct netlink_ext_ac struct mlx5_esw_sched_node *node; int err; =20 - esw_assert_qos_lock_held(esw); + esw_assert_qos_lock_held(esw->dev); if (!MLX5_CAP_QOS(esw->dev, log_esw_max_sched_depth)) return ERR_PTR(-EOPNOTSUPP); =20 @@ -771,7 +783,7 @@ static int esw_qos_get(struct mlx5_eswitch *esw, struct= netlink_ext_ack *extack) { int err =3D 0; =20 - esw_assert_qos_lock_held(esw); + esw_assert_qos_lock_held(esw->dev); if (!refcount_inc_not_zero(&esw->qos.refcnt)) { /* esw_qos_create() set refcount to 1 only on success. * No need to decrement on failure. @@ -784,7 +796,7 @@ static int esw_qos_get(struct mlx5_eswitch *esw, struct= netlink_ext_ack *extack) =20 static void esw_qos_put(struct mlx5_eswitch *esw) { - esw_assert_qos_lock_held(esw); + esw_assert_qos_lock_held(esw->dev); if (refcount_dec_and_test(&esw->qos.refcnt)) esw_qos_destroy(esw); } @@ -940,7 +952,7 @@ esw_qos_vport_tc_enable(struct mlx5_vport *vport, enum = sched_node_type type, } } =20 - esw_assert_qos_lock_held(vport->dev->priv.eswitch); + esw_assert_qos_lock_held(vport->dev); =20 if (type =3D=3D SCHED_NODE_TYPE_RATE_LIMITER) err =3D esw_qos_create_rate_limit_element(vport_node, extack); @@ -1038,7 +1050,7 @@ static int esw_qos_vport_enable(struct mlx5_vport *vp= ort, struct mlx5_esw_sched_node *vport_node =3D vport->qos.sched_node; int err; =20 - esw_assert_qos_lock_held(vport_node->esw); + esw_assert_qos_lock_held(vport->dev); =20 esw_qos_node_set_parent(vport_node, parent); if (type =3D=3D SCHED_NODE_TYPE_VPORT) @@ -1064,7 +1076,7 @@ static int mlx5_esw_qos_vport_enable(struct mlx5_vpor= t *vport, enum sched_node_t struct mlx5_esw_sched_node *sched_node; int err; =20 - esw_assert_qos_lock_held(esw); + esw_assert_qos_lock_held(vport->dev); err =3D esw_qos_get(esw, extack); if (err) return err; @@ -1093,15 +1105,13 @@ static int mlx5_esw_qos_vport_enable(struct mlx5_vp= ort *vport, enum sched_node_t =20 static void mlx5_esw_qos_vport_disable_locked(struct mlx5_vport *vport) { - struct mlx5_eswitch *esw =3D vport->dev->priv.eswitch; - - esw_assert_qos_lock_held(esw); + esw_assert_qos_lock_held(vport->dev); if (!vport->qos.sched_node) return; =20 esw_qos_vport_disable(vport, NULL); mlx5_esw_qos_vport_qos_free(vport); - esw_qos_put(esw); + esw_qos_put(vport->dev->priv.eswitch); } =20 void mlx5_esw_qos_vport_disable(struct mlx5_vport *vport) @@ -1109,9 +1119,9 @@ void mlx5_esw_qos_vport_disable(struct mlx5_vport *vp= ort) struct mlx5_eswitch *esw =3D vport->dev->priv.eswitch; =20 lockdep_assert_held(&esw->state_lock); - esw_qos_lock(esw); + esw_qos_shd_lock(vport->dev); mlx5_esw_qos_vport_disable_locked(vport); - esw_qos_unlock(esw); + esw_qos_shd_unlock(vport->dev); } =20 static int mlx5_esw_qos_set_vport_max_rate(struct mlx5_vport *vport, u32 m= ax_rate, @@ -1119,7 +1129,7 @@ static int mlx5_esw_qos_set_vport_max_rate(struct mlx= 5_vport *vport, u32 max_rat { struct mlx5_esw_sched_node *vport_node =3D vport->qos.sched_node; =20 - esw_assert_qos_lock_held(vport->dev->priv.eswitch); + esw_assert_qos_lock_held(vport->dev); =20 if (!vport_node) return mlx5_esw_qos_vport_enable(vport, SCHED_NODE_TYPE_VPORT, NULL, max= _rate, 0, @@ -1134,7 +1144,7 @@ static int mlx5_esw_qos_set_vport_min_rate(struct mlx= 5_vport *vport, u32 min_rat { struct mlx5_esw_sched_node *vport_node =3D vport->qos.sched_node; =20 - esw_assert_qos_lock_held(vport->dev->priv.eswitch); + esw_assert_qos_lock_held(vport->dev); =20 if (!vport_node) return mlx5_esw_qos_vport_enable(vport, SCHED_NODE_TYPE_VPORT, NULL, 0, = min_rate, @@ -1147,29 +1157,27 @@ static int mlx5_esw_qos_set_vport_min_rate(struct m= lx5_vport *vport, u32 min_rat =20 int mlx5_esw_qos_set_vport_rate(struct mlx5_vport *vport, u32 max_rate, u3= 2 min_rate) { - struct mlx5_eswitch *esw =3D vport->dev->priv.eswitch; int err; =20 - esw_qos_lock(esw); + esw_qos_lock(vport->dev); err =3D mlx5_esw_qos_set_vport_min_rate(vport, min_rate, NULL); if (!err) err =3D mlx5_esw_qos_set_vport_max_rate(vport, max_rate, NULL); - esw_qos_unlock(esw); + esw_qos_unlock(vport->dev); return err; } =20 bool mlx5_esw_qos_get_vport_rate(struct mlx5_vport *vport, u32 *max_rate, = u32 *min_rate) { - struct mlx5_eswitch *esw =3D vport->dev->priv.eswitch; bool enabled; =20 - esw_qos_lock(esw); + esw_qos_shd_lock(vport->dev); enabled =3D !!vport->qos.sched_node; if (enabled) { *max_rate =3D vport->qos.sched_node->max_rate; *min_rate =3D vport->qos.sched_node->min_rate; } - esw_qos_unlock(esw); + esw_qos_shd_unlock(vport->dev); return enabled; } =20 @@ -1205,7 +1213,7 @@ static int esw_qos_vport_update(struct mlx5_vport *vp= ort, u32 curr_tc_bw[DEVLINK_RATE_TCS_MAX] =3D {0}; int err; =20 - esw_assert_qos_lock_held(vport->dev->priv.eswitch); + esw_assert_qos_lock_held(vport->dev); if (curr_type =3D=3D type && curr_parent =3D=3D parent) return 0; =20 @@ -1235,11 +1243,10 @@ static int esw_qos_vport_update(struct mlx5_vport *= vport, static int esw_qos_vport_update_parent(struct mlx5_vport *vport, struct ml= x5_esw_sched_node *parent, struct netlink_ext_ack *extack) { - struct mlx5_eswitch *esw =3D vport->dev->priv.eswitch; struct mlx5_esw_sched_node *curr_parent; enum sched_node_type type; =20 - esw_assert_qos_lock_held(esw); + esw_assert_qos_lock_held(vport->dev); curr_parent =3D vport->qos.sched_node->parent; if (curr_parent =3D=3D parent) return 0; @@ -1503,9 +1510,9 @@ int mlx5_esw_qos_modify_vport_rate(struct mlx5_eswitc= h *esw, u16 vport_num, u32 return err; } =20 - esw_qos_lock(esw); + esw_qos_lock(vport->dev); err =3D mlx5_esw_qos_set_vport_max_rate(vport, rate_mbps, NULL); - esw_qos_unlock(esw); + esw_qos_unlock(vport->dev); =20 return err; } @@ -1582,7 +1589,7 @@ static void esw_vport_qos_prune_empty(struct mlx5_vpo= rt *vport) { struct mlx5_esw_sched_node *vport_node =3D vport->qos.sched_node; =20 - esw_assert_qos_lock_held(vport->dev->priv.eswitch); + esw_assert_qos_lock_held(vport->dev); if (!vport_node) return; =20 @@ -1594,44 +1601,26 @@ static void esw_vport_qos_prune_empty(struct mlx5_v= port *vport) mlx5_esw_qos_vport_disable_locked(vport); } =20 -int mlx5_esw_qos_init(struct mlx5_eswitch *esw) -{ - if (esw->qos.domain) - return 0; /* Nothing to change. */ - - return esw_qos_domain_init(esw); -} - -void mlx5_esw_qos_cleanup(struct mlx5_eswitch *esw) -{ - if (esw->qos.domain) - esw_qos_domain_release(esw); -} - /* Eswitch devlink rate API */ =20 int mlx5_esw_devlink_rate_leaf_tx_share_set(struct devlink_rate *rate_leaf= , void *priv, u64 tx_share, struct netlink_ext_ack *extack) { struct mlx5_vport *vport =3D priv; - struct mlx5_eswitch *esw; int err; =20 - esw =3D vport->dev->priv.eswitch; - if (!mlx5_esw_allowed(esw)) + if (!mlx5_esw_allowed(vport->dev->priv.eswitch)) return -EPERM; =20 err =3D esw_qos_devlink_rate_to_mbps(vport->dev, "tx_share", &tx_share, e= xtack); if (err) return err; =20 - esw_qos_lock(esw); + esw_qos_devlink_lock(vport->dev); err =3D mlx5_esw_qos_set_vport_min_rate(vport, tx_share, extack); - if (err) - goto out; - esw_vport_qos_prune_empty(vport); -out: - esw_qos_unlock(esw); + if (!err) + esw_vport_qos_prune_empty(vport); + esw_qos_devlink_unlock(vport->dev); return err; } =20 @@ -1639,24 +1628,20 @@ int mlx5_esw_devlink_rate_leaf_tx_max_set(struct de= vlink_rate *rate_leaf, void * u64 tx_max, struct netlink_ext_ack *extack) { struct mlx5_vport *vport =3D priv; - struct mlx5_eswitch *esw; int err; =20 - esw =3D vport->dev->priv.eswitch; - if (!mlx5_esw_allowed(esw)) + if (!mlx5_esw_allowed(vport->dev->priv.eswitch)) return -EPERM; =20 err =3D esw_qos_devlink_rate_to_mbps(vport->dev, "tx_max", &tx_max, extac= k); if (err) return err; =20 - esw_qos_lock(esw); + esw_qos_devlink_lock(vport->dev); err =3D mlx5_esw_qos_set_vport_max_rate(vport, tx_max, extack); - if (err) - goto out; - esw_vport_qos_prune_empty(vport); -out: - esw_qos_unlock(esw); + if (!err) + esw_vport_qos_prune_empty(vport); + esw_qos_devlink_unlock(vport->dev); return err; } =20 @@ -1667,16 +1652,14 @@ int mlx5_esw_devlink_rate_leaf_tc_bw_set(struct dev= link_rate *rate_leaf, { struct mlx5_esw_sched_node *vport_node; struct mlx5_vport *vport =3D priv; - struct mlx5_eswitch *esw; bool disable; int err =3D 0; =20 - esw =3D vport->dev->priv.eswitch; - if (!mlx5_esw_allowed(esw)) + if (!mlx5_esw_allowed(vport->dev->priv.eswitch)) return -EPERM; =20 disable =3D esw_qos_tc_bw_disabled(tc_bw); - esw_qos_lock(esw); + esw_qos_devlink_lock(vport->dev); =20 if (!esw_qos_vport_validate_unsupported_tc_bw(vport, tc_bw)) { NL_SET_ERR_MSG_MOD(extack, @@ -1710,7 +1693,7 @@ int mlx5_esw_devlink_rate_leaf_tc_bw_set(struct devli= nk_rate *rate_leaf, if (!err) esw_qos_set_tc_arbiter_bw_shares(vport_node, tc_bw, extack); unlock: - esw_qos_unlock(esw); + esw_qos_devlink_unlock(vport->dev); return err; } =20 @@ -1720,18 +1703,17 @@ int mlx5_esw_devlink_rate_node_tc_bw_set(struct dev= link_rate *rate_node, struct netlink_ext_ack *extack) { struct mlx5_esw_sched_node *node =3D priv; - struct mlx5_eswitch *esw =3D node->esw; bool disable; int err; =20 - if (!esw_qos_validate_unsupported_tc_bw(esw, tc_bw)) { + if (!esw_qos_validate_unsupported_tc_bw(node->esw, tc_bw)) { NL_SET_ERR_MSG_MOD(extack, "E-Switch traffic classes number is not supported"); return -EOPNOTSUPP; } =20 disable =3D esw_qos_tc_bw_disabled(tc_bw); - esw_qos_lock(esw); + esw_qos_devlink_lock(node->esw->dev); if (disable) { err =3D esw_qos_node_disable_tc_arbitration(node, extack); goto unlock; @@ -1741,7 +1723,7 @@ int mlx5_esw_devlink_rate_node_tc_bw_set(struct devli= nk_rate *rate_node, if (!err) esw_qos_set_tc_arbiter_bw_shares(node, tc_bw, extack); unlock: - esw_qos_unlock(esw); + esw_qos_devlink_unlock(node->esw->dev); return err; } =20 @@ -1756,9 +1738,9 @@ int mlx5_esw_devlink_rate_node_tx_share_set(struct de= vlink_rate *rate_node, void if (err) return err; =20 - esw_qos_lock(esw); + esw_qos_devlink_lock(esw->dev); err =3D esw_qos_set_node_min_rate(node, tx_share, extack); - esw_qos_unlock(esw); + esw_qos_devlink_unlock(esw->dev); return err; } =20 @@ -1773,9 +1755,9 @@ int mlx5_esw_devlink_rate_node_tx_max_set(struct devl= ink_rate *rate_node, void * if (err) return err; =20 - esw_qos_lock(esw); + esw_qos_devlink_lock(esw->dev); err =3D esw_qos_sched_elem_config(node, tx_max, node->bw_share, extack); - esw_qos_unlock(esw); + esw_qos_devlink_unlock(esw->dev); return err; } =20 @@ -1790,7 +1772,7 @@ int mlx5_esw_devlink_rate_node_new(struct devlink_rat= e *rate_node, void **priv, if (IS_ERR(esw)) return PTR_ERR(esw); =20 - esw_qos_lock(esw); + esw_qos_devlink_lock(esw->dev); if (esw->mode !=3D MLX5_ESWITCH_OFFLOADS) { NL_SET_ERR_MSG_MOD(extack, "Rate node creation supported only in switchdev mode"); @@ -1803,10 +1785,9 @@ int mlx5_esw_devlink_rate_node_new(struct devlink_ra= te *rate_node, void **priv, err =3D PTR_ERR(node); goto unlock; } - *priv =3D node; unlock: - esw_qos_unlock(esw); + esw_qos_devlink_unlock(esw->dev); return err; } =20 @@ -1816,10 +1797,11 @@ int mlx5_esw_devlink_rate_node_del(struct devlink_r= ate *rate_node, void *priv, struct mlx5_esw_sched_node *node =3D priv; struct mlx5_eswitch *esw =3D node->esw; =20 - esw_qos_lock(esw); + esw_qos_devlink_lock(esw->dev); __esw_qos_destroy_node(node, extack); esw_qos_put(esw); - esw_qos_unlock(esw); + esw_qos_devlink_unlock(esw->dev); + return 0; } =20 @@ -1836,7 +1818,6 @@ mlx5_esw_qos_vport_update_parent(struct mlx5_vport *v= port, return -EOPNOTSUPP; } =20 - esw_qos_lock(esw); if (!vport->qos.sched_node && parent) { enum sched_node_type type; =20 @@ -1849,7 +1830,7 @@ mlx5_esw_qos_vport_update_parent(struct mlx5_vport *v= port, parent ? : esw->qos.root, extack); } - esw_qos_unlock(esw); + return err; } =20 @@ -1862,14 +1843,11 @@ int mlx5_esw_devlink_rate_leaf_parent_set(struct de= vlink_rate *devlink_rate, struct mlx5_vport *vport =3D priv; int err; =20 + esw_qos_devlink_lock(vport->dev); err =3D mlx5_esw_qos_vport_update_parent(vport, node, extack); - if (!err) { - struct mlx5_eswitch *esw =3D vport->dev->priv.eswitch; - - esw_qos_lock(esw); + if (!err) esw_vport_qos_prune_empty(vport); - esw_qos_unlock(esw); - } + esw_qos_devlink_unlock(vport->dev); =20 return err; } @@ -1996,7 +1974,7 @@ static int mlx5_esw_qos_node_update_parent(struct mlx= 5_esw_sched_node *node, struct mlx5_eswitch *esw =3D node->esw; int err; =20 - esw_qos_lock(esw); + esw_qos_devlink_lock(esw->dev); curr_parent =3D node->parent; if (!parent) parent =3D esw->qos.root; @@ -2019,8 +1997,7 @@ static int mlx5_esw_qos_node_update_parent(struct mlx= 5_esw_sched_node *node, esw_qos_normalize_min_rate(parent, extack); =20 out: - esw_qos_unlock(esw); - + esw_qos_devlink_unlock(esw->dev); return err; } =20 diff --git a/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.h b/drivers/ne= t/ethernet/mellanox/mlx5/core/esw/qos.h index 0a50982b0e27..f275e850d2c9 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.h @@ -6,9 +6,6 @@ =20 #ifdef CONFIG_MLX5_ESWITCH =20 -int mlx5_esw_qos_init(struct mlx5_eswitch *esw); -void mlx5_esw_qos_cleanup(struct mlx5_eswitch *esw); - int mlx5_esw_qos_set_vport_rate(struct mlx5_vport *evport, u32 max_rate, u= 32 min_rate); bool mlx5_esw_qos_get_vport_rate(struct mlx5_vport *vport, u32 *max_rate, = u32 *min_rate); void mlx5_esw_qos_vport_disable(struct mlx5_vport *vport); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/ne= t/ethernet/mellanox/mlx5/core/eswitch.c index b67f15a8f766..b6e2c153b4f7 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c @@ -1885,10 +1885,6 @@ int mlx5_eswitch_enable_locked(struct mlx5_eswitch *= esw, int num_vfs) MLX5_NB_INIT(&esw->nb, eswitch_vport_event, NIC_VPORT_CHANGE); mlx5_eq_notifier_register(esw->dev, &esw->nb); =20 - err =3D mlx5_esw_qos_init(esw); - if (err) - goto err_esw_init; - if (esw->mode =3D=3D MLX5_ESWITCH_LEGACY) { err =3D esw_legacy_enable(esw); } else { @@ -2555,9 +2551,6 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev) goto reps_err; =20 esw->mode =3D MLX5_ESWITCH_LEGACY; - err =3D mlx5_esw_qos_init(esw); - if (err) - goto reps_err; =20 mutex_init(&esw->offloads.encap_tbl_lock); hash_init(esw->offloads.encap_tbl); @@ -2612,7 +2605,6 @@ void mlx5_eswitch_cleanup(struct mlx5_eswitch *esw) =20 mlx5_eswitch_invalidate_wq(esw); destroy_workqueue(esw->work_queue); - mlx5_esw_qos_cleanup(esw); WARN_ON(refcount_read(&esw->qos.refcnt)); mutex_destroy(&esw->state_lock); WARN_ON(!xa_empty(&esw->offloads.vhca_map)); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h b/drivers/ne= t/ethernet/mellanox/mlx5/core/eswitch.h index 10c4eacd43b4..c655f6e8da1c 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h @@ -234,8 +234,10 @@ struct mlx5_vport { =20 struct mlx5_vport_info info; =20 - /* Protected with the E-Switch qos domain lock. The Vport QoS can - * either be disabled (sched_node is NULL) or in one of three states: + /* Protected by either the shared devlink (dev->shd) lock or by + * esw->state_lock. See esw_assert_qos_lock_held() for more details. + * The Vport QoS can either be disabled (sched_node is NULL) or in one + * of three states: * 1. Regular QoS (sched_node is a vport node). * 2. TC QoS enabled on the vport (sched_node is a TC arbiter). * 3. TC QoS enabled on the vport's parent node @@ -382,7 +384,6 @@ enum { }; =20 struct dentry; -struct mlx5_qos_domain; =20 struct mlx5_eswitch { struct mlx5_core_dev *dev; @@ -411,11 +412,13 @@ struct mlx5_eswitch { atomic64_t user_count; wait_queue_head_t work_queue_wait; =20 - /* Protected with the E-Switch qos domain lock. */ + /* QoS changes are serialized by either the shared devlink (dev->shd) + * lock or by esw->state_lock. See esw_assert_qos_lock_held() for more + * details. + */ struct { /* Initially 0, meaning no QoS users and QoS is disabled. */ refcount_t refcnt; - struct mlx5_qos_domain *domain; /* The root node of the hierarchy. */ struct mlx5_esw_sched_node *root; } qos; --=20 2.44.0 From nobody Wed Jul 1 16:10:59 2026 Received: from MW6PR02CU001.outbound.protection.outlook.com (mail-westus2azon11012034.outbound.protection.outlook.com [52.101.48.34]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D9A473BCD29; Wed, 1 Jul 2026 07:35:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.48.34 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891355; cv=fail; b=Wousj/LXWoMZMFBRBupbEREi/30KaI/rnb74BfPdZ15vf/D1ZCEx38xCuUBuEYnURKesF85VeFc3cWhi6sqRUbaFoSaPHzrXOYe/P05OXFTi4aoQW0VLiI3yL9ONpDW1bhi6diAy+tderXDGqLpYqQlFGKe4phoLSmCDP0/UJak= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891355; c=relaxed/simple; bh=Jwe6GupJJQLTmMlrqZm2vOU4tVGyu4dHwwifHUv6TMo=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=mgeDs3aoS01dV4HwTD8f51C1ZalHZ18ydSnob8VIpVm6lAQRVeN+dODuGQWqDuK4YKXkusaULS+7qiO6Wst1UMhGgRexS7kwr1l2SsUKoketkxrLND2Cag7heEHoBueV0+DYtjn539Yk2GdMs0kFhSqAkEOVGE30L3Ls82yKI4A= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=RPUDUkEq; arc=fail smtp.client-ip=52.101.48.34 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="RPUDUkEq" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=rENEr8BluKvwD1nTaSZazwMhYKrYBvoTKQmONpHbohpMAym/wK/4G3mtHTz4mlXLrXLRH3r8M+9jOc6NMhRe21js3pGHERNYYfc370g6MKfDB9ERCHO66+DhclSY2gugs5ppF/HuujtKajYh/b6TcZoefGv30PyavVtxJqGfHxINNhhj85O6SVO/8hmqQcWDJD0dhS2qS6pOquevCBIAqvSrBcPe3GY/R2vPGt/y+6MpDed7kKD3zSPdxrYtm3wDguMYAfF982WPOECmIEmTEy8O706Qds9bqbIOHx75tRk8yPsXKN344Bl5dPZFVftOdzktY0eaVCbSGiJeRY1rEQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=W624HuW5CuxBVx24VumgaV/NcenLvI6J/edAb2ClTts=; b=mi/LOCWW3iUeXOv3G20IEalJMThtbYzt7XodL3mEH+2pbGmmt3aq4PQEDLOUkC75this3OXa0xRCwuIMfmuX47hVFfNE2OTK7quh4isBmq9lT+w10qtnXDISD8ug4JR3YBRRkPS1NUoETka8fAEyfIPk2+TeoLxt8Dz9uL35etepUq+m/mYLYTwz9aLRyk7r9xPh1lDwm2SuhA8n6hvI5x217mQEYxGFK61craPm4wOPuwjqvG3Dirjw97O3mj9iTTQ7TgHRc2GTNyJ2VGc7GUFxKmK3uCV5cK99ebbU88mWuk72S9yfIb3RQe7S9/ME1kH54STVtX142zOyZVw0Cg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=lunn.ch 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=W624HuW5CuxBVx24VumgaV/NcenLvI6J/edAb2ClTts=; b=RPUDUkEqr4guAiFUoZuFCXwhRFgiv/1s/3aqMSi8Gg1xNMuIM8rpZGhlEITEnLqiefpX+ilE+Oztn7J6GnnS6vIZ4ObtaB1B7HP/HPVu2zfXad33r3szyFkPvI4luUDDnw7sLYm0QI+f9azCB1arv210X2jmIPogLGjE27tmqxuGWF3dPR6ZlRQZWkZIx6lKZZmrvBenZvElvuEJkNUdwUE1LwNACxXoLxpHNkDv0sP3yov4ZxYhuucYH22AUAzsmvXEUzOdy2EzU4Jsp3n7BHd3mCfuSUbbeD5k5GTXSqUwcV5sq61S4qm+Guf339uQqTgTfTrTfEucgzqRZXHY3A== Received: from DM6PR02CA0127.namprd02.prod.outlook.com (2603:10b6:5:1b4::29) by SA1PR12MB7245.namprd12.prod.outlook.com (2603:10b6:806:2bf::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.159.19; Wed, 1 Jul 2026 07:35:47 +0000 Received: from DS1PEPF00017090.namprd03.prod.outlook.com (2603:10b6:5:1b4:cafe::c) by DM6PR02CA0127.outlook.office365.com (2603:10b6:5:1b4::29) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.181.8 via Frontend Transport; Wed, 1 Jul 2026 07:35:46 +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 DS1PEPF00017090.mail.protection.outlook.com (10.167.17.132) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.6 via Frontend Transport; Wed, 1 Jul 2026 07:35:46 +0000 Received: from rnnvmail202.nvidia.com (10.129.68.7) 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.2562.20; Wed, 1 Jul 2026 00:35:26 -0700 Received: from rnnvmail201.nvidia.com (10.129.68.8) by rnnvmail202.nvidia.com (10.129.68.7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 1 Jul 2026 00:35:25 -0700 Received: from vdi.nvidia.com (10.127.8.10) by mail.nvidia.com (10.129.68.8) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Wed, 1 Jul 2026 00:35:16 -0700 From: Tariq Toukan To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , , Paolo Abeni CC: Adithya Jayachandran , Bobby Eshleman , Carolina Jubran , Cosmin Ratiu , Daniel Borkmann , Daniel Jurgens , Daniel Zahka , David Wei , Donald Hunter , Dragos Tatulea , Jiri Pirko , Jiri Pirko , Joe Damato , Jonathan Corbet , Kees Cook , Leon Romanovsky , , , , , Mark Bloch , Moshe Shemesh , Or Har-Toov , Parav Pandit , Petr Machata , Ratheesh Kannoth , Saeed Mahameed , Shahar Shitrit , Shay Drori , Shuah Khan , Shuah Khan , Simon Horman , Stanislav Fomichev , Tariq Toukan , Willem de Bruijn , Gal Pressman Subject: [PATCH net-next V10 12/14] net/mlx5: qos: Support cross-device tx scheduling Date: Wed, 1 Jul 2026 10:32:52 +0300 Message-ID: <20260701073254.754518-13-tariqt@nvidia.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20260701073254.754518-1-tariqt@nvidia.com> References: <20260701073254.754518-1-tariqt@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS1PEPF00017090:EE_|SA1PR12MB7245:EE_ X-MS-Office365-Filtering-Correlation-Id: 9e6326c1-1fda-45ec-7d94-08ded7435d8a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|23010399003|82310400026|376014|36860700016|1800799024|22082099003|11063799006|18002099003|56012099006; X-Microsoft-Antispam-Message-Info: wu98HHpQpQIQqCnSwTV9KvuJuya6GLZt0OBea7LUR3Ej2lfGmllgBfaeKgi5hGyxy2w9W1mHxeCfwmXG3EAtEsgAVnUloC+2AXdzGPVMmE/BxNJ9B34yRI8VB//Zgp524m4RE1pZ33QC5yKWRm7Zi0rxqL+SQ8pSKjGkaSLYQx6/uqFWDSm4RxSYUCH9C/0UN7b/6ZBu+QoZl5z3FqcKxsvLDE9J0UN11GtQWzX5tUE4XO7np/eXZd+0z/BgT7BBiS1cuv7APHqR7PtysGG24HN7BLNCf655Yn28tdkdv54VDZqTF/c+8CSwHvE8PSOLbbWOPbs6fL488UfWJC66h1SYyMnv5QtvPcrqTtmpUuhxqTHBN3ZXz6An/oYC29qh8XcGevYqZWTSw1pIPxcG1nbo2FEPkFYwS/pOlYi/jScNbocMnyt/emFpu0DV7LIAFF1ofBtl4XISaPtZ6rZLiViLFRFI+Xg4V5zgLISbEIKWzqVhpSRDW5WHflpVtgr4MOLXZEpEmjWhAcp59IvhNST9oPL/4qftt+p7gikWEi28vzzSMJX+2fQhHX0Sf/JzZekjjyFEnb1npGmgQrtm4YpcOOCb3ZEMU4tW+X3tdxevOqo3Fz2UII/jWEQb+SuMJQPctnwDCvjOHB8xKQixT7cVHn5Sr0YbBKWsmKJrczpKBYltgiVvzTq4PuzEUdRehxWmdyYj7ZPAYIx+4o70/A== 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)(7416014)(23010399003)(82310400026)(376014)(36860700016)(1800799024)(22082099003)(11063799006)(18002099003)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: DJyNwH2T+IavblTXIlha0WvgZMChw684LYsa+M2pvGNDEHOxDz3nJvjzmPD8WW9aZio2oCAltzk4k9+2iHWdQkcSkIbagtuhgj70+eJs/8D3OzyXZsRleiFhJGL//7qlPciUzB/fIq/0uK4HQdeMBYuhMA7xO4l91pxy53c3it3T9geDqYKoylDrwNLCx+krbm+d4XlLA2ttHUOee6UrqX3wWLzk0RJGqF+O0a4gCp0Ad6CLl8yJGw25cUk7tGQD5VoqoVFe0FHPsEFPKEN7RJOIyKGdOUDSl6YYjD6fLNYOhMOn9XX6H/s6hFZsIJ/HEMpvZfuXOsU1QHBNKeZQ2SOqjPcqJ2HTLXrfMewghCAa5p5MOKNZm7n/SJ6oQQgZzAJZXQFCXV0hToRF/esdeYlc5wcgv5EN9c024Mgw+XqVbA82FqsqQnqzIZ8cKK3T X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Jul 2026 07:35:46.3348 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 9e6326c1-1fda-45ec-7d94-08ded7435d8a 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: DS1PEPF00017090.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA1PR12MB7245 Content-Type: text/plain; charset="utf-8" From: Cosmin Ratiu Up to now, rate groups could only contain vports from the same E-Switch. This patch relaxes that restriction if the device supports it (HCA_CAP.esw_cross_esw_sched =3D=3D true) and the right conditions are met: - Link Aggregation (LAG) is enabled. - The E-Switches are from the same shared devlink device. Signed-off-by: Cosmin Ratiu Reviewed-by: Carolina Jubran Signed-off-by: Tariq Toukan --- .../net/ethernet/mellanox/mlx5/core/esw/qos.c | 120 +++++++++++++----- 1 file changed, 85 insertions(+), 35 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c b/drivers/ne= t/ethernet/mellanox/mlx5/core/esw/qos.c index 80a28596349b..0d20f51b9702 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c @@ -45,7 +45,9 @@ struct mlx5_esw_sched_node { enum sched_node_type type; /* The eswitch this node belongs to. */ struct mlx5_eswitch *esw; - /* The children nodes of this node, empty list for leaf nodes. */ + /* The children nodes of this node, empty list for leaf nodes. + * Can be from multiple E-Switches. + */ struct list_head children; /* Valid only if this node is associated with a vport. */ struct mlx5_vport *vport; @@ -447,6 +449,7 @@ esw_qos_vport_create_sched_element(struct mlx5_esw_sche= d_node *vport_node, struct mlx5_esw_sched_node *parent =3D vport_node->parent; u32 sched_ctx[MLX5_ST_SZ_DW(scheduling_context)] =3D {}; struct mlx5_core_dev *dev =3D vport_node->esw->dev; + struct mlx5_vport *vport =3D vport_node->vport; void *attr; =20 if (!mlx5_qos_element_type_supported( @@ -458,10 +461,17 @@ esw_qos_vport_create_sched_element(struct mlx5_esw_sc= hed_node *vport_node, MLX5_SET(scheduling_context, sched_ctx, element_type, SCHEDULING_CONTEXT_ELEMENT_TYPE_VPORT); attr =3D MLX5_ADDR_OF(scheduling_context, sched_ctx, element_attributes); - MLX5_SET(vport_element, attr, vport_number, vport_node->vport->vport); + MLX5_SET(vport_element, attr, vport_number, vport->vport); MLX5_SET(scheduling_context, sched_ctx, parent_element_id, parent->ix); MLX5_SET(scheduling_context, sched_ctx, max_average_bw, vport_node->max_rate); + if (vport->dev !=3D dev) { + /* The port is assigned to a node on another eswitch. */ + MLX5_SET(vport_element, attr, eswitch_owner_vhca_id_valid, + true); + MLX5_SET(vport_element, attr, eswitch_owner_vhca_id, + MLX5_CAP_GEN(vport->dev, vhca_id)); + } =20 return esw_qos_node_create_sched_element(vport_node, sched_ctx, extack); } @@ -473,6 +483,7 @@ esw_qos_vport_tc_create_sched_element(struct mlx5_esw_s= ched_node *vport_tc_node, { u32 sched_ctx[MLX5_ST_SZ_DW(scheduling_context)] =3D {}; struct mlx5_core_dev *dev =3D vport_tc_node->esw->dev; + struct mlx5_vport *vport =3D vport_tc_node->vport; void *attr; =20 if (!mlx5_qos_element_type_supported( @@ -484,8 +495,7 @@ esw_qos_vport_tc_create_sched_element(struct mlx5_esw_s= ched_node *vport_tc_node, MLX5_SET(scheduling_context, sched_ctx, element_type, SCHEDULING_CONTEXT_ELEMENT_TYPE_VPORT_TC); attr =3D MLX5_ADDR_OF(scheduling_context, sched_ctx, element_attributes); - MLX5_SET(vport_tc_element, attr, vport_number, - vport_tc_node->vport->vport); + MLX5_SET(vport_tc_element, attr, vport_number, vport->vport); MLX5_SET(vport_tc_element, attr, traffic_class, vport_tc_node->tc); MLX5_SET(scheduling_context, sched_ctx, max_bw_obj_id, rate_limit_elem_ix); @@ -493,6 +503,13 @@ esw_qos_vport_tc_create_sched_element(struct mlx5_esw_= sched_node *vport_tc_node, vport_tc_node->parent->ix); MLX5_SET(scheduling_context, sched_ctx, bw_share, vport_tc_node->bw_share); + if (vport->dev !=3D dev) { + /* The port is assigned to a node on another eswitch. */ + MLX5_SET(vport_tc_element, attr, eswitch_owner_vhca_id_valid, + true); + MLX5_SET(vport_tc_element, attr, eswitch_owner_vhca_id, + MLX5_CAP_GEN(vport->dev, vhca_id)); + } =20 return esw_qos_node_create_sched_element(vport_tc_node, sched_ctx, extack); @@ -1062,8 +1079,9 @@ static int esw_qos_vport_enable(struct mlx5_vport *vp= ort, =20 vport_node->type =3D type; esw_qos_normalize_min_rate(parent, extack); - trace_mlx5_esw_vport_qos_create(vport->dev, vport, vport_node->max_rate, - vport_node->bw_share); + trace_mlx5_esw_vport_qos_create(vport_node->esw->dev, vport, + vport_node->bw_share, + vport_node->max_rate); =20 return 0; } @@ -1202,6 +1220,28 @@ static int esw_qos_vport_tc_check_type(enum sched_no= de_type curr_type, return 0; } =20 +static bool esw_qos_validate_unsupported_tc_bw(struct mlx5_eswitch *esw, + u32 *tc_bw) +{ + int i, num_tcs =3D esw_qos_num_tcs(esw->dev); + + for (i =3D num_tcs; i < DEVLINK_RATE_TCS_MAX; i++) + if (tc_bw[i]) + return false; + + return true; +} + +static bool esw_qos_vport_validate_unsupported_tc_bw(struct mlx5_vport *vp= ort, + u32 *tc_bw) +{ + struct mlx5_esw_sched_node *node =3D vport->qos.sched_node; + struct mlx5_eswitch *esw =3D node ? + node->parent->esw : vport->dev->priv.eswitch; + + return esw_qos_validate_unsupported_tc_bw(esw, tc_bw); +} + static int esw_qos_vport_update(struct mlx5_vport *vport, enum sched_node_type type, struct mlx5_esw_sched_node *parent, @@ -1221,8 +1261,15 @@ static int esw_qos_vport_update(struct mlx5_vport *v= port, if (err) return err; =20 - if (curr_type =3D=3D SCHED_NODE_TYPE_TC_ARBITER_TSAR && curr_type =3D=3D = type) + if (curr_type =3D=3D SCHED_NODE_TYPE_TC_ARBITER_TSAR && curr_type =3D=3D = type) { esw_qos_tc_arbiter_get_bw_shares(vport_node, curr_tc_bw); + if (!esw_qos_validate_unsupported_tc_bw(parent->esw, + curr_tc_bw)) { + NL_SET_ERR_MSG_MOD(extack, + "Unsupported traffic classes on the new device"); + return -EOPNOTSUPP; + } + } =20 esw_qos_vport_disable(vport, extack); =20 @@ -1550,29 +1597,6 @@ static int esw_qos_devlink_rate_to_mbps(struct mlx5_= core_dev *mdev, const char * return 0; } =20 -static bool esw_qos_validate_unsupported_tc_bw(struct mlx5_eswitch *esw, - u32 *tc_bw) -{ - int i, num_tcs =3D esw_qos_num_tcs(esw->dev); - - for (i =3D num_tcs; i < DEVLINK_RATE_TCS_MAX; i++) { - if (tc_bw[i]) - return false; - } - - return true; -} - -static bool esw_qos_vport_validate_unsupported_tc_bw(struct mlx5_vport *vp= ort, - u32 *tc_bw) -{ - struct mlx5_esw_sched_node *node =3D vport->qos.sched_node; - struct mlx5_eswitch *esw =3D node ? - node->parent->esw : vport->dev->priv.eswitch; - - return esw_qos_validate_unsupported_tc_bw(esw, tc_bw); -} - static bool esw_qos_tc_bw_disabled(u32 *tc_bw) { int i; @@ -1805,18 +1829,44 @@ int mlx5_esw_devlink_rate_node_del(struct devlink_r= ate *rate_node, void *priv, return 0; } =20 +static int +mlx5_esw_validate_cross_esw_scheduling(struct mlx5_eswitch *esw, + struct mlx5_esw_sched_node *parent, + struct netlink_ext_ack *extack) +{ + if (!parent || esw =3D=3D parent->esw) + return 0; + + if (!MLX5_CAP_QOS(esw->dev, esw_cross_esw_sched)) { + NL_SET_ERR_MSG_MOD(extack, + "Cross E-Switch scheduling is not supported"); + return -EOPNOTSUPP; + } + if (!esw->dev->shd || esw->dev->shd !=3D parent->esw->dev->shd) { + NL_SET_ERR_MSG_MOD(extack, + "Cannot add vport to a parent belonging to a different device"); + return -EOPNOTSUPP; + } + if (!mlx5_lag_is_active(esw->dev)) { + NL_SET_ERR_MSG_MOD(extack, + "Cross E-Switch scheduling requires LAG to be activated"); + return -EOPNOTSUPP; + } + + return 0; +} + static int mlx5_esw_qos_vport_update_parent(struct mlx5_vport *vport, struct mlx5_esw_sched_node *parent, struct netlink_ext_ack *extack) { struct mlx5_eswitch *esw =3D vport->dev->priv.eswitch; - int err =3D 0; + int err; =20 - if (parent && parent->esw !=3D esw) { - NL_SET_ERR_MSG_MOD(extack, "Cross E-Switch scheduling is not supported"); - return -EOPNOTSUPP; - } + err =3D mlx5_esw_validate_cross_esw_scheduling(esw, parent, extack); + if (err) + return err; =20 if (!vport->qos.sched_node && parent) { enum sched_node_type type; --=20 2.44.0 From nobody Wed Jul 1 16:10:59 2026 Received: from BL0PR03CU003.outbound.protection.outlook.com (mail-eastusazon11012032.outbound.protection.outlook.com [52.101.53.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C15253B7772; Wed, 1 Jul 2026 07:36:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.53.32 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891394; cv=fail; b=Qgy7c4nOXqhTlVUUhBYncSyPoU5SetrlIKGHWLplCvfB0/BpA66QA6HzBQItQGL6REe3XpVV/cc0TL8nWiVBSGF6QEVRLY7cmzNR66paHfoxO7CiXO8OTcvGJmJnhNxHaNcUxCKwbGC0vM0UTPr986Q92YL3u/nh/RPa2TR+0j0= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891394; c=relaxed/simple; bh=PdvReyfBxXEkp+HbRgNu60XPJnkok/9A3wmaqGaJnAo=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ooFEGO3rMyk3JnzxIu0d53g5QeW7NWcBnl5Bhr8IHDg/b+SM9ZfJ+iCdnHteJpzgFr/X8gqoCWHIxYFUmw856y96AgdfKO5TcOOZhKXdhmbuy10QBbO9x6gFzh3ch0ahdB0mj9VCPaLMthRB5JxjuOXAlRpIOIltXZdjMa9TaZA= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=QfB4YtZV; arc=fail smtp.client-ip=52.101.53.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="QfB4YtZV" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=OEkH1ZiJSLHM8D8T9ugqEfOIqIdUXoMTk0who8Ge+6dCtw8qHdKrIElt/CdpJYOioRbFmGFDeEq5wYQmRQd/WtZ5pGYbD5P5wN4TqsJ/AHmh9mgBoWzmtKTB9RGlUlBfnzFd2wcKI8xFSJ4H/Pvm1sZlzSK627Dpb6QfJxglIQ1GKPrBlkBQUUhX4vfkaqRiwCeZ0gYF7tuhOYn/Iq8Ldf+I9TOfdJVdFIo/TKywkNSVCm/E9ZieOvxeUcXPaq283SzkljVQbbCPnGxoIEdgCSTcdpFMf9aNWk9H0jaWTW380Rg63eu6G43t2vCS1U/rLB6kQbiU2M5/3SFwqlx2kQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=DDmGWO+a8EVoRHOw8wLNTLUstJu/8F/+1fAmxGmaxJ4=; b=tvEM53j4IsC8pWYRlM86zqkMpQOWEawUIA3drCUMdFdUYztK+8Eo07RboU7rG2B5KB6I9ehBOPgIEBYf3KV5sI4LiaTp8tB1TyJGF+5RDAOSmBokzjli0mIlppgZOUQ/YV2DoAV363wiGcB6t5EX58CZ9A9VCX4ceRpR9k1GnPaDOxuLnnxcQ/yulGQetDmX9gb42tBn5l22rtvIm8k5g0Wyty0DQ9mJAMXnS9ODC1orD/JSn7QkMHhMp7ABtI+i7YIG4/NHHfqMnBEpvVkS6H9qTaZc7268TOldZEcN+rLbVOm8Uem355iJkCBNFxP4t8x4O9NdAH6rx87rJA9eFA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=lunn.ch 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=DDmGWO+a8EVoRHOw8wLNTLUstJu/8F/+1fAmxGmaxJ4=; b=QfB4YtZV8YPEDlexplOwRpLQbRNl5DQIMl4Gd4v11hANs/57OTKrlehx2hQwXi5NBuSdde628zVK/WHsLa3Gk84RvbbpPrGUNT7T7DkXidJ2Nhd6AxHyl5ecqyu6uHODGKAA5XegCWVl1ytgXAmQFnnHOvDMrxL3l/3rIyI6r0Za3+E+MjMIapQUdK6Wv3hDIHg8oFqPT45EboczncwAmn7KnABJakjBsbiANDi/BE+P9+ToXvBjk4nGytosNlzuHlH79obz9KtCFhTOGzj6OjMTCNXFVTw0fZGi8zX9lWYJEKCKa26iLFxZ7sUcGKGh9fLEXK6c4gqHmmIk3lEK7g== Received: from BN9PR03CA0031.namprd03.prod.outlook.com (2603:10b6:408:fb::6) by DS0PR12MB8413.namprd12.prod.outlook.com (2603:10b6:8:f9::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.8; Wed, 1 Jul 2026 07:36:22 +0000 Received: from BN2PEPF00004FBA.namprd04.prod.outlook.com (2603:10b6:408:fb:cafe::1c) by BN9PR03CA0031.outlook.office365.com (2603:10b6:408:fb::6) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.181.8 via Frontend Transport; Wed, 1 Jul 2026 07:36:22 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) 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.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by BN2PEPF00004FBA.mail.protection.outlook.com (10.167.243.180) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.6 via Frontend Transport; Wed, 1 Jul 2026 07:36:21 +0000 Received: from rnnvmail202.nvidia.com (10.129.68.7) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 1 Jul 2026 00:35:36 -0700 Received: from rnnvmail201.nvidia.com (10.129.68.8) by rnnvmail202.nvidia.com (10.129.68.7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 1 Jul 2026 00:35:36 -0700 Received: from vdi.nvidia.com (10.127.8.10) by mail.nvidia.com (10.129.68.8) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Wed, 1 Jul 2026 00:35:26 -0700 From: Tariq Toukan To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , , Paolo Abeni CC: Adithya Jayachandran , Bobby Eshleman , Carolina Jubran , Cosmin Ratiu , Daniel Borkmann , Daniel Jurgens , Daniel Zahka , David Wei , Donald Hunter , Dragos Tatulea , Jiri Pirko , Jiri Pirko , Joe Damato , Jonathan Corbet , Kees Cook , Leon Romanovsky , , , , , Mark Bloch , Moshe Shemesh , Or Har-Toov , Parav Pandit , Petr Machata , Ratheesh Kannoth , Saeed Mahameed , Shahar Shitrit , Shay Drori , Shuah Khan , Shuah Khan , Simon Horman , Stanislav Fomichev , Tariq Toukan , Willem de Bruijn , Gal Pressman Subject: [PATCH net-next V10 13/14] selftests: drv-net: Add test for cross-esw rate scheduling Date: Wed, 1 Jul 2026 10:32:53 +0300 Message-ID: <20260701073254.754518-14-tariqt@nvidia.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20260701073254.754518-1-tariqt@nvidia.com> References: <20260701073254.754518-1-tariqt@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN2PEPF00004FBA:EE_|DS0PR12MB8413:EE_ X-MS-Office365-Filtering-Correlation-Id: 5d41d69a-ffb5-4d5f-083d-08ded74372ca X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|1800799024|82310400026|23010399003|376014|7416014|11063799006|56012099006|3023799007|6133799003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: xAKUmkB8Btiuc6apOnCetveYYpmshhDQIDVxPBsUUtYKbNeFROSQ8KW8GeuxSt4L+6uzplNfhKKlvJi9obUXKqVUHhYpXP4VdKWaRO2xEFhxfzc6H7+Ay+/FhXQUyPDAMufU1bbn1HpOkSO0ChXMHSQ2P8SB0sE/7E12ZVwy1dxOYztHNZZ8P48ZivjBQH+k1TdmbUC4gS9lVBOH6EzX+lUcV+6GAQ3xR/8HyJ7u1EgL4Ro4YjSRT7K0TOr5ec6FYHuRsBtHmX3vXMaksFbdpDYHIGyU2StkY9Xp1mkVwaNgHPQo7kvuMy1458XkSXBHlqWMquseOeXmUWcQp1Gx2L9XU8De76Dbj6pY787ZYQo3yX5Q7EsIcRpeeC0DuqNcTnxjQy06cQeK8rsQ+BUg2tipghhZon0NN4tRK1ofqMRjiOgZzorI8rEHdzhNjrUhaGE296azJ5C7ekFjkQnTNMQysgRnUmindpRKAfnP6W0dLyT7O7GQWyuRS2GOqIachmBk+kHauI1wnLb89fTuj+CXZEylbCxR9qyyNQ+D4vVzNKWofcstIsTin6bHSs0sCEcQueFFoRqueb+9STtq6I09GxWwT97JhgbL/BN2Ij4VQdi9sJC7pdlXBjR10rTyDbffRKDMweMt8sUdeTfR6hjf+ImAEUgT9GpMsbV4XGhrRXsZKCxXl2yvl/T3r8h/tD5ZcPOp/jO+RjaaOS3nBg== X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(36860700016)(1800799024)(82310400026)(23010399003)(376014)(7416014)(11063799006)(56012099006)(3023799007)(6133799003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: OkufxkfLogocSq8eSgu/BDFa9WfEPSDqgDqb4b2ktTs4ADA3f9X5BSaT1EE5fc81qphPPGujwpdpn0gOHRlEW0S1bye3qjtWTT+eEtoZ3bkp4WDQdKMIuFqiYy9HYw6e9n73LGAtfz5Q5T88WECfTrS+voJ69mZr08vw2Hh3n2atx2hiRQ+pvnYFdxMnqikvJo7/n0OEiZt3qLMXS7Wvw+fbjOGRYVwpvqqAw1oVrkz6lByobavmj52ZHVS4H+QWAciu/aPOFVh/YGRPFQYm8/lA/NY8eRNgjuVL5OUF+1bU4lCJgstIfntCgeg+iCEpJLBF93ttSZTK8KoKY430FpIbNWdRVCijD29iy519E7lC9xiXlKdA70MnphTNhAcWU5jDB1s8tbEFfoSVjXFH2oebDZw9QJzIbLovdAOBUuHNfhWcwjKC9QV/UfW8Xwmr X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Jul 2026 07:36:21.8819 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 5d41d69a-ffb5-4d5f-083d-08ded74372ca 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.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN2PEPF00004FBA.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB8413 Content-Type: text/plain; charset="utf-8" From: Cosmin Ratiu Adds a Python selftest using the YNL devlink API to verify the devlink rate ops. The test requires a bond device given in the config as NETIF containing two PFs. Test setup will then create 1 VF on each PF and verify the various rate commands. ./devlink_rate_cross_esw.py TAP version 13 1..3 ok 1 devlink_rate_cross_esw.test_same_esw_parent ok 2 devlink_rate_cross_esw.test_cross_esw_parent ok 3 devlink_rate_cross_esw.test_tx_rates_on_cross_esw Tests will be skipped when the preconditions aren't met, when the devlink API is too old or when the devices don't appear to support cross-esw scheduling (detected via EOPNOTSUPP). Signed-off-by: Cosmin Ratiu Reviewed-by: Carolina Jubran Signed-off-by: Tariq Toukan --- .../testing/selftests/drivers/net/hw/Makefile | 1 + .../drivers/net/hw/devlink_rate_cross_esw.py | 296 ++++++++++++++++++ 2 files changed, 297 insertions(+) create mode 100755 tools/testing/selftests/drivers/net/hw/devlink_rate_cro= ss_esw.py diff --git a/tools/testing/selftests/drivers/net/hw/Makefile b/tools/testin= g/selftests/drivers/net/hw/Makefile index fd0535a96d84..234db5c2c90c 100644 --- a/tools/testing/selftests/drivers/net/hw/Makefile +++ b/tools/testing/selftests/drivers/net/hw/Makefile @@ -20,6 +20,7 @@ TEST_GEN_FILES :=3D \ TEST_PROGS =3D \ csum.py \ devlink_port_split.py \ + devlink_rate_cross_esw.py \ devlink_rate_tc_bw.py \ devmem.py \ ethtool.sh \ diff --git a/tools/testing/selftests/drivers/net/hw/devlink_rate_cross_esw.= py b/tools/testing/selftests/drivers/net/hw/devlink_rate_cross_esw.py new file mode 100755 index 000000000000..4416f024cb76 --- /dev/null +++ b/tools/testing/selftests/drivers/net/hw/devlink_rate_cross_esw.py @@ -0,0 +1,296 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-2.0 + +""" +Devlink Rate Cross-eswitch Scheduling Test Suite +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D + +Control-plane tests for cross-eswitch TX scheduling via devlink-rate. +Validates that VFs from different PFs on the same chip can share +rate groups using the cross-device parent-dev attribute. + +Preconditions: +- NETIF points to a bond device with exactly two interfaces. +- the interfaces must be two PFs from different devices sharing the same c= hip. +- (for mlx5): the two interfaces are in switchdev mode and configured in a= LAG: + - devlink dev eswitch set $DEV1 mode switchdev + - devlink dev eswitch set $DEV2 mode switchdev + - devlink dev param set $DEV1 name esw_multiport value 1 cmode runtime + - devlink dev param set $DEV2 name esw_multiport value 1 cmode runtime +- test cases will be skipped if: + - the number of interfaces in the bond device is !=3D 2. + - the kernel doesn't support devlink rates. + - the devlink API doesn't support cross-device parents (ENODEV). + - cross-esw rate scheduling returns EOPNOTSUPP. +""" + +import errno +import glob +import os +import time + +from lib.py import ksft_pr, ksft_eq, ksft_run, ksft_exit +from lib.py import KsftSkipEx, KsftFailEx +from lib.py import NetDrvEnv, DevlinkFamily +from lib.py import NlError +from lib.py import cmd, defer, ip, tool + + +# --- Discovery and setup --- + + +def get_bond_slaves(bond_ifname): + """Returns sorted list of slave netdev names for a bond.""" + pattern =3D f"/sys/class/net/{bond_ifname}/lower_*" + lowers =3D glob.glob(pattern) + if not lowers: + raise KsftSkipEx(f"No bond slaves for {bond_ifname}") + slaves =3D [] + for path in sorted(lowers): + name =3D os.path.basename(path) + if name.startswith("lower_"): + name =3D name[len("lower_"):] + slaves.append(name) + return slaves + + +def discover_pfs(cfg): + """Discovers both PFs from bond slaves.""" + slaves =3D get_bond_slaves(cfg.ifname) + if len(slaves) !=3D 2: + raise KsftSkipEx(f"Need 2 bond slaves, found {len(slaves)}") + + pf0, pf1 =3D slaves[0], slaves[1] + ksft_pr(f"PF0: {pf0} PF1: {pf1}") + return pf0, pf1 + + +def get_pci_addr(ifname): + """Resolves PCI address for a network interface.""" + return os.path.basename(os.path.realpath(f"/sys/class/net/{ifname}/dev= ice")) + + +def get_vf_port_index(pf_pci): + """Finds devlink port-index for vf0 under pf_pci.""" + ports =3D tool("devlink", "port show", json=3DTrue)["port"] + for port_name, props in ports.items(): + if port_name.startswith(f"pci/{pf_pci}/") and props.get("vfnum") = =3D=3D 0: + return int(port_name.split("/")[-1]) + raise KsftSkipEx(f"VF port not found for {pf_pci}") + + +def cleanup_esw(pf): + """Removes VFs if created by tests.""" + cmd(f"echo 0 > /sys/class/net/{pf}/device/sriov_numvfs", shell=3DTrue,= fail=3DFalse) + + +def setup_esw(pf): + """Creates 1 VF on 'pf'.""" + path =3D f"/sys/class/net/{pf}/device/sriov_numvfs" + cmd(f"echo 0 > {path}", shell=3DTrue) + cmd(f"echo 1 > {path}", shell=3DTrue) + defer(cleanup_esw, pf) + time.sleep(2) + + vf_dir =3D f"/sys/class/net/{pf}/device/virtfn0/net" + entries =3D os.listdir(vf_dir) if os.path.isdir(vf_dir) else [] + if not entries: + raise KsftSkipEx(f"VF not found for {pf}") + ip(f"link set dev {entries[0]} up") + + pf_pci =3D get_pci_addr(pf) + vf_idx =3D get_vf_port_index(pf_pci) + ksft_pr(f"Created VF {vf_idx} on PF {pf} ({pf_pci})") + return pf_pci, vf_idx + + +# --- Rate operation helpers --- + + +def rate_new(devnl, dev_pci, node_name, **kwargs): + """Creates rate node.""" + params =3D { + "bus-name": "pci", + "dev-name": dev_pci, + "rate-node-name": node_name, + } + params.update(kwargs) + try: + devnl.rate_new(params) + except NlError as e: + if e.error =3D=3D errno.EOPNOTSUPP: + raise KsftSkipEx("rate_new not supported") from e + raise KsftFailEx("rate_new failed") from e + + +def rate_get(devnl, dev_pci, node_name): + """Gets rate node.""" + params =3D { + "bus-name": "pci", + "dev-name": dev_pci, + "rate-node-name": node_name, + } + return devnl.rate_get(params) + + +def rate_get_leaf(devnl, dev_pci, port_index): + """Gets rate leaf (VF).""" + params =3D { + "bus-name": "pci", + "dev-name": dev_pci, + "port-index": port_index, + } + return devnl.rate_get(params) + + +def rate_del(devnl, dev_pci, node_name): + """Deletes rate node.""" + devnl.rate_del({ + "bus-name": "pci", + "dev-name": dev_pci, + "rate-node-name": node_name, + }) + + +def rate_set_leaf(devnl, dev_pci, port_index, **kwargs): + """Sets rate attributes on a leaf (VF).""" + params =3D { + "bus-name": "pci", + "dev-name": dev_pci, + "port-index": port_index, + } + params.update(kwargs) + try: + devnl.rate_set(params) + except NlError as e: + if e.error =3D=3D errno.EOPNOTSUPP: + raise KsftSkipEx("rate_set not supported") from e + raise KsftFailEx("rate_set failed") from e + + +def rate_set_leaf_parent(devnl, dev_pci, port_index, + parent_name, parent_dev_pci=3DNone): + """Sets a leaf's parent, optionally cross-esw.""" + params =3D { + "bus-name": "pci", + "dev-name": dev_pci, + "port-index": port_index, + "rate-parent-node-name": parent_name, + } + if parent_dev_pci: + params["parent-dev"] =3D { + "bus-name": "pci", + "dev-name": parent_dev_pci, + } + try: + devnl.rate_set(params) + except NlError as e: + if e.error =3D=3D errno.EOPNOTSUPP: + raise KsftSkipEx("rate_set not supported") from e + if parent_dev_pci and e.error =3D=3D errno.ENODEV: + raise KsftSkipEx("Cross-esw scheduling not supported") from e + raise KsftFailEx("rate_set failed") from e + + +def rate_clear_leaf_parent(devnl, dev_pci, port_index): + """Clears a leaf's parent.""" + rate_set_leaf_parent(devnl, dev_pci, port_index, "") + + +def rate_set_node(devnl, dev_pci, node_name, **kwargs): + """Sets rate attributes on a node.""" + params =3D { + "bus-name": "pci", + "dev-name": dev_pci, + "rate-node-name": node_name, + } + params.update(kwargs) + devnl.rate_set(params) + + +# --- Test cases --- + + +def test_same_esw_parent(cfg): + """Assigns PF0's VF to PF0's group (same esw baseline).""" + pf0, _ =3D discover_pfs(cfg) + pf0_pci, vf0_idx =3D setup_esw(pf0) + + rate_new(cfg.devnl, pf0_pci, "group0") + defer(rate_del, cfg.devnl, pf0_pci, "group0") + ksft_pr("rate-new succeeded") + + rate_set_leaf_parent(cfg.devnl, pf0_pci, vf0_idx, "group0") + defer(rate_clear_leaf_parent, cfg.devnl, pf0_pci, vf0_idx) + + ksft_pr("Same-esw parent assignment succeeded") + + +def test_cross_esw_parent(cfg): + """Sets cross-esw parent, then clear it.""" + pf0, pf1 =3D discover_pfs(cfg) + pf0_pci, _ =3D setup_esw(pf0) + pf1_pci, vf1_idx =3D setup_esw(pf1) + + rate_new(cfg.devnl, pf0_pci, "group1") + defer(rate_del, cfg.devnl, pf0_pci, "group1") + ksft_pr("rate-new succeeded") + + rate_set_leaf_parent(cfg.devnl, pf1_pci, vf1_idx, + "group1", parent_dev_pci=3Dpf0_pci) + defer(rate_clear_leaf_parent, cfg.devnl, pf1_pci, vf1_idx) + + ksft_pr("Cross-esw parent set and clear succeeded") + + +def test_tx_rates_on_cross_esw(cfg): + """Sets tx_max on group and tx_share on leaves in a cross-esw setup.""" + pf0, pf1 =3D discover_pfs(cfg) + pf0_pci, vf0_idx =3D setup_esw(pf0) + pf1_pci, vf1_idx =3D setup_esw(pf1) + + rate_new(cfg.devnl, pf0_pci, "group2", **{"rate-tx-max": 10000000}) + defer(rate_del, cfg.devnl, pf0_pci, "group2") + ksft_pr("rate-new succeeded") + + rate_set_leaf_parent(cfg.devnl, pf1_pci, vf1_idx, + "group2", parent_dev_pci=3Dpf0_pci) + defer(rate_clear_leaf_parent, cfg.devnl, pf1_pci, vf1_idx) + ksft_pr("set parent cross-esw succeeded") + + rate_set_leaf_parent(cfg.devnl, pf0_pci, vf0_idx, "group2") + defer(rate_clear_leaf_parent, cfg.devnl, pf0_pci, vf0_idx) + ksft_pr("set parent same esw succeeded") + + rate_set_leaf(cfg.devnl, pf0_pci, vf0_idx, **{"rate-tx-share": 1000000= }) + rate =3D rate_get_leaf(cfg.devnl, pf0_pci, vf0_idx) + ksft_eq(rate["rate-tx-share"], 1000000) + rate_set_leaf(cfg.devnl, pf1_pci, vf1_idx, **{"rate-tx-share": 2000000= }) + rate =3D rate_get_leaf(cfg.devnl, pf1_pci, vf1_idx) + ksft_eq(rate["rate-tx-share"], 2000000) + rate_set_node(cfg.devnl, pf0_pci, "group2", **{"rate-tx-max": 25000000= 0}) + rate =3D rate_get(cfg.devnl, pf0_pci, "group2") + ksft_eq(rate["rate-tx-max"], 250000000) + + ksft_pr("tx_max and tx_share set on cross-esw group") + + +def main() -> None: + """Main function.""" + + with NetDrvEnv(__file__, nsim_test=3DFalse) as cfg: + cfg.devnl =3D DevlinkFamily() + + ksft_run( + cases=3D[ + test_same_esw_parent, + test_cross_esw_parent, + test_tx_rates_on_cross_esw, + ], + args=3D(cfg,), + ) + ksft_exit() + + +if __name__ =3D=3D "__main__": + main() --=20 2.44.0 From nobody Wed Jul 1 16:10:59 2026 Received: from SJ2PR03CU001.outbound.protection.outlook.com (mail-westusazon11012053.outbound.protection.outlook.com [52.101.43.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5A1753A3809; Wed, 1 Jul 2026 07:36:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.43.53 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891376; cv=fail; b=oM2upA2lzz+cszQcXO+SIXnlVDlLBWDAeDHt4gc+oBkY1VNa/ulJC69CkTCXh8m7vaCv4HhtC2HMyzLBTk0YrrWJSu42Q0M/b1lKUuBtbv61TAQ5G6gFFGF/WpYXoz5fty/Mp2Y3otcvo92cTnBIT6DKBiIQLVdaLTWoKpD9zK8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782891376; c=relaxed/simple; bh=vVdNHD/ZkVGIxB+DPg9Nrc5zVgLXZWYLlNmWBZ8IrXg=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=hfhggOQvGSFPFGI/6OSFhqctrPNfF7QUzglfLdGtii8wFYnXd0DbFCsCQnMy7zZAbxSknPEOcZ7eeve4FhhNMe7Fuz1olMOIMCO7PDAm6DbWE4MLAWLLklT6SB0rXoDs3fo0bWIGnW7x/iSmZT0It6b6rntAftBb+JZZSTYRTg8= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=MMPfvG/B; arc=fail smtp.client-ip=52.101.43.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="MMPfvG/B" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=HUPVcR4kpqcQvsGv2/qjKmgbnWHpS77f2FeJpIqU67d2dkDVbAmzMllRxmloT90GbxFp4dkKzQzi6YwX6qd3fGG2vYFlCDgzNtZK8Bn8c4JXysLWzhrytuTTyuMLwEjUEscpW5Y6eXol7AmWfQWLFFnd0sN4EvvjDvJ6OUHrKXTMZxoOlsRFIpxnkhnGKCdaqTiKlUWjnq8wTuVMt2uMSlxlI0AsmfJLF332HR3ynKsXIi1/PbweM3wCZ1D5ym1vz78m/FmGbEbWsMhToWQ2FS5DD7JnJJ0HpUNJpePoMNthkVvalVUfBI4quKbd6VJwxlINvWjIO2BfCc5O+p2m5w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=n9Q4QodnLSHOwA9hye0TT6aanlO0XGJ/jIrlHqS5rfY=; b=aYQ5mb1NEtVRyNdp5YFziq/i0gGZkyq9Uh+EN8V+thnyGf6JqkYkDxlWkNxc2qUclWPFFjcWYkJ6vG1cpBXoEIxhPiy2hFNtfG9ceaGIqwtyaPFnc1CcXa/spAN7oVHnJVkXa2xSmKdQ2FNLfEX8bcxjEcc+7KMTpB46puxRbTHhV0lYt7Hk1MWjmPzBe2LreK+E2OgtQjFT6ncvjR9sbo8P5mYavvX4S/8G/kUWDkk18hfwtTkPsY5gir12zv1PBjmqYdpOkKTPQIPjqUp7vhEWqhArFz9SF7rMrPUokroMUQ4aiXoAfwzdsB2GC+Fb05vAglXAJSQnJyA1EVNnqg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=lunn.ch 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=n9Q4QodnLSHOwA9hye0TT6aanlO0XGJ/jIrlHqS5rfY=; b=MMPfvG/BpwoWMVkXYQuyugH/ULy8voTUgpdTZSuwPmiIRFGGQiJA2cCnyJIqvrllRQuFWbCwCa9KXjgbtglZOXTXus4iudqtVPAudqUr0gQjHOhngxTGpUvSS8GaVUiOK7hry6nsit3E+devHSjLTcf4tyRHPqMgj4AqWDIOa7xXqa/GdSetEBQejW4ilvl9cY9YjwYbrWYfZJ+taPQ2Yp4z7mE53AZlpMn6wd8HpZtY/gtZp0ipsofLAlLhj4CjtbyS0Wn0Re7//rCUI5UhGgAR7hkqyvnRMQ64mtgWQZn/YhMjOs09kBOGywfhRClezDKp6CyUfmkc1+WrZEEV6w== Received: from DM6PR02CA0120.namprd02.prod.outlook.com (2603:10b6:5:1b4::22) by DM4PR12MB8522.namprd12.prod.outlook.com (2603:10b6:8:18f::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.8; Wed, 1 Jul 2026 07:36:07 +0000 Received: from DS1PEPF00017090.namprd03.prod.outlook.com (2603:10b6:5:1b4:cafe::96) by DM6PR02CA0120.outlook.office365.com (2603:10b6:5:1b4::22) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.181.8 via Frontend Transport; Wed, 1 Jul 2026 07:36:07 +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 DS1PEPF00017090.mail.protection.outlook.com (10.167.17.132) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.6 via Frontend Transport; Wed, 1 Jul 2026 07:36:07 +0000 Received: from rnnvmail203.nvidia.com (10.129.68.9) 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.2562.20; Wed, 1 Jul 2026 00:35:47 -0700 Received: from rnnvmail201.nvidia.com (10.129.68.8) by rnnvmail203.nvidia.com (10.129.68.9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 1 Jul 2026 00:35:46 -0700 Received: from vdi.nvidia.com (10.127.8.10) by mail.nvidia.com (10.129.68.8) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Wed, 1 Jul 2026 00:35:36 -0700 From: Tariq Toukan To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , , Paolo Abeni CC: Adithya Jayachandran , Bobby Eshleman , Carolina Jubran , Cosmin Ratiu , Daniel Borkmann , Daniel Jurgens , Daniel Zahka , David Wei , Donald Hunter , Dragos Tatulea , Jiri Pirko , Jiri Pirko , Joe Damato , Jonathan Corbet , Kees Cook , Leon Romanovsky , , , , , Mark Bloch , Moshe Shemesh , Or Har-Toov , Parav Pandit , Petr Machata , Ratheesh Kannoth , Saeed Mahameed , Shahar Shitrit , Shay Drori , Shuah Khan , Shuah Khan , Simon Horman , Stanislav Fomichev , Tariq Toukan , Willem de Bruijn , Gal Pressman Subject: [PATCH net-next V10 14/14] net/mlx5: Document devlink rates Date: Wed, 1 Jul 2026 10:32:54 +0300 Message-ID: <20260701073254.754518-15-tariqt@nvidia.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20260701073254.754518-1-tariqt@nvidia.com> References: <20260701073254.754518-1-tariqt@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS1PEPF00017090:EE_|DM4PR12MB8522:EE_ X-MS-Office365-Filtering-Correlation-Id: e6ed5ba5-d19e-478b-a16b-08ded74369e7 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|23010399003|376014|7416014|36860700016|1800799024|32116099003|11063799006|56012099006|22082099003|18002099003|3023799007; X-Microsoft-Antispam-Message-Info: dkgL1dY93hit5FurXnPM4unFOv5JUi/md0swPrFDIPoddKm0rFFpryGOrl05zvLMg1oXZBssv3f1a2GgcAu6vUpSBvOY3WAuGvtumZsRkcJ+wF+8joljmggltzV8k52dbLjD4R0qTqh2NSWVLz0K+i5DMaxZQ3yrFH/e28fhFsg4gox5jEJ0mbrlj13mJrdNr3XbRfiYanRnWIxlw7gstJK9XodtlnObKIN4cZ14i+jXIYnO5+6z64tgDkYQg1A75t5OCP6N+8lZcx+NcwqEQmmiORjSqfIRFjSFTmAX5AXjfIo2BPAShGrp9OidVJKDIj1NVDOhU6C4Arv4P6g8wXgkD4RDAgOBEtwdtq1Mpwlb4zwIhm4ZNKT4x3FpurZk3kCYoFJxQ02BTpMvVUtXAW28HLPjwO2FWOnmbGkfbqys05+gfpFwKOGPZcy49/c6cEyjfL4PObPvGAdkkv2XEC+TveK9VixkcIr9kHhE0zYOFygWpG/58WMm5dqVBmMbHKMye+2SLJijjTXS404kSJ+v3fh54Qj8Jg8YI4kRQ1kHY2t/tJl/vW1Nl0KjyaiRHdLpnYFZsJXov7aHWIQqJlUIafVSLbdeqz/6VLOl4bLIoBs0dyR7dzWarT5ZbtxRva0lGuRzlDfIfDD3HnbdwsBKbZF1M4vJbrMFBasThRwkMq3XcMDZzXntjKPcZlJFuSjnYhjg2gmZ8Z5b6QVmcA== 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)(23010399003)(376014)(7416014)(36860700016)(1800799024)(32116099003)(11063799006)(56012099006)(22082099003)(18002099003)(3023799007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: gFOQvPbkXQ0ZXxASoN+YPxhG0bGEILy51tEPZTg+mQltaVi//BXr5QA1kJ0i35Bf424rjH4C6K1JA+z6u50AIIysXugNHB9FL9409rHf3KoPs8tZTF9oHnNf4BSzI8y0E0qouIre/3KyjIvZyitvsuLdMfq7Z21eR4uua4NibemLnEH/z+BzutsInXQOZNoV8Mrl1e34QCwX/Q6pRImVMS929b8NJSiKvcn2gl1H/WPzDmJvWzu1Wwd9Efzs0BVxQz8CeocAQsvN49T5K5ZmeKazNdxHnzCi0sTq4ODqFUpHhuiWI24mYa4YdY/roO5aC0gZBZheN9nIEVgCGMCpb439iJ3gLT2zvngXg4vuIwcySa1yEbXKc0hfLIKIYDX+HGCjU2x9Gow27u4510A13GWfw4CXuQY4c2sdr/7nKAvR0PA7F7PWuGiUNGcDSKit X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Jul 2026 07:36:07.0548 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: e6ed5ba5-d19e-478b-a16b-08ded74369e7 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: DS1PEPF00017090.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM4PR12MB8522 Content-Type: text/plain; charset="utf-8" From: Cosmin Ratiu It seems rates were not documented in the mlx5-specific file, so add examples on how to limit VFs and groups and also provide an example of the intended way to achieve cross-esw scheduling. Signed-off-by: Cosmin Ratiu Reviewed-by: Carolina Jubran Signed-off-by: Tariq Toukan --- Documentation/networking/devlink/mlx5.rst | 33 +++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/Documentation/networking/devlink/mlx5.rst b/Documentation/netw= orking/devlink/mlx5.rst index 4bba4d780a4a..cf1dffa67669 100644 --- a/Documentation/networking/devlink/mlx5.rst +++ b/Documentation/networking/devlink/mlx5.rst @@ -419,3 +419,36 @@ User commands examples: =20 .. note:: This command can run over all interfaces such as PF/VF and representor = ports. + +Rates +=3D=3D=3D=3D=3D + +mlx5 devices can limit transmission of individual VFs or a group of them v= ia +the devlink-rate API in switchdev mode. + +User commands examples: + +- Print the existing rates:: + + $ devlink port function rate show + +- Set a max tx limit on traffic from VF0:: + + $ devlink port function rate set pci/0000:82:00.0/1 tx_max 10Gbit + +- Create a rate group with a max tx limit and add two VFs to it:: + + $ devlink port function rate add pci/0000:82:00.0/group1 tx_max 10Gbit + $ devlink port function rate set pci/0000:82:00.0/1 parent group1 + $ devlink port function rate set pci/0000:82:00.0/2 parent group1 + +- Same scenario, with a min guarantee of 20% of the bandwidth for the firs= t VF:: + + $ devlink port function rate add pci/0000:82:00.0/group1 tx_max 10Gbit + $ devlink port function rate set pci/0000:82:00.0/1 parent group1 tx_s= hare 2Gbit + $ devlink port function rate set pci/0000:82:00.0/2 parent group1 + +- Cross-device scheduling:: + + $ devlink port function rate add pci/0000:82:00.0/group1 tx_max 10Gbit + $ devlink port function rate set pci/0000:82:00.1/32769 parent pci/000= 0:82:00.0/group1 --=20 2.44.0