From patchwork Fri Apr 11 07:49:53 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cosmin Ratiu X-Patchwork-Id: 880420 Received: from NAM11-BN8-obe.outbound.protection.outlook.com (mail-bn8nam11on2057.outbound.protection.outlook.com [40.107.236.57]) (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 8809127CB35; Fri, 11 Apr 2025 07:50:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.236.57 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744357844; cv=fail; b=qQnHqjGPUDh6gFGDr9jJkp/M2xeWhpBjr5ju54RaOEiMFA6dPvNOJ/KQuTu/zKn0SLSOLfwgz30LasrQ+WJRIQI6g5xqEBJhOZ11KspcUxFQ4CB3HMYcaFuF8SbXgUOymyN8u3ahSTlxRLTSnTwylw5vhdkYweEtp1beiqnB7rk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744357844; c=relaxed/simple; bh=PxpHMv3OwwafxhfofSf3Tq51XIvlMrBU5421PLZqqpk=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Ys4reChtudiOmrxC4/+v4wkU8VcET0o4iGHuN1stUeY0ys2yFWQ/ZVsOJzFe5T/E+cgXUWYy9F8mUih8bPlel93MfbB6knSBb/bv7RuoIVldWjbHGE77kSpVI5LCsXqlLYKdMJDUXmHuUXf+syK9inclmMwOXhrwrdKpkqmizrc= 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=U9kp9NxF; arc=fail smtp.client-ip=40.107.236.57 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="U9kp9NxF" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=gU32upvu3w/HcFkzcsN9AtsscGE9q/bPbyoH3X3Pr/bAOsDp0uXbaa6fFGDz1wLLQivtLfJ4ax5E609vK/G+ZGgR+WePgcTuhnvFp6Z3pewK383vISyFd8dLL/BtbwwlU2gmu4TIItPl4ohrf1aCJx2q0K5++5wXX3TCcQU2wPhsEg6C05NcR+u0X2+k1SBScxfuLXWY5vWYAnxLppWc+tQhY2X7w24TjAFXiDGVDF3g0OD5YsSu4V4+PVFzva7dVPsDYsvX4ze0+4LTB3oWDJYSq0q7JdXwL1Hud1LhJGjFfdXKCuHrMmWcb9kO257wcGCn+Ia447wvsdKg3aRU6g== 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=QmaKZ2a1c8ZWuZwVRSCAmwfcPxFr+O+1DjrW1I+K6R0=; b=yEGYNnZkV9yf7dFZFYq3DXcj5sdRADS+z5loNmzt5maULyJLJR3Y7FhUph/rknYKeiuC7VY72jjja0bq20pf9PbM1uDKcJeUBSrACMSttZ7QIARv4uYZMMZfOAKuHWJGGQG4OM+uXV471+pvIlGUufwOktiHlygte/arE5XiFwlIVi14IsH63Mw5Vyi0PcrqoJ8hUdr4l8Qp6lst69vACa5xgOhtuaP/cMBCFuB2NW8AFloxdHRIT2wYRCj4HbsbL34+X0A6i0Cim2Z6D5MZhtxdYgWsngt5NhwoCjXFpg9eZWchJ67xoi889b+kv9EGYHmYhuuMs099dZJCkZaUFg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=QmaKZ2a1c8ZWuZwVRSCAmwfcPxFr+O+1DjrW1I+K6R0=; b=U9kp9NxFGpAwuke7FHP4RNFdWW7A4Rjo3d0l4hAyr6vPyvygA+BMxTAfan3cb+zyB2OkLG7+U3mTx8VwMCd5DDHS9ki12MUu65PURYsVLYxFj/xhywh4fHezJY4sk5ARYUqQ+oRZomENHk2UJtv7iC9gld7P8DBPBgLpvZ4J0/PxNFJbGYPY+q+OOdL8CetlUEfJAnQn+dywiqpcfvmE24EHTNbBo08VEHBomv0NDw52daOq32trzj9yj2oAcA+h7sTiDS1zOMLWnBGiWCwrSMCZ4l+/Wi1GhEZ5d+SmIP7SGFS7J5/oLkpaneZMvO2YSVRYf8UKOm0vcmuyDRCV0Q== Received: from CH2PR04CA0028.namprd04.prod.outlook.com (2603:10b6:610:52::38) by DS0PR12MB7746.namprd12.prod.outlook.com (2603:10b6:8:135::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8632.27; Fri, 11 Apr 2025 07:50:36 +0000 Received: from CH1PEPF0000A346.namprd04.prod.outlook.com (2603:10b6:610:52:cafe::86) by CH2PR04CA0028.outlook.office365.com (2603:10b6:610:52::38) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8632.26 via Frontend Transport; Fri, 11 Apr 2025 07:50:36 +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 CH1PEPF0000A346.mail.protection.outlook.com (10.167.244.11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8655.12 via Frontend Transport; Fri, 11 Apr 2025 07:50:36 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.4; Fri, 11 Apr 2025 00:50:22 -0700 Received: from c-237-113-240-247.mtl.labs.mlnx (10.126.231.35) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.14; Fri, 11 Apr 2025 00:50:15 -0700 From: Cosmin Ratiu To: , CC: Hangbin Liu , Jay Vosburgh , Andrew Lunn , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Nikolay Aleksandrov , Simon Horman , Saeed Mahameed , Tariq Toukan , Jianbo Liu , Steffen Klassert , Herbert Xu , Ayush Sawal , Tony Nguyen , "Przemek Kitszel" , Sunil Goutham , Geetha sowjanya , Subbaraya Sundeep , hariprasad , Bharat Bhushan , Louis Peens , "Leon Romanovsky" , Subject: [PATCH net-next v3 1/6] net/mlx5: Avoid using xso.real_dev unnecessarily Date: Fri, 11 Apr 2025 10:49:53 +0300 Message-ID: <20250411074958.2858496-2-cratiu@nvidia.com> X-Mailer: git-send-email 2.45.0 In-Reply-To: <20250411074958.2858496-1-cratiu@nvidia.com> References: <20250411074958.2858496-1-cratiu@nvidia.com> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-ClientProxiedBy: rnnvmail203.nvidia.com (10.129.68.9) To rnnvmail201.nvidia.com (10.129.68.8) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH1PEPF0000A346:EE_|DS0PR12MB7746:EE_ X-MS-Office365-Filtering-Correlation-Id: 6a334409-c87c-48f6-8674-08dd78cd8b9d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|7416014|376014|1800799024|36860700013|82310400026; X-Microsoft-Antispam-Message-Info: 37ZPxVWqepluddvSedcJpCxnOJk/AlMEaciGPPi5n5/gAbv4HjlNjIDGT04vqhDoqD4zRmj5H6WVrEHKxkOicoSNo6DII6pySIkLtP4y9+JtmqbTEZz6Jt/93qXRVbrJNykPn+pi0XZvocjREEt2Yz81/YC8HZ2WLy1DEaSM7uDHRaoq0geBmltBlYVoHALepZ3CT6h398WoMXa9HNJLGSY+2UfYFG4iWyeWGbtxfDqtHrZz1BPVaV9PaXPKCZfqlG6Lhpz0dX7WYpEOQljrfQq9LBXlRsvzUHOnWTXEX0B58FF/PUafNoCgG4dUBD+6/5wyvZ9dLGyPhcXyAPdCf355mRo6/ea7ei3hBBczayX3zexZTa3nbaNr5W6Zk4sUf9jYfry/Xqi9IbDRlTCGwWopkyfCOyDBxbA5+EUIQiK3CiREtIa9c+FYHx1t22CwWXWemQF9QEkVfQBCKKYMlJOywc42lqCP6XsoCheVcI1r8Y7ayZ8S+JtuTbx67ag9nYUgH9mm6NZlC9AcgCcyX+ZYhg07U37eRAxbB+DTxQSY/l0wVzDC7UHmw0Gmv7zG4ir8BxBXlo8YJqfR3ZzJ80yRHOTE+it0jz3XeSo++ppbM2wVD8EW3K4tdmv3szziT3kc0ISGDzZ0GjCpKigx9LzuUi++5gZLCDPV15h/6kxnTdw8Lruu2e5U6Rmg5n1/Dck75/ONIqYc3JUQgY1YcNxgmU3mQFnaYPoCgaExbNTKR6sGKfx8dnwzJDu8tEFMdRoQOqsFKN8VRj6T/en7gsQYvfCVIVznjdGyDIgWTlSpucrGfkZpr/9cBDKmfwj5a5JjkViCtmKcVGVcOjYM1QJOmLNIADTBqhK9J48frXVl4XJ5q875ICOxnxMFnhLcdSQtim8Y+YqbFwsKtf3y6tOX4rWbBAZOqezrMzB5J7NRRmDn/diMPOPzfpJiVlzsijCJay4vQ0yg0+I9mlNxRMHiHurLkHRuxhmK5wgE66MdP7EF73vhBIyUSaafRaQDOYsziV3kpQFSCOL4iDFUUmDAROE6ERFFCp4kgI34OdXhT5bORTn5dJBrpFIOrx+dLxneOFAkpZWLAZy6gLEXXx10mtl31bEQGVFZ3HSPxjSfLYYFz9x6QFiMG6K03GtZfhygwNJwJSlI87G3Whxh8RkTIcVtVJ/DD9J75Lzpbu/alnRj84FY7K7bJQqVg6DCi+qY0HtfszOd8NSQJD7vP3BWUSRxekwP6DP4G+9UY0UrNVD9vEIoJUACpLVIYbX6qLzZr4OnAf68FqHDNNUzkVHqY6AYnmpe+8tSWbgaoMYlwIH6Zxk8KEFjTYo5G4huRrnE94xhT804lMBBQFlTrsnyJxv3TgaJCLx9yO7GucHy4GRe9WFLuHCzqRw5pz44R0fTLPjp6j5JtyvRS8brI0H8hV4VX+A1tg7X5hhVhu5+CX2oI9E9GugLDQPdjNQqiC52sUQGayZT/klsFigwtbyD+5aiNU0nY7d8wC4kmGyfsBopYbMGisozTGiBhx1U 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)(1800799024)(36860700013)(82310400026); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Apr 2025 07:50:36.0745 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6a334409-c87c-48f6-8674-08dd78cd8b9d 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: CH1PEPF0000A346.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB7746 xso.real_dev is the active device of an offloaded xfrm state and is managed by bonding. As such, it's subject to change when states are migrated to a new device. Using it in places other than offloading/unoffloading the states is risky. This commit saves the device into the driver-specific struct mlx5e_ipsec_sa_entry and switches mlx5e_ipsec_init_macs() and mlx5e_ipsec_netevent_event() to make use of it. Additionally, mlx5e_xfrm_update_stats() used xso.real_dev to validate that correct net locks are held. But in a bonding config, the net of the master device is the same as the underlying devices, and the net is already a local var, so use that instead. The only remaining references to xso.real_dev are now in the .xdo_dev_state_add() / .xdo_dev_state_delete() path. Signed-off-by: Cosmin Ratiu Reviewed-by: Leon Romanovsky --- .../ethernet/mellanox/mlx5/core/en_accel/ipsec.c | 16 +++++----------- .../ethernet/mellanox/mlx5/core/en_accel/ipsec.h | 1 + 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c index 2dd842aac6fc..626e525c0f0d 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c @@ -259,8 +259,7 @@ static void mlx5e_ipsec_init_macs(struct mlx5e_ipsec_sa_entry *sa_entry, struct mlx5_accel_esp_xfrm_attrs *attrs) { struct mlx5_core_dev *mdev = mlx5e_ipsec_sa2dev(sa_entry); - struct xfrm_state *x = sa_entry->x; - struct net_device *netdev; + struct net_device *netdev = sa_entry->dev; struct neighbour *n; u8 addr[ETH_ALEN]; const void *pkey; @@ -270,8 +269,6 @@ static void mlx5e_ipsec_init_macs(struct mlx5e_ipsec_sa_entry *sa_entry, attrs->type != XFRM_DEV_OFFLOAD_PACKET) return; - netdev = x->xso.real_dev; - mlx5_query_mac_address(mdev, addr); switch (attrs->dir) { case XFRM_DEV_OFFLOAD_IN: @@ -713,6 +710,7 @@ static int mlx5e_xfrm_add_state(struct xfrm_state *x, return -ENOMEM; sa_entry->x = x; + sa_entry->dev = netdev; sa_entry->ipsec = ipsec; /* Check if this SA is originated from acquire flow temporary SA */ if (x->xso.flags & XFRM_DEV_OFFLOAD_FLAG_ACQ) @@ -855,8 +853,6 @@ static int mlx5e_ipsec_netevent_event(struct notifier_block *nb, struct mlx5e_ipsec_sa_entry *sa_entry; struct mlx5e_ipsec *ipsec; struct neighbour *n = ptr; - struct net_device *netdev; - struct xfrm_state *x; unsigned long idx; if (event != NETEVENT_NEIGH_UPDATE || !(n->nud_state & NUD_VALID)) @@ -876,11 +872,9 @@ static int mlx5e_ipsec_netevent_event(struct notifier_block *nb, continue; } - x = sa_entry->x; - netdev = x->xso.real_dev; data = sa_entry->work->data; - neigh_ha_snapshot(data->addr, n, netdev); + neigh_ha_snapshot(data->addr, n, sa_entry->dev); queue_work(ipsec->wq, &sa_entry->work->work); } @@ -996,8 +990,8 @@ static void mlx5e_xfrm_update_stats(struct xfrm_state *x) size_t headers; lockdep_assert(lockdep_is_held(&x->lock) || - lockdep_is_held(&dev_net(x->xso.real_dev)->xfrm.xfrm_cfg_mutex) || - lockdep_is_held(&dev_net(x->xso.real_dev)->xfrm.xfrm_state_lock)); + lockdep_is_held(&net->xfrm.xfrm_cfg_mutex) || + lockdep_is_held(&net->xfrm.xfrm_state_lock)); if (x->xso.flags & XFRM_DEV_OFFLOAD_FLAG_ACQ) return; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.h b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.h index a63c2289f8af..ffcd0cdeb775 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.h @@ -274,6 +274,7 @@ struct mlx5e_ipsec_limits { struct mlx5e_ipsec_sa_entry { struct mlx5e_ipsec_esn_state esn_state; struct xfrm_state *x; + struct net_device *dev; struct mlx5e_ipsec *ipsec; struct mlx5_accel_esp_xfrm_attrs attrs; void (*set_iv_op)(struct sk_buff *skb, struct xfrm_state *x, From patchwork Fri Apr 11 07:49:54 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cosmin Ratiu X-Patchwork-Id: 880687 Received: from NAM10-MW2-obe.outbound.protection.outlook.com (mail-mw2nam10on2086.outbound.protection.outlook.com [40.107.94.86]) (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 C127D27D796; Fri, 11 Apr 2025 07:50:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.94.86 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744357845; cv=fail; b=Zh+QCnMWGVFCsVprUF77oahMoipV4tMVrDRNrUoKWZZUOO4iZfrg+g9pvQ/6rHfQnpnbix/twatvbAoVKRek3BXz0qoUXTF03a2pUub8yEpxK51ePKSxwTHMh4klVFK9Q+jBBdjlCaUpyQ809FHWWAjOkxWaO7wQh1zcBJOdPnw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744357845; c=relaxed/simple; bh=E7YAMbh4rhcCrP8GqyO5BHfECff1nYTF5Hqcd6c1fFw=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ph/9+/o3Jz/sxpQuqa0rDp/ZPqcZDJd+Kajgab/Eii4xYdmfmoa+MsUl6hew4r1NeXnhFm6uDW8lANO4clGKGoR3Kks4t3TQI6A7dEC3ZCpFn4XN4FsZ4T3aw02UTR5DnXuOP5TEqHmFxNTiOPZBN5g9VIWxURI1xV1wougWABo= 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=PtefoDzz; arc=fail smtp.client-ip=40.107.94.86 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="PtefoDzz" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=soSbYujKPmHPEgN0F3fDfZpP/tq8i8bc9T6AvpeDeUtz2Q6aMIcDUhQIQasbpd0IOeWQbAifm+mBkKefdWvgNer2AcqvA67iG0AjVbATHO0fs9J/g5vgsXRoF/rXNUprU9I90d+nT+rjmoqi7KDsPZO7cQDSGlo13ttw4ztrpjpUJnkdp+Vtn5xJq0ziW0Rug0defHrhDDJnitj0ONbCPEw+AW0bR54Mg2INQafWCLD2JEfqmQJyguXUqXiYb45ziX5tidmGFcS9f5aB+ulfcPtEdtmwJOL7QUIWLXjVlJVZpuD4n+i4YMOyJHslFdD9BwHci0KGC5TuI7qe5bwSIg== 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=JeP0oeFT1V1YZfI0RbwA8wpecEhr06zGkLkr7cOahY8=; b=h3enhx+euIVM6jKX9hA/d3YlrU1o/L2gPHMZlGkO3nP0k/XFeOTTBDnuJx4pWbOygCLwyr/CDJx8vtvL6tK/3rNm/fNsaw+ICEItGd4BJaAY7sL6kyiUGlxTzYCm+AAQlK7UaJLEJdfkcPrLa7fM4aISx1Ucu2WYjp6VCB1Rglk8vn60ZfUXnNRkK5z/CN7cwlELF2kHydwXSS1wTsZg8JLQ6iHJBe1xz+VY5wS11kJScl6eYW8dJfsher8MszmuV+z9PN8VLUWLHXGNUwMTEIY/0q572LzTueKXQeplUtruvSnKJXMyVIsSG8CxZrYAaFta0qsJ4bogOwfbZGOVjg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=JeP0oeFT1V1YZfI0RbwA8wpecEhr06zGkLkr7cOahY8=; b=PtefoDzzQW8vKt914gl2M2ue8h3IECUERl9AQxC/jj0kO4fPU6aKYoh/E+Fuqb+lCmZErU25rqOOwlVrDE2SGYrjpuecB6Ig06b89g9g/TnAlRLpzxD1evtUKzVqpL7fMK8JNHwELuTenr6LoPu+6OVjIp11RHsVxt7FwFZFuDMK42PTP/LzsZcSwIcIRnaK/AAPBq0OAct3gd6FZroADKsS1s6LGhHGWOL/lugmIu6nfbgKQjUORpGArudgMmZR/5eR8EylFDRPCXsK/crm6JWubDTS/ylYJS0mmZWBXCWOf2X18wZsfszz4qzeKXibvfh8BY/noOZeSZrDgEpubw== Received: from SN6PR08CA0014.namprd08.prod.outlook.com (2603:10b6:805:66::27) by LV2PR12MB5847.namprd12.prod.outlook.com (2603:10b6:408:174::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8632.21; Fri, 11 Apr 2025 07:50:41 +0000 Received: from SA2PEPF00003AE8.namprd02.prod.outlook.com (2603:10b6:805:66:cafe::fb) by SN6PR08CA0014.outlook.office365.com (2603:10b6:805:66::27) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8632.26 via Frontend Transport; Fri, 11 Apr 2025 07:50:41 +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 SA2PEPF00003AE8.mail.protection.outlook.com (10.167.248.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8655.12 via Frontend Transport; Fri, 11 Apr 2025 07:50:40 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) 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.1544.4; Fri, 11 Apr 2025 00:50:28 -0700 Received: from c-237-113-240-247.mtl.labs.mlnx (10.126.231.35) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.14; Fri, 11 Apr 2025 00:50:22 -0700 From: Cosmin Ratiu To: , CC: Hangbin Liu , Jay Vosburgh , Andrew Lunn , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Nikolay Aleksandrov , Simon Horman , Saeed Mahameed , Tariq Toukan , Jianbo Liu , Steffen Klassert , Herbert Xu , Ayush Sawal , Tony Nguyen , "Przemek Kitszel" , Sunil Goutham , Geetha sowjanya , Subbaraya Sundeep , hariprasad , Bharat Bhushan , Louis Peens , "Leon Romanovsky" , Subject: [PATCH net-next v3 2/6] xfrm: Use xdo.dev instead of xdo.real_dev Date: Fri, 11 Apr 2025 10:49:54 +0300 Message-ID: <20250411074958.2858496-3-cratiu@nvidia.com> X-Mailer: git-send-email 2.45.0 In-Reply-To: <20250411074958.2858496-1-cratiu@nvidia.com> References: <20250411074958.2858496-1-cratiu@nvidia.com> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-ClientProxiedBy: rnnvmail203.nvidia.com (10.129.68.9) To rnnvmail201.nvidia.com (10.129.68.8) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SA2PEPF00003AE8:EE_|LV2PR12MB5847:EE_ X-MS-Office365-Filtering-Correlation-Id: e0c7acc4-5931-4efc-9f58-08dd78cd8e8b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|36860700013|82310400026|376014|7416014|1800799024; X-Microsoft-Antispam-Message-Info: uyTqvCfRo3uEI5zKoUX1eohlG7tYFiNpNrI/k+Sf0SjEDGvg/ztvIp2H/IqATlWz2HvCzPmrlBDeX6HiHI1zuaHAShUI/Ig+MAzHuG0jlVjke8N3U67IOW2irENiUkWBRQsb922DSpfwIp6ohvDxP7qQ4dW9dBCNNWYLxbgLdcM9npm4fQYGakJXe7AtkNz9WH4dQbts8K6yAzZ6rdQHi3Q4ZkSOE85Xn2FiGpnR948KGGRZZ3Zz/yFE/leiFLMe/GWfywFe4FBCBeFAiitYG32epE8gcqfO3HTvIMLOXhAXOFOZlcR61bEcxRjPascA21i9zZV72RbAkKI8jFwl9DomRFJP1aqU9E44LQSBGyoV++hIv0D5GkDFQ0iSFJQSGXFVJQp/gfHLER90uOea/MGquWg+NJY+kZw2BShnIgzRVgSmBw1W5yalim4uaFCak/aGTzliBk3uoD/Y0hm4pr8Nzz2zQGzrtrvIS21+wpfOP529UCdNXZbPewuhagI9x1wWWy9JAr4GoLURgR23nytX/gw1w2PgsRR5ryVClUIGrTx0wmgGwVEVu+4D8s16QF8Jlvo7zOguaZfPIa/p1x5U5XOE6trMOPCdoNatq69rrk9Q4ZXXKF8OTJJgzLu+ney+xkPYTBlICfj8zOCm1fQWyTEuaRecVc9rtwHLnER2e4CCv8eijs5p8InN7KSemDa6UYBzdhbS/hh/o0Ir5CxuTbmtH6gfVZZswKuKEqo7KLQSZvZ2xt0rHn2wo7i9t2dZtR2Eg40gtgbomSSrlZD9oaHf/TycTFq3wh7CjyErjGnJ/wR96XqkaZFVujJvOHSYFPfqkWGcHMYUWvtBFNVMgx8T8n6euNXbfLGdomkABxCrUX8JIRmS/DXrdXuA6uS5IqoSRFeV308emF/LHtiFzbWB9WTXeMEUNWlXOcJlx8p9YDAvZRAoBBH9PVXIZM2AxyZXeAe+5kxhCA21kIr2f94PMGI+/gG0T5JltjVh8X0Zg9Y3jXpyMFJtH5qJQCkl6duqdUHAatTOaU82QgmZtsDPz9xMKJFUju4AeAxf2MjUB+dGwp4Fc1dYdxze/388RfHiadULoOTPQj/7VW0fK1w18x8t9atjZV/HT7+JJVgapj32lrHIS5uXbAcjBeoppT6dR5Gv9G83bARws+Acq4ZJxm1GN7w65nm6TzetJp8idMr0TWtn40iF/2fBhhlMuIdbVlSzX6SOh+DX0QMk6bsBmEciCUtb8cKC6nSS0ywSMGeB80I51vS+oNMkNEE16NkFFKt0R+IQVda4G9H/hjOfBwrntcS0kpKo+PqE2+aq9f492ui20esX2BrSlRpH66HyMnC7kConHk3isRjWIP9yAjmUnRt7VuXNj+lY0rxbwzxwMd+etf+ZhClWiRQvy3eCKDnfwDO2r0sa9yUfLoa9GyR0Qc7jA6cAf4o118QDyl2PefO5HdZ+vgs+LgDVw/9gD1yuxIFUDIQYF8pm5ss+Wxi3rPtj9MyUxldt/jcpa6v5SYfjigqLnMaE 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)(36860700013)(82310400026)(376014)(7416014)(1800799024); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Apr 2025 07:50:40.9590 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: e0c7acc4-5931-4efc-9f58-08dd78cd8e8b 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: SA2PEPF00003AE8.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV2PR12MB5847 The policy offload struct was reused from the state offload and real_dev was copied from dev, but it was never set to anything else. Simplify the code by always using xdo.dev for policies. Signed-off-by: Cosmin Ratiu Reviewed-by: Leon Romanovsky --- drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c | 2 +- net/xfrm/xfrm_device.c | 2 -- net/xfrm/xfrm_state.c | 2 -- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c index 626e525c0f0d..0dfbbe21936f 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c @@ -1164,7 +1164,7 @@ mlx5e_ipsec_build_accel_pol_attrs(struct mlx5e_ipsec_pol_entry *pol_entry, static int mlx5e_xfrm_add_policy(struct xfrm_policy *x, struct netlink_ext_ack *extack) { - struct net_device *netdev = x->xdo.real_dev; + struct net_device *netdev = x->xdo.dev; struct mlx5e_ipsec_pol_entry *pol_entry; struct mlx5e_priv *priv; int err; diff --git a/net/xfrm/xfrm_device.c b/net/xfrm/xfrm_device.c index d62f76161d83..4f4165ff738d 100644 --- a/net/xfrm/xfrm_device.c +++ b/net/xfrm/xfrm_device.c @@ -378,7 +378,6 @@ int xfrm_dev_policy_add(struct net *net, struct xfrm_policy *xp, xdo->dev = dev; netdev_tracker_alloc(dev, &xdo->dev_tracker, GFP_ATOMIC); - xdo->real_dev = dev; xdo->type = XFRM_DEV_OFFLOAD_PACKET; switch (dir) { case XFRM_POLICY_IN: @@ -400,7 +399,6 @@ int xfrm_dev_policy_add(struct net *net, struct xfrm_policy *xp, err = dev->xfrmdev_ops->xdo_dev_policy_add(xp, extack); if (err) { xdo->dev = NULL; - xdo->real_dev = NULL; xdo->type = XFRM_DEV_OFFLOAD_UNSPECIFIED; xdo->dir = 0; netdev_put(dev, &xdo->dev_tracker); diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index d896c3fefb07..33d1f5679e8b 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c @@ -1555,7 +1555,6 @@ xfrm_state_find(const xfrm_address_t *daddr, const xfrm_address_t *saddr, xso->type = XFRM_DEV_OFFLOAD_PACKET; xso->dir = xdo->dir; xso->dev = xdo->dev; - xso->real_dev = xdo->real_dev; xso->flags = XFRM_DEV_OFFLOAD_FLAG_ACQ; netdev_hold(xso->dev, &xso->dev_tracker, GFP_ATOMIC); error = xso->dev->xfrmdev_ops->xdo_dev_state_add(x, NULL); @@ -1563,7 +1562,6 @@ xfrm_state_find(const xfrm_address_t *daddr, const xfrm_address_t *saddr, xso->dir = 0; netdev_put(xso->dev, &xso->dev_tracker); xso->dev = NULL; - xso->real_dev = NULL; xso->type = XFRM_DEV_OFFLOAD_UNSPECIFIED; x->km.state = XFRM_STATE_DEAD; to_put = x; From patchwork Fri Apr 11 07:49:55 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cosmin Ratiu X-Patchwork-Id: 880419 Received: from NAM10-DM6-obe.outbound.protection.outlook.com (mail-dm6nam10on2044.outbound.protection.outlook.com [40.107.93.44]) (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 60AB227CCCC; Fri, 11 Apr 2025 07:50:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.93.44 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744357855; cv=fail; b=NPXP9vqnE3GkwieiUzjdVOh8H3yR2k8Oz4OsoV7wnFJfghQ1696KuyncdWYhg6Bv4VWDLR9lU6RP+pxOguKBQ0emuqcnk59M7U7XRdWIg5+CNqppL6aPzEVtexIOmmgpxrAcVVQMDVDJSfikFWWpfB8C4J6LYCqRUZfXhEg+E9E= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744357855; c=relaxed/simple; bh=iazEz40QiClbJxAIKlFR2LeyEukHV9LvwHNFn1LzXaE=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=uH6GBh94Ziddu1oVi+Nh51yVvclbsJF2hFTVXLooe0UT7c178Q1br0A9iu5PpTiKpjbz7ojbAreUMuTT5uq4XxgGZ5SgxhbC9sqwzkiym3bpBxyJbE7O/DgedsczEHh9roiijjY9ZHkVMIq1e80PwtdArKhXRIH7I4I/QIWfPnE= 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=fbAJsKhE; arc=fail smtp.client-ip=40.107.93.44 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="fbAJsKhE" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=sSm7rteG9bmY0vIesYVH7qZvwPtZ30RqYxq2pODd9AKtAl9Nv20Hiw6ZoikDq8Z6fgLHTroETwyIilrj8d2MjdVJbw7qbeXVsHX6xe43moPlt2e5gbHiab7XGf2CPCyZuXnmCLCQIkNtYqx9DbQxkL6p5c/BAnA5zjPLgexjyc6ysdJdjgeqjg4t5WHvTe/d3OevXMjeF75etD0p+epugGDQ30C67aHAc4t9zua0JeWYFwSmy+xFvS09TCtx4JWO3KTiEmsZwdlTQOvBk8gvSIChLo2DdlAQmRh7pbk4mrmVQyxk8mloWsEIvz++ru/sf7yHlJ86ZPj8QGBoNlJ8og== 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=DtZrrL633P7mD+R159+1dgIZxXtl2NK0stD0V2JhJV8=; b=gF30ZlaSzs6YNcoZS3Taw7U502F+TtR+yP1Y9/LeYKNb2mDOaC8Yne8/eFvMcyuLtsBIhWyg1MwIlLZ50kPUUEKMboAhIWkP2CgaO/pQfonVmC1u7w535m4WEez5OHWL9JW3mfRRwAQoSmj/MR+0P9fKkA4FZF+8SnEtCa6b+/A5lwnuIrbAzZYz0Wc3hfqgVfvJkXOtkC8ONe6Y/zGqooyblgDmk7KcWvgFiX7sMBl+9udTbH6rXo2KWgfk6YOK7whONf9kjtY/SjdOgyg7qLNzXCe/w62Rk0CyhTnopK6NZWgcuRoDlETbAGoq4LwpSMkQ2RkbmTJVLjr9mDanxQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=DtZrrL633P7mD+R159+1dgIZxXtl2NK0stD0V2JhJV8=; b=fbAJsKhEiYtxXMe0g20rYnbCfjHeRNi8r+TOzpLtDSmkFPB2uvZxA7OCSbCiuXbCSBEXcSgeqWvqHnt8HRhcGKYDwFTpiHo3qfqNa7Q+Z5pyfU3lkGY2wmYMUhCwxpMf/gzRfy6TK2v6JpomuHIIHZJqp2A0R21xEfBmt60zmXzsrYvedqZoocNTl1Bx53ea2I5WzpYbMYeVVFVgA4iovMJnhj9YOU3F5xW/lLAMb/ZYL2Z+QnwuF5Jv5MMn4zfeAKpeRECuSAWSiOGO94Ku4+gpTbBersoNFkSQVFxRBf4f6fKm4w46LgEBSjv6Cs4hWAfYqSMehGQK1KoAoCJuYQ== Received: from CH0PR13CA0015.namprd13.prod.outlook.com (2603:10b6:610:b1::20) by PH8PR12MB7446.namprd12.prod.outlook.com (2603:10b6:510:216::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8606.33; Fri, 11 Apr 2025 07:50:49 +0000 Received: from CH1PEPF0000A34C.namprd04.prod.outlook.com (2603:10b6:610:b1:cafe::a1) by CH0PR13CA0015.outlook.office365.com (2603:10b6:610:b1::20) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8655.8 via Frontend Transport; Fri, 11 Apr 2025 07:50: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 CH1PEPF0000A34C.mail.protection.outlook.com (10.167.244.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8632.13 via Frontend Transport; Fri, 11 Apr 2025 07:50:48 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.4; Fri, 11 Apr 2025 00:50:35 -0700 Received: from c-237-113-240-247.mtl.labs.mlnx (10.126.231.35) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.14; Fri, 11 Apr 2025 00:50:28 -0700 From: Cosmin Ratiu To: , CC: Hangbin Liu , Jay Vosburgh , Andrew Lunn , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Nikolay Aleksandrov , Simon Horman , Saeed Mahameed , Tariq Toukan , Jianbo Liu , Steffen Klassert , Herbert Xu , Ayush Sawal , Tony Nguyen , "Przemek Kitszel" , Sunil Goutham , Geetha sowjanya , Subbaraya Sundeep , hariprasad , Bharat Bhushan , Louis Peens , "Leon Romanovsky" , Subject: [PATCH net-next v3 3/6] xfrm: Remove unneeded device check from validate_xmit_xfrm Date: Fri, 11 Apr 2025 10:49:55 +0300 Message-ID: <20250411074958.2858496-4-cratiu@nvidia.com> X-Mailer: git-send-email 2.45.0 In-Reply-To: <20250411074958.2858496-1-cratiu@nvidia.com> References: <20250411074958.2858496-1-cratiu@nvidia.com> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-ClientProxiedBy: rnnvmail203.nvidia.com (10.129.68.9) To rnnvmail201.nvidia.com (10.129.68.8) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH1PEPF0000A34C:EE_|PH8PR12MB7446:EE_ X-MS-Office365-Filtering-Correlation-Id: c4cfcdf7-96fe-4275-77ca-08dd78cd930f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|36860700013|82310400026|376014|7416014|1800799024; X-Microsoft-Antispam-Message-Info: 10YcD/2H/t4XbMahy6ju86Gp9eBBpLGyHUe0SWQNakWbPqwQttUgKaHea6ZOCdBEgN6KPJO9aGdb296WB83/xw3iBy2ihO6pEv6FuBMtlguRGtX9+2UC6KMb6GFA44JcS62L12e71lcNjk9cWRjNWOWvrMwrL3bDq8sev1ualBL51N+KfXH+eTy3kqeRwnrkI4a1Vsw2z0MT80Y1bi7Ne12iiQ7p1PHMRHINPKmVsZw/GEX+/xXRwYwjTQYO4R149oO/dnd9wjCbNvZO424zby6IYenSLAKBWX0PiARJsxabzkSXnnf7byOmQCz+i/wYP3WmFiltTeyUfE792UK9G0/395kFWZpyY1sYgZ74o195wy+40KLGqlQaAO5hxyFgrfxf/Bqww2V3YZVofA81snTtr9X6f6mvszx4OjP2HFNH6NyGgycjoKAa6XB6xwl2QIBwY5zMI8rpno5tGaYRfS+HDPD4OSCI2YqT0Ho+Ad3rBS7nbbutII4SiNHYEgiY7xddQJanfDyPARlpErp24X/cHUmaTLLkisHrvmAjvq63gEPSV9cSbcTPFcjJirPJvYi66MwfzlfE8+UatLdFu/dtTqHC8A4U0w7QJ1yy6/uo++NOUgwSUXPc4s2dVwadKAFGJT4CMevb3jXoSiY++Hvs9AJY5SmvrM7GxHVlJeZ015lYKKJfKa9DrCI3uVVLZxi4+1phXsUbyrYNZ7ztGsmnU1s3PWImaslw/TkdCOyJcSZbAbcfpxFCsVk2W+X8t/cW6TYobsWTt6RT0VuUI5QoUxcYDaTp0Pf2s8vhuMX9zhBm3VRfGEeolk9J1vMH0Fo8HGLx7WPWMjJrxBZdLezy7vEGV+NdfVYnZ25Q5xolZ2growq4sLaYrgjcpXTuwXy0Lpxs+rRKbJlV6qyva+xxfJ3XMaKnL3Cxo45HMibffdKOLE1HaYzJVRfhZUxkOD7MHEKCov7jeVD9iOY0Dq7YQRC+cWhvk5cSade5YH9dHewgZFPiAEN8apUEo1wPTd8942gZ3kw/LDtrxwX6govgYM49/wOO7FTUPv6vf+m+eJoXWp3czsrCoAb0AWxyxUOSls6BvmDlstoxDA0rmvaUHiJeD7hj+PpU36SfgahfPT1IqU34nonuacRLevC2nS1Ug8oT3DJZMdJn/bXp4gIv0MpJfdI1VhOkc8ofqVSNgaUEy4HW1LmDEx76qbdPQPeY4uiw/rYvihr9nMMEGLmNB/ySuq15UOst5CiJ2UCv9WxxVv0P+pbiTU+gNlGrA4BJVay8xaTh9RjUoRF4R3pCaQ2ao2Vnk95zTJ16Cr6h4Hf0sdvLNDVKoj2884qBKoSL9zGRUMkltieR2/WjX8vJQwhMSgeRjHUBIbchnIwxRcyHTBp89DnYOHwVHAbHx8ORwUiDnEYCDC70oM++BiR/iKKIjQstPhcQ2rADlUnJATHojexTETobndbL4ipPUm4bqgAqMV5fl+Bya0v7a7ThiU0q04DEuOQByZ7SihUROwzCC0FzjAhGFpcTUvzc 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)(36860700013)(82310400026)(376014)(7416014)(1800799024); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Apr 2025 07:50:48.5809 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: c4cfcdf7-96fe-4275-77ca-08dd78cd930f 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: CH1PEPF0000A34C.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH8PR12MB7446 validate_xmit_xfrm checks whether a packet already passed through it on the master device (xso.dev) and skips processing the skb again on the slave device (xso.real_dev). This check was added in commit [1] to avoid tx packets on a bond device pass through xfrm twice and get two sets of headers, but the check was soon obsoleted by commit [2], which was added around the same time to fix a similar but unrelated problem. Commit [3] set XFRM_XMIT only when packets are hw offloaded. xso.dev is usually equal to xso.real_dev, unless bonding is used, in which case the bonding driver uses xso.real_dev to manage offloaded xfrm states. Since commit [3], the check added in commit [1] is unused on all cases, since packets going through validate_xmit_xfrm twice bail out on the check added in commit [2]. Here's a breakdown of relevant scenarios: 1. ESP offload off: validate_xmit_xfrm returns early on !xo. 2. ESP offload on, no bond: skb->dev == xso.real_dev == xso.dev. 3. ESP offload on, bond, xs on bond dev: 1st pass adds XFRM_XMIT, 2nd pass returns early on XFRM_XMIT. 3. ESP offload on, bond, xs on slave dev: 1st pass returns early on !xo, 2nd pass adds XFRM_XMIT. 4. ESP offload on, bond, xs on both bond AND slave dev: only 1 offload possible in secpath. Either 1st pass adds XFRM_XMIT and 2nd pass returns early on XFRM_XMIT, or 1st pass is sw and returns early on !xo. 6. ESP offload on, crypto fallback triggered in esp_xmit/esp6_xmit: 1st pass does sw crypto & secpath_reset, 2nd pass returns on !xo. This commit removes the unnecessary check, so xso.real_dev becomes what it is in practice: a private field managed by bonding driver. The check immediately below that can be simplified as well. [1] commit 272c2330adc9 ("xfrm: bail early on slave pass over skb") [2] commit 94579ac3f6d0 ("xfrm: Fix double ESP trailer insertion in IPsec crypto offload.") [3] commit c7dbf4c08868 ("xfrm: Provide private skb extensions for segmented and hw offloaded ESP packets") Signed-off-by: Cosmin Ratiu Reviewed-by: Leon Romanovsky --- net/xfrm/xfrm_device.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/net/xfrm/xfrm_device.c b/net/xfrm/xfrm_device.c index 4f4165ff738d..0be5f7ffd019 100644 --- a/net/xfrm/xfrm_device.c +++ b/net/xfrm/xfrm_device.c @@ -145,10 +145,6 @@ struct sk_buff *validate_xmit_xfrm(struct sk_buff *skb, netdev_features_t featur return NULL; } - /* This skb was already validated on the upper/virtual dev */ - if ((x->xso.dev != dev) && (x->xso.real_dev == dev)) - return skb; - local_irq_save(flags); sd = this_cpu_ptr(&softnet_data); err = !skb_queue_empty(&sd->xfrm_backlog); @@ -159,8 +155,7 @@ struct sk_buff *validate_xmit_xfrm(struct sk_buff *skb, netdev_features_t featur return skb; } - if (skb_is_gso(skb) && (unlikely(x->xso.dev != dev) || - unlikely(xmit_xfrm_check_overflow(skb)))) { + if (skb_is_gso(skb) && unlikely(xmit_xfrm_check_overflow(skb))) { struct sk_buff *segs; /* Packet got rerouted, fixup features and segment it. */ From patchwork Fri Apr 11 07:49:56 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cosmin Ratiu X-Patchwork-Id: 880686 Received: from NAM12-BN8-obe.outbound.protection.outlook.com (mail-bn8nam12on2048.outbound.protection.outlook.com [40.107.237.48]) (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 CA38328CF64; Fri, 11 Apr 2025 07:51:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.237.48 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744357866; cv=fail; b=Ne0khBhcIVkjMeRR7WCYHT7J+PixysX5gaIznHL3D83xoIMR6BxFbWLHVLkbzhta1ogzEZbxD8UYrMy24NxkM77FOKfGtJy4vkVDwTEJlyHtHv0K3ZQXmwxy1N+KGKulJmc/mdaACSlttANPNAEob6cvrYk/D1httcVOtC0CvG4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744357866; c=relaxed/simple; bh=MFuFXAZKX/zELc9iwDF0+1EBnNWXnA/ZarTIcf9j4Hw=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=JbHvjcGPQhFm5AmoS1vXO+MlcQB7man5xkRxp9NywVtY38Gxp+tY5KaE4+kbgpANsSvPYI5vy9bribL8aDB+4R0pzdo3BCkF2HBVeeca0aMvPeZYGqC42iFz9BugNy36RVKh0JOSpy+8JDONDJCDptHAYGJXGeZRF9NlVixu5HI= 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=Dzo0vcIB; arc=fail smtp.client-ip=40.107.237.48 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="Dzo0vcIB" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=xC8409bkp+c9nwbVLCmx/mMb92fP1ko2dm011iomr2Q17axu+WiKLSwfxk7VBfeWHIgDytJjr0yxLf/8zbmom1aIOMA9GrM0Q7bYBqrjh9cipL3cSwpu6KPcr/EffJRP00co7379yFjFNWOjeUbRQFkeZdhFSbFR5GleTfzogAl0fkJFkLc/fkYciFf3IU4SvU51Nj94gRG7LRucMqdDxYu8lyHExUjMJwX/GU06XK/hF4mWKbV9qV6nfIAAJst5zGiC8BqMlqTr3ojJ3JNae4DHE07SyFZMZjwZ1FcOP75JyGa3fdePef/cr1NfWlH4RVCA+ckHFjiQYOm/HVkbRw== 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=oKpGJFbfwYtNmQUdTvDq8ThlJcCDO3lmdr71RUd2RZw=; b=UWYJ/vCE2JDthR212/AmhwGGpaLKB1kWCSFNQ1SoU1MKkVwQGFqqtAQEKBiC2MovAudJHy7zKA5cQ2UmxIYDVqjIfTbzsyFzgEdQCLIjPrdWYwk3jnCicuT3w690vOxIwI3fTZKqAYf/lLdwNLHCr9abhkvM9/XvIP2jEWcpoH3HEobQowvEQsM0v+x6heNR6PPRksHalNr5TruDhPh3OfktMUt2FemrO+Pb+gK9Bx8ZgaylTaXvdGoCSFKIrHzVNw1kOE/bFBnYQPqG5XTVa9OutPEYIUGip2aG4cnJd8MV7L1y6SHPI3Slhn+F+1jmFA2bSwnKDv5FJz4YwTfsjg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=oKpGJFbfwYtNmQUdTvDq8ThlJcCDO3lmdr71RUd2RZw=; b=Dzo0vcIBcdgxyLglq5tzoUt3uGBIuVHJ9Eak3qJmuTvWQRw56GIviiPq8EbT2zUROPd2A3ZrEEZDKOUkHKauYPEt/C59Fz6gsJn9FNWxf/AVtz9ChgiupErZgKuzvL4SDIpeZs9OLuUDquAd5ToLmb6mu1T84TUCIQzH3kI0IZIxnXsH6PoBOR1S44NbU+GHnm9SW1zqeqbQfsj/7rKY+OHh0IrIvgtg2hAMKCK+pqSjrbH2gFo2W00OKqapN5ok15prG7j3mG2ccfpb1RJa3lyFzVhNTRxBwfwHf5VTOBLXu0Df/KLgXrfiTlKpARfHZaxpDHZ8gYv/t8jeUBVyxA== Received: from SA0PR11CA0033.namprd11.prod.outlook.com (2603:10b6:806:d0::8) by SN7PR12MB8101.namprd12.prod.outlook.com (2603:10b6:806:321::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8606.35; Fri, 11 Apr 2025 07:50:53 +0000 Received: from SA2PEPF00003AE5.namprd02.prod.outlook.com (2603:10b6:806:d0:cafe::ad) by SA0PR11CA0033.outlook.office365.com (2603:10b6:806:d0::8) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8632.26 via Frontend Transport; Fri, 11 Apr 2025 07:50:53 +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 SA2PEPF00003AE5.mail.protection.outlook.com (10.167.248.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8632.13 via Frontend Transport; Fri, 11 Apr 2025 07:50:53 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) 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.1544.4; Fri, 11 Apr 2025 00:50:42 -0700 Received: from c-237-113-240-247.mtl.labs.mlnx (10.126.231.35) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.14; Fri, 11 Apr 2025 00:50:35 -0700 From: Cosmin Ratiu To: , CC: Hangbin Liu , Jay Vosburgh , Andrew Lunn , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Nikolay Aleksandrov , Simon Horman , Saeed Mahameed , Tariq Toukan , Jianbo Liu , Steffen Klassert , Herbert Xu , Ayush Sawal , Tony Nguyen , "Przemek Kitszel" , Sunil Goutham , Geetha sowjanya , Subbaraya Sundeep , hariprasad , Bharat Bhushan , Louis Peens , "Leon Romanovsky" , Subject: [PATCH net-next v3 4/6] xfrm: Add explicit dev to .xdo_dev_state_{add,delete,free} Date: Fri, 11 Apr 2025 10:49:56 +0300 Message-ID: <20250411074958.2858496-5-cratiu@nvidia.com> X-Mailer: git-send-email 2.45.0 In-Reply-To: <20250411074958.2858496-1-cratiu@nvidia.com> References: <20250411074958.2858496-1-cratiu@nvidia.com> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-ClientProxiedBy: rnnvmail203.nvidia.com (10.129.68.9) To rnnvmail201.nvidia.com (10.129.68.8) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SA2PEPF00003AE5:EE_|SN7PR12MB8101:EE_ X-MS-Office365-Filtering-Correlation-Id: 7ce7b3fe-311b-414c-b927-08dd78cd9600 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|376014|7416014|36860700013|82310400026|1800799024; X-Microsoft-Antispam-Message-Info: 7yrjJ94oMk5HIskUQj7eVqrMje7oXxa27vTnRP3JMZ+aDo1AP1pI0wHPbgISH+PkKh8FjGhaGtcJpekAX6Xr0o6wVHRzdiiS3QGrzlX0j4SROKJF6I6cuvsxC9JZLLaZznbaREyNKZCYCBTV7YlKZnRikPaSUgI74+pyPMDYKZmr3q/G/0xA18GxucNP4q14rGXQVgt7R2m7hjEin12agC/64LACpfkwl4Mq3GZdwthNkhs7IEoe+OPaS4+htJKIC6qjv07cd7jiq6YVBayc5mXgYtpA1kq34SdGXI/RPFII1VMcmxb4dP+Ll3pWTYxgeYaeR9MQa70n1Ei59Ko6fFmngwREe05bO6CyJHyqUFiO1okcDhC5bXxnwwdmMHQsslSQNzcaMm9hQPOUk4sKG3fG6LW9MVxa4g8LNcxxlKfSQ2JbPlwV0zdp7LU68aODg/drBOqQ//U+BvsmS8OOm/6VCm4GabqG1JrZPewQe0RP1lZBatyJ2mLad99+KBGD2UTuv9i+Kn85el/zBNUWUvvW2+5o0CddFddeA2+aopBoJmCXZXK11mlQs5hme8Zqd6bDEiDQQFx4jnMTOqnA7+rNH5OH3uCYq40q2NISGEqmU1RglXMIQniIlpnvhouZPGhgbbZH+5g9kkpTCgk98NbX7K0m2NQ9C/9eZfYszEOjCxKQzDtJsPIKeIXvk9bcxmkIiaqH6+3WWRlJAFvyQQo/0DYASiJXuh7uaiF14BCrfJ7sAj9pNs77a38CFHk+eWmf9d14wiLde47nrlfcSFUw3258HlltOfnhAS4Jn7JxgkvXfRUR6PRGph76dVeK/sw3+BCHeoeMSNZhq02EVpk8O4n20GN2A99pc0/pQ/A7iAioXZ1aIewOGIWap99eZKo7f5PIOIhoHhMirDrRPAdQ0soAH2iPghfwhywgKEK7bJGg+YIXi9urNbfXchfgwdqA6oZgAL+P/RIOh4cnry4LuSlKOPiDDA0BGZrcCMtc3yRg++IXgc2ASOXCwqtoNea2pvWE2SSb1VZk+HDmtWOVf+KB7lf2kxcwr+SCTh2TSvjltqLyqs7MmMMIqWDznYvQM3A4UZLA7md9IOW73ja+x9qhIlmUeqQJZYQrBSQrVdjWa3N+ocCQvEuAdiXPIRJ9g1duMd+nWt++puZLTI138aF4C0s3RFMrW+xSw4+dW0RJ27ex/lHkIFZ+xUhbPgFLLIrAU1Yj6IV3UdRLXC6lrhkP7K7Mk3UuiMDzgytiZ/4S50jTMlG9IDhb7goZuWepSAQWax+PKnjnhgich4LDFcqjhyBK9OJTQQ6rpYkZUrrgASfTSH8SWoYOkIBRBIxbM+EOrdA6YPiPp9ySzb0G2ke0jmQGzQ32UaHc7GNCnd7T4WR1JVTlNyzLp410fJPtbDuoqYsma0ggtx58itT5AHFW9J8cAHFNN9xahfDol6x78ofw7R3Kxy3U0S6YJCrvOYsY6PXXKpfSbOTzhHlhDPv2v0N+NJ+ODtLrHG37zJXXW25rA37Qz+eoDVmb 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)(376014)(7416014)(36860700013)(82310400026)(1800799024); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Apr 2025 07:50:53.5330 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 7ce7b3fe-311b-414c-b927-08dd78cd9600 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: SA2PEPF00003AE5.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN7PR12MB8101 Previously, device driver IPSec offload implementations would fall into two categories: 1. Those that used xso.dev to determine the offload device. 2. Those that used xso.real_dev to determine the offload device. The first category didn't work with bonding while the second did. In a non-bonding setup the two pointers are the same. This commit adds explicit pointers for the offload netdevice to .xdo_dev_state_add() / .xdo_dev_state_delete() / .xdo_dev_state_free() which eliminates the confusion and allows drivers from the first category to work with bonding. xso.real_dev now becomes a private pointer managed by the bonding driver. Signed-off-by: Cosmin Ratiu Reviewed-by: Leon Romanovsky --- Documentation/networking/xfrm_device.rst | 10 +++-- drivers/net/bonding/bond_main.c | 33 ++++++++------- .../net/ethernet/chelsio/cxgb4/cxgb4_main.c | 20 +++++---- .../inline_crypto/ch_ipsec/chcr_ipsec.c | 18 +++++--- .../net/ethernet/intel/ixgbe/ixgbe_ipsec.c | 41 +++++++++++-------- drivers/net/ethernet/intel/ixgbevf/ipsec.c | 21 ++++++---- .../marvell/octeontx2/nic/cn10k_ipsec.c | 18 ++++---- .../mellanox/mlx5/core/en_accel/ipsec.c | 12 +++--- .../net/ethernet/netronome/nfp/crypto/ipsec.c | 11 +++-- drivers/net/netdevsim/ipsec.c | 15 ++++--- include/linux/netdevice.h | 10 +++-- include/net/xfrm.h | 8 ++++ net/xfrm/xfrm_device.c | 4 +- net/xfrm/xfrm_state.c | 14 ++++--- 14 files changed, 136 insertions(+), 99 deletions(-) diff --git a/Documentation/networking/xfrm_device.rst b/Documentation/networking/xfrm_device.rst index 7f24c09f2694..122204da0fff 100644 --- a/Documentation/networking/xfrm_device.rst +++ b/Documentation/networking/xfrm_device.rst @@ -65,9 +65,13 @@ Callbacks to implement /* from include/linux/netdevice.h */ struct xfrmdev_ops { /* Crypto and Packet offload callbacks */ - int (*xdo_dev_state_add) (struct xfrm_state *x, struct netlink_ext_ack *extack); - void (*xdo_dev_state_delete) (struct xfrm_state *x); - void (*xdo_dev_state_free) (struct xfrm_state *x); + int (*xdo_dev_state_add)(struct net_device *dev, + struct xfrm_state *x, + struct netlink_ext_ack *extack); + void (*xdo_dev_state_delete)(struct net_device *dev, + struct xfrm_state *x); + void (*xdo_dev_state_free)(struct net_device *dev, + struct xfrm_state *x); bool (*xdo_dev_offload_ok) (struct sk_buff *skb, struct xfrm_state *x); void (*xdo_dev_state_advance_esn) (struct xfrm_state *x); diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 950d8e4d86f8..4ba525a564c5 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -453,13 +453,14 @@ static struct net_device *bond_ipsec_dev(struct xfrm_state *xs) /** * bond_ipsec_add_sa - program device with a security association + * @bond_dev: pointer to the bond net device * @xs: pointer to transformer state struct * @extack: extack point to fill failure reason **/ -static int bond_ipsec_add_sa(struct xfrm_state *xs, +static int bond_ipsec_add_sa(struct net_device *bond_dev, + struct xfrm_state *xs, struct netlink_ext_ack *extack) { - struct net_device *bond_dev = xs->xso.dev; struct net_device *real_dev; netdevice_tracker tracker; struct bond_ipsec *ipsec; @@ -496,7 +497,7 @@ static int bond_ipsec_add_sa(struct xfrm_state *xs, } xs->xso.real_dev = real_dev; - err = real_dev->xfrmdev_ops->xdo_dev_state_add(xs, extack); + err = real_dev->xfrmdev_ops->xdo_dev_state_add(real_dev, xs, extack); if (!err) { ipsec->xs = xs; INIT_LIST_HEAD(&ipsec->list); @@ -540,7 +541,8 @@ static void bond_ipsec_add_sa_all(struct bonding *bond) continue; ipsec->xs->xso.real_dev = real_dev; - if (real_dev->xfrmdev_ops->xdo_dev_state_add(ipsec->xs, NULL)) { + if (real_dev->xfrmdev_ops->xdo_dev_state_add(real_dev, + ipsec->xs, NULL)) { slave_warn(bond_dev, real_dev, "%s: failed to add SA\n", __func__); ipsec->xs->xso.real_dev = NULL; } @@ -551,11 +553,12 @@ static void bond_ipsec_add_sa_all(struct bonding *bond) /** * bond_ipsec_del_sa - clear out this specific SA + * @bond_dev: pointer to the bond net device * @xs: pointer to transformer state struct **/ -static void bond_ipsec_del_sa(struct xfrm_state *xs) +static void bond_ipsec_del_sa(struct net_device *bond_dev, + struct xfrm_state *xs) { - struct net_device *bond_dev = xs->xso.dev; struct net_device *real_dev; netdevice_tracker tracker; struct bond_ipsec *ipsec; @@ -587,7 +590,7 @@ static void bond_ipsec_del_sa(struct xfrm_state *xs) goto out; } - real_dev->xfrmdev_ops->xdo_dev_state_delete(xs); + real_dev->xfrmdev_ops->xdo_dev_state_delete(real_dev, xs); out: netdev_put(real_dev, &tracker); mutex_lock(&bond->ipsec_lock); @@ -624,18 +627,20 @@ static void bond_ipsec_del_sa_all(struct bonding *bond) slave_warn(bond_dev, real_dev, "%s: no slave xdo_dev_state_delete\n", __func__); - } else { - real_dev->xfrmdev_ops->xdo_dev_state_delete(ipsec->xs); - if (real_dev->xfrmdev_ops->xdo_dev_state_free) - real_dev->xfrmdev_ops->xdo_dev_state_free(ipsec->xs); + continue; } + real_dev->xfrmdev_ops->xdo_dev_state_delete(real_dev, + ipsec->xs); + if (real_dev->xfrmdev_ops->xdo_dev_state_free) + real_dev->xfrmdev_ops->xdo_dev_state_free(real_dev, + ipsec->xs); } mutex_unlock(&bond->ipsec_lock); } -static void bond_ipsec_free_sa(struct xfrm_state *xs) +static void bond_ipsec_free_sa(struct net_device *bond_dev, + struct xfrm_state *xs) { - struct net_device *bond_dev = xs->xso.dev; struct net_device *real_dev; netdevice_tracker tracker; struct bonding *bond; @@ -661,7 +666,7 @@ static void bond_ipsec_free_sa(struct xfrm_state *xs) if (real_dev && real_dev->xfrmdev_ops && real_dev->xfrmdev_ops->xdo_dev_state_free) - real_dev->xfrmdev_ops->xdo_dev_state_free(xs); + real_dev->xfrmdev_ops->xdo_dev_state_free(real_dev, xs); out: netdev_put(real_dev, &tracker); } diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c index 551c279dc14b..51395c96b2e9 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c @@ -6480,10 +6480,11 @@ static const struct tlsdev_ops cxgb4_ktls_ops = { #if IS_ENABLED(CONFIG_CHELSIO_IPSEC_INLINE) -static int cxgb4_xfrm_add_state(struct xfrm_state *x, +static int cxgb4_xfrm_add_state(struct net_device *dev, + struct xfrm_state *x, struct netlink_ext_ack *extack) { - struct adapter *adap = netdev2adap(x->xso.dev); + struct adapter *adap = netdev2adap(dev); int ret; if (!mutex_trylock(&uld_mutex)) { @@ -6494,7 +6495,8 @@ static int cxgb4_xfrm_add_state(struct xfrm_state *x, if (ret) goto out_unlock; - ret = adap->uld[CXGB4_ULD_IPSEC].xfrmdev_ops->xdo_dev_state_add(x, extack); + ret = adap->uld[CXGB4_ULD_IPSEC].xfrmdev_ops->xdo_dev_state_add(dev, x, + extack); out_unlock: mutex_unlock(&uld_mutex); @@ -6502,9 +6504,9 @@ static int cxgb4_xfrm_add_state(struct xfrm_state *x, return ret; } -static void cxgb4_xfrm_del_state(struct xfrm_state *x) +static void cxgb4_xfrm_del_state(struct net_device *dev, struct xfrm_state *x) { - struct adapter *adap = netdev2adap(x->xso.dev); + struct adapter *adap = netdev2adap(dev); if (!mutex_trylock(&uld_mutex)) { dev_dbg(adap->pdev_dev, @@ -6514,15 +6516,15 @@ static void cxgb4_xfrm_del_state(struct xfrm_state *x) if (chcr_offload_state(adap, CXGB4_XFRMDEV_OPS)) goto out_unlock; - adap->uld[CXGB4_ULD_IPSEC].xfrmdev_ops->xdo_dev_state_delete(x); + adap->uld[CXGB4_ULD_IPSEC].xfrmdev_ops->xdo_dev_state_delete(dev, x); out_unlock: mutex_unlock(&uld_mutex); } -static void cxgb4_xfrm_free_state(struct xfrm_state *x) +static void cxgb4_xfrm_free_state(struct net_device *dev, struct xfrm_state *x) { - struct adapter *adap = netdev2adap(x->xso.dev); + struct adapter *adap = netdev2adap(dev); if (!mutex_trylock(&uld_mutex)) { dev_dbg(adap->pdev_dev, @@ -6532,7 +6534,7 @@ static void cxgb4_xfrm_free_state(struct xfrm_state *x) if (chcr_offload_state(adap, CXGB4_XFRMDEV_OPS)) goto out_unlock; - adap->uld[CXGB4_ULD_IPSEC].xfrmdev_ops->xdo_dev_state_free(x); + adap->uld[CXGB4_ULD_IPSEC].xfrmdev_ops->xdo_dev_state_free(dev, x); out_unlock: mutex_unlock(&uld_mutex); diff --git a/drivers/net/ethernet/chelsio/inline_crypto/ch_ipsec/chcr_ipsec.c b/drivers/net/ethernet/chelsio/inline_crypto/ch_ipsec/chcr_ipsec.c index baba96883f48..ecd9a0bd5e18 100644 --- a/drivers/net/ethernet/chelsio/inline_crypto/ch_ipsec/chcr_ipsec.c +++ b/drivers/net/ethernet/chelsio/inline_crypto/ch_ipsec/chcr_ipsec.c @@ -75,9 +75,12 @@ static int ch_ipsec_uld_state_change(void *handle, enum cxgb4_state new_state); static int ch_ipsec_xmit(struct sk_buff *skb, struct net_device *dev); static void *ch_ipsec_uld_add(const struct cxgb4_lld_info *infop); static void ch_ipsec_advance_esn_state(struct xfrm_state *x); -static void ch_ipsec_xfrm_free_state(struct xfrm_state *x); -static void ch_ipsec_xfrm_del_state(struct xfrm_state *x); -static int ch_ipsec_xfrm_add_state(struct xfrm_state *x, +static void ch_ipsec_xfrm_free_state(struct net_device *dev, + struct xfrm_state *x); +static void ch_ipsec_xfrm_del_state(struct net_device *dev, + struct xfrm_state *x); +static int ch_ipsec_xfrm_add_state(struct net_device *dev, + struct xfrm_state *x, struct netlink_ext_ack *extack); static const struct xfrmdev_ops ch_ipsec_xfrmdev_ops = { @@ -223,7 +226,8 @@ static int ch_ipsec_setkey(struct xfrm_state *x, * returns 0 on success, negative error if failed to send message to FPGA * positive error if FPGA returned a bad response */ -static int ch_ipsec_xfrm_add_state(struct xfrm_state *x, +static int ch_ipsec_xfrm_add_state(struct net_device *dev, + struct xfrm_state *x, struct netlink_ext_ack *extack) { struct ipsec_sa_entry *sa_entry; @@ -302,14 +306,16 @@ static int ch_ipsec_xfrm_add_state(struct xfrm_state *x, return res; } -static void ch_ipsec_xfrm_del_state(struct xfrm_state *x) +static void ch_ipsec_xfrm_del_state(struct net_device *dev, + struct xfrm_state *x) { /* do nothing */ if (!x->xso.offload_handle) return; } -static void ch_ipsec_xfrm_free_state(struct xfrm_state *x) +static void ch_ipsec_xfrm_free_state(struct net_device *dev, + struct xfrm_state *x) { struct ipsec_sa_entry *sa_entry; diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c index 07ea1954a276..796e90d741f0 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c @@ -9,7 +9,7 @@ #define IXGBE_IPSEC_KEY_BITS 160 static const char aes_gcm_name[] = "rfc4106(gcm(aes))"; -static void ixgbe_ipsec_del_sa(struct xfrm_state *xs); +static void ixgbe_ipsec_del_sa(struct net_device *dev, struct xfrm_state *xs); /** * ixgbe_ipsec_set_tx_sa - set the Tx SA registers @@ -321,7 +321,7 @@ void ixgbe_ipsec_restore(struct ixgbe_adapter *adapter) if (r->used) { if (r->mode & IXGBE_RXTXMOD_VF) - ixgbe_ipsec_del_sa(r->xs); + ixgbe_ipsec_del_sa(adapter->netdev, r->xs); else ixgbe_ipsec_set_rx_sa(hw, i, r->xs->id.spi, r->key, r->salt, @@ -330,7 +330,7 @@ void ixgbe_ipsec_restore(struct ixgbe_adapter *adapter) if (t->used) { if (t->mode & IXGBE_RXTXMOD_VF) - ixgbe_ipsec_del_sa(t->xs); + ixgbe_ipsec_del_sa(adapter->netdev, t->xs); else ixgbe_ipsec_set_tx_sa(hw, i, t->key, t->salt); } @@ -417,6 +417,7 @@ static struct xfrm_state *ixgbe_ipsec_find_rx_state(struct ixgbe_ipsec *ipsec, /** * ixgbe_ipsec_parse_proto_keys - find the key and salt based on the protocol + * @dev: pointer to net device * @xs: pointer to xfrm_state struct * @mykey: pointer to key array to populate * @mysalt: pointer to salt value to populate @@ -424,10 +425,10 @@ static struct xfrm_state *ixgbe_ipsec_find_rx_state(struct ixgbe_ipsec *ipsec, * This copies the protocol keys and salt to our own data tables. The * 82599 family only supports the one algorithm. **/ -static int ixgbe_ipsec_parse_proto_keys(struct xfrm_state *xs, +static int ixgbe_ipsec_parse_proto_keys(struct net_device *dev, + struct xfrm_state *xs, u32 *mykey, u32 *mysalt) { - struct net_device *dev = xs->xso.real_dev; unsigned char *key_data; char *alg_name = NULL; int key_len; @@ -473,11 +474,12 @@ static int ixgbe_ipsec_parse_proto_keys(struct xfrm_state *xs, /** * ixgbe_ipsec_check_mgmt_ip - make sure there is no clash with mgmt IP filters + * @dev: pointer to net device * @xs: pointer to transformer state struct **/ -static int ixgbe_ipsec_check_mgmt_ip(struct xfrm_state *xs) +static int ixgbe_ipsec_check_mgmt_ip(struct net_device *dev, + struct xfrm_state *xs) { - struct net_device *dev = xs->xso.real_dev; struct ixgbe_adapter *adapter = netdev_priv(dev); struct ixgbe_hw *hw = &adapter->hw; u32 mfval, manc, reg; @@ -556,13 +558,14 @@ static int ixgbe_ipsec_check_mgmt_ip(struct xfrm_state *xs) /** * ixgbe_ipsec_add_sa - program device with a security association + * @dev: pointer to device to program * @xs: pointer to transformer state struct * @extack: extack point to fill failure reason **/ -static int ixgbe_ipsec_add_sa(struct xfrm_state *xs, +static int ixgbe_ipsec_add_sa(struct net_device *dev, + struct xfrm_state *xs, struct netlink_ext_ack *extack) { - struct net_device *dev = xs->xso.real_dev; struct ixgbe_adapter *adapter = netdev_priv(dev); struct ixgbe_ipsec *ipsec = adapter->ipsec; struct ixgbe_hw *hw = &adapter->hw; @@ -581,7 +584,7 @@ static int ixgbe_ipsec_add_sa(struct xfrm_state *xs, return -EINVAL; } - if (ixgbe_ipsec_check_mgmt_ip(xs)) { + if (ixgbe_ipsec_check_mgmt_ip(dev, xs)) { NL_SET_ERR_MSG_MOD(extack, "IPsec IP addr clash with mgmt filters"); return -EINVAL; } @@ -615,7 +618,7 @@ static int ixgbe_ipsec_add_sa(struct xfrm_state *xs, rsa.decrypt = xs->ealg || xs->aead; /* get the key and salt */ - ret = ixgbe_ipsec_parse_proto_keys(xs, rsa.key, &rsa.salt); + ret = ixgbe_ipsec_parse_proto_keys(dev, xs, rsa.key, &rsa.salt); if (ret) { NL_SET_ERR_MSG_MOD(extack, "Failed to get key data for Rx SA table"); return ret; @@ -724,7 +727,7 @@ static int ixgbe_ipsec_add_sa(struct xfrm_state *xs, if (xs->id.proto & IPPROTO_ESP) tsa.encrypt = xs->ealg || xs->aead; - ret = ixgbe_ipsec_parse_proto_keys(xs, tsa.key, &tsa.salt); + ret = ixgbe_ipsec_parse_proto_keys(dev, xs, tsa.key, &tsa.salt); if (ret) { NL_SET_ERR_MSG_MOD(extack, "Failed to get key data for Tx SA table"); memset(&tsa, 0, sizeof(tsa)); @@ -752,11 +755,11 @@ static int ixgbe_ipsec_add_sa(struct xfrm_state *xs, /** * ixgbe_ipsec_del_sa - clear out this specific SA + * @dev: pointer to device to program * @xs: pointer to transformer state struct **/ -static void ixgbe_ipsec_del_sa(struct xfrm_state *xs) +static void ixgbe_ipsec_del_sa(struct net_device *dev, struct xfrm_state *xs) { - struct net_device *dev = xs->xso.real_dev; struct ixgbe_adapter *adapter = netdev_priv(dev); struct ixgbe_ipsec *ipsec = adapter->ipsec; struct ixgbe_hw *hw = &adapter->hw; @@ -841,7 +844,8 @@ void ixgbe_ipsec_vf_clear(struct ixgbe_adapter *adapter, u32 vf) continue; if (ipsec->rx_tbl[i].mode & IXGBE_RXTXMOD_VF && ipsec->rx_tbl[i].vf == vf) - ixgbe_ipsec_del_sa(ipsec->rx_tbl[i].xs); + ixgbe_ipsec_del_sa(adapter->netdev, + ipsec->rx_tbl[i].xs); } /* search tx sa table */ @@ -850,7 +854,8 @@ void ixgbe_ipsec_vf_clear(struct ixgbe_adapter *adapter, u32 vf) continue; if (ipsec->tx_tbl[i].mode & IXGBE_RXTXMOD_VF && ipsec->tx_tbl[i].vf == vf) - ixgbe_ipsec_del_sa(ipsec->tx_tbl[i].xs); + ixgbe_ipsec_del_sa(adapter->netdev, + ipsec->tx_tbl[i].xs); } } @@ -930,7 +935,7 @@ int ixgbe_ipsec_vf_add_sa(struct ixgbe_adapter *adapter, u32 *msgbuf, u32 vf) memcpy(xs->aead->alg_name, aes_gcm_name, sizeof(aes_gcm_name)); /* set up the HW offload */ - err = ixgbe_ipsec_add_sa(xs, NULL); + err = ixgbe_ipsec_add_sa(adapter->netdev, xs, NULL); if (err) goto err_aead; @@ -1034,7 +1039,7 @@ int ixgbe_ipsec_vf_del_sa(struct ixgbe_adapter *adapter, u32 *msgbuf, u32 vf) xs = ipsec->tx_tbl[sa_idx].xs; } - ixgbe_ipsec_del_sa(xs); + ixgbe_ipsec_del_sa(adapter->netdev, xs); /* remove the xs that was made-up in the add request */ kfree_sensitive(xs); diff --git a/drivers/net/ethernet/intel/ixgbevf/ipsec.c b/drivers/net/ethernet/intel/ixgbevf/ipsec.c index 8ba037e3d9c2..65580b9cb06f 100644 --- a/drivers/net/ethernet/intel/ixgbevf/ipsec.c +++ b/drivers/net/ethernet/intel/ixgbevf/ipsec.c @@ -201,6 +201,7 @@ struct xfrm_state *ixgbevf_ipsec_find_rx_state(struct ixgbevf_ipsec *ipsec, /** * ixgbevf_ipsec_parse_proto_keys - find the key and salt based on the protocol + * @dev: pointer to net device to program * @xs: pointer to xfrm_state struct * @mykey: pointer to key array to populate * @mysalt: pointer to salt value to populate @@ -208,10 +209,10 @@ struct xfrm_state *ixgbevf_ipsec_find_rx_state(struct ixgbevf_ipsec *ipsec, * This copies the protocol keys and salt to our own data tables. The * 82599 family only supports the one algorithm. **/ -static int ixgbevf_ipsec_parse_proto_keys(struct xfrm_state *xs, +static int ixgbevf_ipsec_parse_proto_keys(struct net_device *dev, + struct xfrm_state *xs, u32 *mykey, u32 *mysalt) { - struct net_device *dev = xs->xso.real_dev; unsigned char *key_data; char *alg_name = NULL; int key_len; @@ -256,13 +257,14 @@ static int ixgbevf_ipsec_parse_proto_keys(struct xfrm_state *xs, /** * ixgbevf_ipsec_add_sa - program device with a security association + * @dev: pointer to net device to program * @xs: pointer to transformer state struct * @extack: extack point to fill failure reason **/ -static int ixgbevf_ipsec_add_sa(struct xfrm_state *xs, +static int ixgbevf_ipsec_add_sa(struct net_device *dev, + struct xfrm_state *xs, struct netlink_ext_ack *extack) { - struct net_device *dev = xs->xso.real_dev; struct ixgbevf_adapter *adapter; struct ixgbevf_ipsec *ipsec; u16 sa_idx; @@ -310,7 +312,8 @@ static int ixgbevf_ipsec_add_sa(struct xfrm_state *xs, rsa.decrypt = xs->ealg || xs->aead; /* get the key and salt */ - ret = ixgbevf_ipsec_parse_proto_keys(xs, rsa.key, &rsa.salt); + ret = ixgbevf_ipsec_parse_proto_keys(dev, xs, rsa.key, + &rsa.salt); if (ret) { NL_SET_ERR_MSG_MOD(extack, "Failed to get key data for Rx SA table"); return ret; @@ -363,7 +366,8 @@ static int ixgbevf_ipsec_add_sa(struct xfrm_state *xs, if (xs->id.proto & IPPROTO_ESP) tsa.encrypt = xs->ealg || xs->aead; - ret = ixgbevf_ipsec_parse_proto_keys(xs, tsa.key, &tsa.salt); + ret = ixgbevf_ipsec_parse_proto_keys(dev, xs, tsa.key, + &tsa.salt); if (ret) { NL_SET_ERR_MSG_MOD(extack, "Failed to get key data for Tx SA table"); memset(&tsa, 0, sizeof(tsa)); @@ -388,11 +392,12 @@ static int ixgbevf_ipsec_add_sa(struct xfrm_state *xs, /** * ixgbevf_ipsec_del_sa - clear out this specific SA + * @dev: pointer to net device to program * @xs: pointer to transformer state struct **/ -static void ixgbevf_ipsec_del_sa(struct xfrm_state *xs) +static void ixgbevf_ipsec_del_sa(struct net_device *dev, + struct xfrm_state *xs) { - struct net_device *dev = xs->xso.real_dev; struct ixgbevf_adapter *adapter; struct ixgbevf_ipsec *ipsec; u16 sa_idx; diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/cn10k_ipsec.c b/drivers/net/ethernet/marvell/octeontx2/nic/cn10k_ipsec.c index fc59e50bafce..a6500e3673f2 100644 --- a/drivers/net/ethernet/marvell/octeontx2/nic/cn10k_ipsec.c +++ b/drivers/net/ethernet/marvell/octeontx2/nic/cn10k_ipsec.c @@ -663,10 +663,10 @@ static int cn10k_ipsec_inb_add_state(struct xfrm_state *x, return -EOPNOTSUPP; } -static int cn10k_ipsec_outb_add_state(struct xfrm_state *x, +static int cn10k_ipsec_outb_add_state(struct net_device *dev, + struct xfrm_state *x, struct netlink_ext_ack *extack) { - struct net_device *netdev = x->xso.dev; struct cn10k_tx_sa_s *sa_entry; struct qmem *sa_info; struct otx2_nic *pf; @@ -676,7 +676,7 @@ static int cn10k_ipsec_outb_add_state(struct xfrm_state *x, if (err) return err; - pf = netdev_priv(netdev); + pf = netdev_priv(dev); err = qmem_alloc(pf->dev, &sa_info, pf->ipsec.sa_size, OTX2_ALIGN); if (err) @@ -700,18 +700,18 @@ static int cn10k_ipsec_outb_add_state(struct xfrm_state *x, return 0; } -static int cn10k_ipsec_add_state(struct xfrm_state *x, +static int cn10k_ipsec_add_state(struct net_device *dev, + struct xfrm_state *x, struct netlink_ext_ack *extack) { if (x->xso.dir == XFRM_DEV_OFFLOAD_IN) return cn10k_ipsec_inb_add_state(x, extack); else - return cn10k_ipsec_outb_add_state(x, extack); + return cn10k_ipsec_outb_add_state(dev, x, extack); } -static void cn10k_ipsec_del_state(struct xfrm_state *x) +static void cn10k_ipsec_del_state(struct net_device *dev, struct xfrm_state *x) { - struct net_device *netdev = x->xso.dev; struct cn10k_tx_sa_s *sa_entry; struct qmem *sa_info; struct otx2_nic *pf; @@ -720,7 +720,7 @@ static void cn10k_ipsec_del_state(struct xfrm_state *x) if (x->xso.dir == XFRM_DEV_OFFLOAD_IN) return; - pf = netdev_priv(netdev); + pf = netdev_priv(dev); sa_info = (struct qmem *)x->xso.offload_handle; sa_entry = (struct cn10k_tx_sa_s *)sa_info->base; @@ -732,7 +732,7 @@ static void cn10k_ipsec_del_state(struct xfrm_state *x) err = cn10k_outb_write_sa(pf, sa_info); if (err) - netdev_err(netdev, "Error (%d) deleting SA\n", err); + netdev_err(dev, "Error (%d) deleting SA\n", err); x->xso.offload_handle = 0; qmem_free(pf->dev, sa_info); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c index 0dfbbe21936f..77f61cd28a79 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c @@ -689,17 +689,17 @@ static int mlx5e_ipsec_create_dwork(struct mlx5e_ipsec_sa_entry *sa_entry) return 0; } -static int mlx5e_xfrm_add_state(struct xfrm_state *x, +static int mlx5e_xfrm_add_state(struct net_device *dev, + struct xfrm_state *x, struct netlink_ext_ack *extack) { struct mlx5e_ipsec_sa_entry *sa_entry = NULL; - struct net_device *netdev = x->xso.real_dev; struct mlx5e_ipsec *ipsec; struct mlx5e_priv *priv; gfp_t gfp; int err; - priv = netdev_priv(netdev); + priv = netdev_priv(dev); if (!priv->ipsec) return -EOPNOTSUPP; @@ -710,7 +710,7 @@ static int mlx5e_xfrm_add_state(struct xfrm_state *x, return -ENOMEM; sa_entry->x = x; - sa_entry->dev = netdev; + sa_entry->dev = dev; sa_entry->ipsec = ipsec; /* Check if this SA is originated from acquire flow temporary SA */ if (x->xso.flags & XFRM_DEV_OFFLOAD_FLAG_ACQ) @@ -807,7 +807,7 @@ static int mlx5e_xfrm_add_state(struct xfrm_state *x, return err; } -static void mlx5e_xfrm_del_state(struct xfrm_state *x) +static void mlx5e_xfrm_del_state(struct net_device *dev, struct xfrm_state *x) { struct mlx5e_ipsec_sa_entry *sa_entry = to_ipsec_sa_entry(x); struct mlx5e_ipsec *ipsec = sa_entry->ipsec; @@ -820,7 +820,7 @@ static void mlx5e_xfrm_del_state(struct xfrm_state *x) WARN_ON(old != sa_entry); } -static void mlx5e_xfrm_free_state(struct xfrm_state *x) +static void mlx5e_xfrm_free_state(struct net_device *dev, struct xfrm_state *x) { struct mlx5e_ipsec_sa_entry *sa_entry = to_ipsec_sa_entry(x); struct mlx5e_ipsec *ipsec = sa_entry->ipsec; diff --git a/drivers/net/ethernet/netronome/nfp/crypto/ipsec.c b/drivers/net/ethernet/netronome/nfp/crypto/ipsec.c index 671af5d4c5d2..9e7c285eaa6b 100644 --- a/drivers/net/ethernet/netronome/nfp/crypto/ipsec.c +++ b/drivers/net/ethernet/netronome/nfp/crypto/ipsec.c @@ -266,17 +266,17 @@ static void set_sha2_512hmac(struct nfp_ipsec_cfg_add_sa *cfg, int *trunc_len) } } -static int nfp_net_xfrm_add_state(struct xfrm_state *x, +static int nfp_net_xfrm_add_state(struct net_device *dev, + struct xfrm_state *x, struct netlink_ext_ack *extack) { - struct net_device *netdev = x->xso.real_dev; struct nfp_ipsec_cfg_mssg msg = {}; int i, key_len, trunc_len, err = 0; struct nfp_ipsec_cfg_add_sa *cfg; struct nfp_net *nn; unsigned int saidx; - nn = netdev_priv(netdev); + nn = netdev_priv(dev); cfg = &msg.cfg_add_sa; /* General */ @@ -546,17 +546,16 @@ static int nfp_net_xfrm_add_state(struct xfrm_state *x, return 0; } -static void nfp_net_xfrm_del_state(struct xfrm_state *x) +static void nfp_net_xfrm_del_state(struct net_device *dev, struct xfrm_state *x) { struct nfp_ipsec_cfg_mssg msg = { .cmd = NFP_IPSEC_CFG_MSSG_INV_SA, .sa_idx = x->xso.offload_handle - 1, }; - struct net_device *netdev = x->xso.real_dev; struct nfp_net *nn; int err; - nn = netdev_priv(netdev); + nn = netdev_priv(dev); err = nfp_net_sched_mbox_amsg_work(nn, NFP_NET_CFG_MBOX_CMD_IPSEC, &msg, sizeof(msg), nfp_net_ipsec_cfg); if (err) diff --git a/drivers/net/netdevsim/ipsec.c b/drivers/net/netdevsim/ipsec.c index d88bdb9a1717..47cdee5577d4 100644 --- a/drivers/net/netdevsim/ipsec.c +++ b/drivers/net/netdevsim/ipsec.c @@ -85,11 +85,11 @@ static int nsim_ipsec_find_empty_idx(struct nsim_ipsec *ipsec) return -ENOSPC; } -static int nsim_ipsec_parse_proto_keys(struct xfrm_state *xs, +static int nsim_ipsec_parse_proto_keys(struct net_device *dev, + struct xfrm_state *xs, u32 *mykey, u32 *mysalt) { const char aes_gcm_name[] = "rfc4106(gcm(aes))"; - struct net_device *dev = xs->xso.real_dev; unsigned char *key_data; char *alg_name = NULL; int key_len; @@ -129,17 +129,16 @@ static int nsim_ipsec_parse_proto_keys(struct xfrm_state *xs, return 0; } -static int nsim_ipsec_add_sa(struct xfrm_state *xs, +static int nsim_ipsec_add_sa(struct net_device *dev, + struct xfrm_state *xs, struct netlink_ext_ack *extack) { struct nsim_ipsec *ipsec; - struct net_device *dev; struct netdevsim *ns; struct nsim_sa sa; u16 sa_idx; int ret; - dev = xs->xso.real_dev; ns = netdev_priv(dev); ipsec = &ns->ipsec; @@ -174,7 +173,7 @@ static int nsim_ipsec_add_sa(struct xfrm_state *xs, sa.crypt = xs->ealg || xs->aead; /* get the key and salt */ - ret = nsim_ipsec_parse_proto_keys(xs, sa.key, &sa.salt); + ret = nsim_ipsec_parse_proto_keys(dev, xs, sa.key, &sa.salt); if (ret) { NL_SET_ERR_MSG_MOD(extack, "Failed to get key data for SA table"); return ret; @@ -200,9 +199,9 @@ static int nsim_ipsec_add_sa(struct xfrm_state *xs, return 0; } -static void nsim_ipsec_del_sa(struct xfrm_state *xs) +static void nsim_ipsec_del_sa(struct net_device *dev, struct xfrm_state *xs) { - struct netdevsim *ns = netdev_priv(xs->xso.real_dev); + struct netdevsim *ns = netdev_priv(dev); struct nsim_ipsec *ipsec = &ns->ipsec; u16 sa_idx; diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index cf3b6445817b..4dd07aaa2649 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -1012,9 +1012,13 @@ struct netdev_bpf { #ifdef CONFIG_XFRM_OFFLOAD struct xfrmdev_ops { - int (*xdo_dev_state_add) (struct xfrm_state *x, struct netlink_ext_ack *extack); - void (*xdo_dev_state_delete) (struct xfrm_state *x); - void (*xdo_dev_state_free) (struct xfrm_state *x); + int (*xdo_dev_state_add)(struct net_device *dev, + struct xfrm_state *x, + struct netlink_ext_ack *extack); + void (*xdo_dev_state_delete)(struct net_device *dev, + struct xfrm_state *x); + void (*xdo_dev_state_free)(struct net_device *dev, + struct xfrm_state *x); bool (*xdo_dev_offload_ok) (struct sk_buff *skb, struct xfrm_state *x); void (*xdo_dev_state_advance_esn) (struct xfrm_state *x); diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 39365fd2ea17..3d2f6c879311 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h @@ -147,8 +147,16 @@ enum { }; struct xfrm_dev_offload { + /* The device for this offload. + * Device drivers should not use this directly, as that will prevent + * them from working with bonding device. Instead, the device passed + * to the add/delete callbacks should be used. + */ struct net_device *dev; netdevice_tracker dev_tracker; + /* This is a private pointer used by the bonding driver. + * Device drivers should not use it. + */ struct net_device *real_dev; unsigned long offload_handle; u8 dir : 2; diff --git a/net/xfrm/xfrm_device.c b/net/xfrm/xfrm_device.c index 0be5f7ffd019..3be0139373f7 100644 --- a/net/xfrm/xfrm_device.c +++ b/net/xfrm/xfrm_device.c @@ -309,7 +309,6 @@ int xfrm_dev_state_add(struct net *net, struct xfrm_state *x, xso->dev = dev; netdev_tracker_alloc(dev, &xso->dev_tracker, GFP_ATOMIC); - xso->real_dev = dev; if (xuo->flags & XFRM_OFFLOAD_INBOUND) xso->dir = XFRM_DEV_OFFLOAD_IN; @@ -321,11 +320,10 @@ int xfrm_dev_state_add(struct net *net, struct xfrm_state *x, else xso->type = XFRM_DEV_OFFLOAD_CRYPTO; - err = dev->xfrmdev_ops->xdo_dev_state_add(x, extack); + err = dev->xfrmdev_ops->xdo_dev_state_add(dev, x, extack); if (err) { xso->dev = NULL; xso->dir = 0; - xso->real_dev = NULL; netdev_put(dev, &xso->dev_tracker); xso->type = XFRM_DEV_OFFLOAD_UNSPECIFIED; diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index 33d1f5679e8b..e9b6e25508f6 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c @@ -767,7 +767,7 @@ void xfrm_dev_state_delete(struct xfrm_state *x) struct net_device *dev = READ_ONCE(xso->dev); if (dev) { - dev->xfrmdev_ops->xdo_dev_state_delete(x); + dev->xfrmdev_ops->xdo_dev_state_delete(dev, x); spin_lock_bh(&xfrm_state_dev_gc_lock); hlist_add_head(&x->dev_gclist, &xfrm_state_dev_gc_list); spin_unlock_bh(&xfrm_state_dev_gc_lock); @@ -789,7 +789,7 @@ void xfrm_dev_state_free(struct xfrm_state *x) spin_unlock_bh(&xfrm_state_dev_gc_lock); if (dev->xfrmdev_ops->xdo_dev_state_free) - dev->xfrmdev_ops->xdo_dev_state_free(x); + dev->xfrmdev_ops->xdo_dev_state_free(dev, x); WRITE_ONCE(xso->dev, NULL); xso->type = XFRM_DEV_OFFLOAD_UNSPECIFIED; netdev_put(dev, &xso->dev_tracker); @@ -1551,16 +1551,18 @@ xfrm_state_find(const xfrm_address_t *daddr, const xfrm_address_t *saddr, if (pol->xdo.type == XFRM_DEV_OFFLOAD_PACKET) { struct xfrm_dev_offload *xdo = &pol->xdo; struct xfrm_dev_offload *xso = &x->xso; + struct net_device *dev = xdo->dev; xso->type = XFRM_DEV_OFFLOAD_PACKET; xso->dir = xdo->dir; - xso->dev = xdo->dev; + xso->dev = dev; xso->flags = XFRM_DEV_OFFLOAD_FLAG_ACQ; - netdev_hold(xso->dev, &xso->dev_tracker, GFP_ATOMIC); - error = xso->dev->xfrmdev_ops->xdo_dev_state_add(x, NULL); + netdev_hold(dev, &xso->dev_tracker, GFP_ATOMIC); + error = dev->xfrmdev_ops->xdo_dev_state_add(dev, x, + NULL); if (error) { xso->dir = 0; - netdev_put(xso->dev, &xso->dev_tracker); + netdev_put(dev, &xso->dev_tracker); xso->dev = NULL; xso->type = XFRM_DEV_OFFLOAD_UNSPECIFIED; x->km.state = XFRM_STATE_DEAD; From patchwork Fri Apr 11 07:49:57 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cosmin Ratiu X-Patchwork-Id: 880418 Received: from NAM10-BN7-obe.outbound.protection.outlook.com (mail-bn7nam10on2055.outbound.protection.outlook.com [40.107.92.55]) (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 5502E293450; Fri, 11 Apr 2025 07:51:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.92.55 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744357870; cv=fail; b=TuF3tT10fqmXyiNbePRSYB5vhElpcqM0GTxwKUU+yy+romGRFP56n7TzTChYdetgEx7Tsu6CEjTnUazbtP3c6P0wP9pnIH213af57ZDiNI/kKl1qzJwyqoFbLAItePb9mCmuU4c64GcdAP6hrvY/AtvUzl214mfgsb2ZrHVeyX4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744357870; c=relaxed/simple; bh=CnbFUE/OZRjtRGDJB0YcTw9Naxna1RKFIWvnQx12EsU=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=HoCK/DmloYqYlTCPr8/8ZjM2FInldSQJoaZUNtw6tsY9RgU5zwFL2owtnZJmA8ySoEd2jrb/Q9sAT6T47eSIaE+zzjRnTe9zdV/fY0gotfe2lzcGXjsAOHAWWVvdlV8mHdaz/Q2dUccdGkeXNJCR1XXvBlQwh8HvYyTJaIi7Tec= 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=OlmMN+34; arc=fail smtp.client-ip=40.107.92.55 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="OlmMN+34" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Pg9p2GqE7c0I6zVug0Awfw6Vy3DxcraZ+1bv0rsduDjkR+vpz8B7etpvfytEotFOwgWekJ8VZFIWtWU6Qu1rV8ryl1I7ho8ZC984+WgwDYJzs+EomdywLznWVngF6n68Df8jOxjKBzRs4C9MrpxNgpR8IJbmgH4GqWLAKmPJSG98LHPsAZgdC5yE/2wO237HUFBoTIhcYADLseMS+rn8GeXm1ymBp0wOJKbIqKQoWmHkyeKwcg9VjvXRQr/c3X9HKYpWhOiIi+Pkzaxe85yYnQ1eOe8E+l3jJvqzEL8mesxrvI6YvMsdmJc998N7IL8YUkLCu022PdeEQvEnZ/INSA== 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=NVIXMDIGe6PJt+URsYS7TQpSKdeZN/N1kR8XTluTi9U=; b=noBTJN5YRHcfiMK1Vpl6JqQP/D7KDPTtw8KJb4ospCJ6p3019TkiovywOvD1NAzMm0e2jmYst4sTgzqs2NrsrSauz+12rFNQFGLC1Q44OjnJy7krfEGhe2PhxjJc7IHo4kPhvquYa3eZeAbjgIaPQKwZZjz00sDcmROrEJ57xr4rJzh319obg3CGKKMjqs/9nNZ5T9WvD1h4NYA9z7TSb8t7zEBRVKfFb5NMo2THdVR80QfqkJfolSxh4dQDgvqGXcndH7E/Q3Vi5ikCMJg7ynt1UKr9WoX+oUuyIz4r4Bv1bT/8ftG9XixcHOloI5JQZ/qfuj8PzXGruJaiWZgO+A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=NVIXMDIGe6PJt+URsYS7TQpSKdeZN/N1kR8XTluTi9U=; b=OlmMN+34+vSDI9a3fzKSFvo2Q+iAJRBG6qB1KJsHa8jCv1y5z7zQK/u3jNyLZ+vzTGivB95weHyCG+KPCPU4o3gYuIxowkoBFZbwbm3495EqYlL7rahVs+IR5zf31ESqTMtdjbxUKHg8Ffsyp7o3ap9ZdBXpSZGhblu5lI34U+u7alPVPJNoxIJ3BImlnY8iLn5HhS8z92qmKSrGZZhAT9sVIyDpHtFgsXUUKVt0hAIoCotXZxBUoXvjeXRnySZ2NPOPsVhRhBSCoL/grzmlOWYM2ME2pFIxsciVmyLIoE2t4fCEJfr7WuvVxD8ZSx+MW6Y8DfLXkCbYSKzM8Mgc4A== Received: from SN6PR08CA0014.namprd08.prod.outlook.com (2603:10b6:805:66::27) by SJ2PR12MB8847.namprd12.prod.outlook.com (2603:10b6:a03:546::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8606.34; Fri, 11 Apr 2025 07:51:02 +0000 Received: from SA2PEPF00003AE8.namprd02.prod.outlook.com (2603:10b6:805:66:cafe::1b) by SN6PR08CA0014.outlook.office365.com (2603:10b6:805:66::27) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8632.26 via Frontend Transport; Fri, 11 Apr 2025 07:51:01 +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 SA2PEPF00003AE8.mail.protection.outlook.com (10.167.248.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8655.12 via Frontend Transport; Fri, 11 Apr 2025 07:51:01 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) 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.1544.4; Fri, 11 Apr 2025 00:50:48 -0700 Received: from c-237-113-240-247.mtl.labs.mlnx (10.126.231.35) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.14; Fri, 11 Apr 2025 00:50:42 -0700 From: Cosmin Ratiu To: , CC: Hangbin Liu , Jay Vosburgh , Andrew Lunn , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Nikolay Aleksandrov , Simon Horman , Saeed Mahameed , Tariq Toukan , Jianbo Liu , Steffen Klassert , Herbert Xu , Ayush Sawal , Tony Nguyen , "Przemek Kitszel" , Sunil Goutham , Geetha sowjanya , Subbaraya Sundeep , hariprasad , Bharat Bhushan , Louis Peens , "Leon Romanovsky" , Subject: [PATCH net-next v3 5/6] bonding: Mark active offloaded xfrm_states Date: Fri, 11 Apr 2025 10:49:57 +0300 Message-ID: <20250411074958.2858496-6-cratiu@nvidia.com> X-Mailer: git-send-email 2.45.0 In-Reply-To: <20250411074958.2858496-1-cratiu@nvidia.com> References: <20250411074958.2858496-1-cratiu@nvidia.com> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-ClientProxiedBy: rnnvmail203.nvidia.com (10.129.68.9) To rnnvmail201.nvidia.com (10.129.68.8) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SA2PEPF00003AE8:EE_|SJ2PR12MB8847:EE_ X-MS-Office365-Filtering-Correlation-Id: 9dcd9ac8-8fea-416c-74ff-08dd78cd9ac8 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|1800799024|376014|7416014|36860700013|82310400026|13003099007; X-Microsoft-Antispam-Message-Info: fedv7EdHwWcDgRFgzqK1f0j0qTTC189FBAhPWZyNmqRplfx94xVbQjhwKmo0Gy1TzUX5Jr1kpnlO/ug+2SMs/tEvqp2/ifVHh0KvghNFLxb+1Exb0HHOhyIkkj6tJT41yjAg8OMwaE0Cx6N4RsYY3G4PLsdnv66fRSpQN48kQDs0JhgyDquihUj5SvTDupaF7mZRj0zF6qzs4f4p5T9QrESAQ8bS/JrV5Jn+xAZfY0uWvqMnK+uKxJQqFH/dmNSrlybbM/27oSI5By/BN9tH/tjyX8beQU85IUzznTW+S8Mt31GCk1NxUSXJi2WH64bGDp4W1H7HbfnWeQ6a17AcCcdqt0+eHeytB7GTvFOChi2MXA5EBDxuEd+QSgx35rmZT5Y1awS6cVHcqJ7FxVp9rdBQEwbZnkJxGEWe8cuTwENLudT1HyHHeQF6p8VqNy1/NGEgurEz33kOeghxsunJ0dz/pJlA3dT/f2Yvkb9gAg4ojTw3xssnj6PPFVhOeGVwtP5tUnmPZEFBIo/2Z6b03M7w8nYOpJp77ytpKsg8FQgpWTNeDMo4x4f8XVB3iCrt0ANuld761mKuvKzHsgJfrCESpl1QnqUElWWnuePY5Bi04LeZ/UVE2HQsZmRQNcgKHfzvCyUe2AUz+dS4CNfOZZlsRU3NpRBMuT6UsO83xuwkVG2xDKSr/TtzzFYL1V/BWYtGgINE9FOyKdcLe4rBB+RYrxCqGENzvnJNHl8CdMwpZ2QBSKnAORX4584uUTeQAm1FrNziVvmzlmA+E56pyJa7hYi4P6051VY6Jhc9aWOMir+ctrEikxyHzE4Mi30ZSEBMWGcYEg0/bei2HDJt3zcx7WR0Dd3TqGyq+eV54VRSwnDAu+CpqE2OV5qKl2uKlhBiSZSsi3Km3IrsPB3n4f8Yi/7jHXH8b/ubkm13F92DeKnw7ujcG6c8L/hWt4dyg1QGmU+cM+AQYhzAZ4ztiskKdO8qR1Hf08Vz6M2uz3T7UOFkKzk5G1oSPEX0TVwQWvoTzrJfiWSfyKgXz07rY1cTzEJ7uyVThF5z8XPqvoDtmeadAfaaK1P4smPayrck8M/9hkvkRoYfAIxa6jk8E2haA/wahkI3XAg5Bq/6Y1yVfLax2/SQf8XReTo4XKfkM5RIBfjAteFO8Ma732RhW0XTfVTfSEkDm4ZU40UjFMTUVy48zdLsQwWCgvVDqkmDHiIkdkzWB1Y+cMpHkcyBLZhtxIM5KEQcA6U5u/YM/12K1ncXNtqGznZ1P6cY6/1yBq/05iNDOwvC/+DwdtmDZb8g/W4OzIhU1/FF/VA04qF03oxDw12OMfbZjowLe9RYDIbMmghLxQCSpOY0+WRGBTo4dYYNQ2BQeHlNQzp5b19YTLt/RQZvwqoRC7um4O74pPFdThjf/k0AkXj/0H7rUKD2mJhifnoxY3eNkVW6+50wK+7jAnzDdplZU3nz6cuwbyC0n/Qro2f8q9hfJvvNT+MRkCTqblV8VasG0HwGR8IwHf8zxmU+SlVVeGkmhWevkXpohTa5QlytKCils1+weg== 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)(1800799024)(376014)(7416014)(36860700013)(82310400026)(13003099007); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Apr 2025 07:51:01.5529 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 9dcd9ac8-8fea-416c-74ff-08dd78cd9ac8 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: SA2PEPF00003AE8.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ2PR12MB8847 When the active link is changed for a bond device, the existing xfrm states need to be migrated over to the new link. This is done with: - bond_ipsec_del_sa_all() goes through the offloaded states list and removes all of them from hw. - bond_ipsec_add_sa_all() re-offloads all states to the new device. But because the offload status of xfrm states isn't marked in any way, there can be bugs. When all bond links are down, bond_ipsec_del_sa_all() unoffloads everything from the previous active link. If the same link then comes back up, nothing gets reoffloaded by bond_ipsec_add_sa_all(). This results in a stack trace like this a bit later when user space removes the offloaded rules, because mlx5e_xfrm_del_state() is asked to remove a rule that's no longer offloaded: [] Call Trace: [] [] ? __warn+0x7d/0x110 [] ? mlx5e_xfrm_del_state+0x90/0xa0 [mlx5_core] [] ? report_bug+0x16d/0x180 [] ? handle_bug+0x4f/0x90 [] ? exc_invalid_op+0x14/0x70 [] ? asm_exc_invalid_op+0x16/0x20 [] ? mlx5e_xfrm_del_state+0x73/0xa0 [mlx5_core] [] ? mlx5e_xfrm_del_state+0x90/0xa0 [mlx5_core] [] bond_ipsec_del_sa+0x1ab/0x200 [bonding] [] xfrm_dev_state_delete+0x1f/0x60 [] __xfrm_state_delete+0x196/0x200 [] xfrm_state_delete+0x21/0x40 [] xfrm_del_sa+0x69/0x110 [] xfrm_user_rcv_msg+0x11d/0x300 [] ? release_pages+0xca/0x140 [] ? copy_to_user_tmpl.part.0+0x110/0x110 [] netlink_rcv_skb+0x54/0x100 [] xfrm_netlink_rcv+0x31/0x40 [] netlink_unicast+0x1fc/0x2d0 [] netlink_sendmsg+0x1e4/0x410 [] __sock_sendmsg+0x38/0x60 [] sock_write_iter+0x94/0xf0 [] vfs_write+0x338/0x3f0 [] ksys_write+0xba/0xd0 [] do_syscall_64+0x4c/0x100 [] entry_SYSCALL_64_after_hwframe+0x4b/0x53 There's also another theoretical bug: Calling bond_ipsec_del_sa_all() multiple times can result in corruption in the driver implementation if the double-free isn't tolerated. This isn't nice. Before the "Fixes" commit, xs->xso.real_dev was set to NULL when an xfrm state was unoffloaded from a device, but a race with netdevsim's .xdo_dev_offload_ok() accessing real_dev was considered a sufficient reason to not set real_dev to NULL anymore. This unfortunately introduced the new bugs. Since .xdo_dev_offload_ok() was significantly refactored by [1] and there are no more users in the stack of xso.real_dev, that race is now gone and xs->xso.real_dev can now once again be used to represent which device (if any) currently holds the offloaded rule. Go one step further and set real_dev after add/before delete calls, to catch any future driver misuses of real_dev. [1] https://lore.kernel.org/netdev/cover.1739972570.git.leon@kernel.org/ Fixes: f8cde9805981 ("bonding: fix xfrm real_dev null pointer dereference") Signed-off-by: Cosmin Ratiu Reviewed-by: Leon Romanovsky --- drivers/net/bonding/bond_main.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 4ba525a564c5..14f7c9712ad4 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -496,9 +496,9 @@ static int bond_ipsec_add_sa(struct net_device *bond_dev, goto out; } - xs->xso.real_dev = real_dev; err = real_dev->xfrmdev_ops->xdo_dev_state_add(real_dev, xs, extack); if (!err) { + xs->xso.real_dev = real_dev; ipsec->xs = xs; INIT_LIST_HEAD(&ipsec->list); mutex_lock(&bond->ipsec_lock); @@ -540,12 +540,12 @@ static void bond_ipsec_add_sa_all(struct bonding *bond) if (ipsec->xs->xso.real_dev == real_dev) continue; - ipsec->xs->xso.real_dev = real_dev; if (real_dev->xfrmdev_ops->xdo_dev_state_add(real_dev, ipsec->xs, NULL)) { slave_warn(bond_dev, real_dev, "%s: failed to add SA\n", __func__); - ipsec->xs->xso.real_dev = NULL; + continue; } + ipsec->xs->xso.real_dev = real_dev; } out: mutex_unlock(&bond->ipsec_lock); @@ -629,6 +629,7 @@ static void bond_ipsec_del_sa_all(struct bonding *bond) __func__); continue; } + ipsec->xs->xso.real_dev = NULL; real_dev->xfrmdev_ops->xdo_dev_state_delete(real_dev, ipsec->xs); if (real_dev->xfrmdev_ops->xdo_dev_state_free) @@ -664,6 +665,7 @@ static void bond_ipsec_free_sa(struct net_device *bond_dev, WARN_ON(xs->xso.real_dev != real_dev); + xs->xso.real_dev = NULL; if (real_dev && real_dev->xfrmdev_ops && real_dev->xfrmdev_ops->xdo_dev_state_free) real_dev->xfrmdev_ops->xdo_dev_state_free(real_dev, xs); From patchwork Fri Apr 11 07:49:58 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cosmin Ratiu X-Patchwork-Id: 880685 Received: from NAM12-MW2-obe.outbound.protection.outlook.com (mail-mw2nam12on2069.outbound.protection.outlook.com [40.107.244.69]) (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 08D201E7C0E; Fri, 11 Apr 2025 07:51:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.244.69 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744357879; cv=fail; b=mtAXucq2YazbxGbQm4M9X/9Rt3e7Zx21q68PmcklVOgYVAdQ8E+UbxGSp8EHdPdYwsUQi2e3YED4D2w/5PXDcWy/oslSHip7eoAcdvDqpgBnWHn0LbLA3kIW1WeXWD+yNWpTmLvCNgvX4w+KYZheuSvtL/G8Sg0Oyr5ImYOyPnM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744357879; c=relaxed/simple; bh=FRH8B/I51FzpzGdbYbEKjOIVlyf1FTbljkk7AES0u4k=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=E54HHaWuI94Fxc1W5d2D6akY2Lx2VGPwAYjLXYrzQ2xXsaTan1IGIGzU98EGjgEtdSUHCE+xCqi55kZi3TaSOQIUQwEZnUlMATuIDWm4ALBlP6XDYzo/LpYLSEgdWMrpW4o5H9DYFEIG7Dl5H0UmCrTJ5mPxPRB1yHPXXGXfE1E= 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=tyaus1EK; arc=fail smtp.client-ip=40.107.244.69 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="tyaus1EK" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Kxr+rnl3dSRoUFKUnZUYgNgMUKfht/ZR8FVPKki2HauVz/jHeB1DIFtpE7bz2jmJZ/PDbNA5ZKJliIZywjH1BkbbdRDfek2wPTEArsjDNE2KEuZZXC2y05EyVkfgMOpC7zRePy87y3RozXTtzw9kcPguDS8ZTlC8axKbIhfa8nE+LFHqKNRjyYX4pBOqeLCZHhkcQKh4KjvVVCCHtygl301okZa8QzYcjCBryjW1DcgcNVnfkNSWqs4eQb+QXtmW2eEyYW22kq5aLevjdpeJzDxVnYc1PN4VATSTRwWbuLwAiUJj5Vesj0ab/eAW1RN3EAsE6T5R5sXhHwhYWRTVGQ== 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=TNTlSEQluFAONVtWkRGaX1Zd1gL5EwqpO2cwFZRoiCw=; b=OkgNRGGnY72LGK/8zh3ms2MMksk7SlvkkeD6Sscw031J4N+Zm6wCBsXfcemIiZl4e+qJN94aLRvI62SVTgLgjTiQad/Gpcr90BmoE1tcI+HtUA2rSI+oq3noJXgdG2QCsZDKa4u3WkzLWTfH6zIjQTRBRWQaxLGzJbcRXGRmSNac0Y21ITfiU9JnIci1kpi8go7+174RtPiY8P8YE/waVOmUUe9vG94XIUg7swrq4HPF4yRKJehbFYT0yF8kww8nrVFLR+h58BWFIajy20CbHIbx0RJ6kvlu2Zv0Bc69ofFPerqx8VT3Hvop9uky10hnw2pqNdHgjj0WOQimSDwc8A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=TNTlSEQluFAONVtWkRGaX1Zd1gL5EwqpO2cwFZRoiCw=; b=tyaus1EKztwS69MmCr2oxcohv+t7LCe7X8/2HFYtYpWlnsanIlX6d0rfmiHg0LdcktTrDn5QQOtXIRjgi8/0frEkvhqDtHRClpk0rWyc3ojVAO2wdoy3YEFd9mv6nYJsXDqnCjOpOKwC+6MwsywMOVTFOJTwDixygT9D1hYDVkhEuaQnMY4NUb4zlayh/X9gGS6C5IiwpxoxOdyScEqWeG/qSmOpR+zgRF089u/XLrUE5LiaETbJClTgxjI2TUhKKuWBThIGzK0WYRghwVqVT4ouxO8svOfe+CrmA8pUtGB80i9dW4rbnYK2Ev2sxaTZ0+T4xP9IxdSqeS/GT9f0Iw== Received: from CH5PR02CA0011.namprd02.prod.outlook.com (2603:10b6:610:1ed::28) by SJ0PR12MB5673.namprd12.prod.outlook.com (2603:10b6:a03:42b::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8632.22; Fri, 11 Apr 2025 07:51:08 +0000 Received: from CH1PEPF0000A345.namprd04.prod.outlook.com (2603:10b6:610:1ed:cafe::fb) by CH5PR02CA0011.outlook.office365.com (2603:10b6:610:1ed::28) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8632.26 via Frontend Transport; Fri, 11 Apr 2025 07:51:08 +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 CH1PEPF0000A345.mail.protection.outlook.com (10.167.244.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8632.13 via Frontend Transport; Fri, 11 Apr 2025 07:51:08 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.4; Fri, 11 Apr 2025 00:50:55 -0700 Received: from c-237-113-240-247.mtl.labs.mlnx (10.126.231.35) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.14; Fri, 11 Apr 2025 00:50:48 -0700 From: Cosmin Ratiu To: , CC: Hangbin Liu , Jay Vosburgh , Andrew Lunn , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Nikolay Aleksandrov , Simon Horman , Saeed Mahameed , Tariq Toukan , Jianbo Liu , Steffen Klassert , Herbert Xu , Ayush Sawal , Tony Nguyen , "Przemek Kitszel" , Sunil Goutham , Geetha sowjanya , Subbaraya Sundeep , hariprasad , Bharat Bhushan , Louis Peens , "Leon Romanovsky" , Subject: [PATCH net-next v3 6/6] bonding: Fix multiple long standing offload races Date: Fri, 11 Apr 2025 10:49:58 +0300 Message-ID: <20250411074958.2858496-7-cratiu@nvidia.com> X-Mailer: git-send-email 2.45.0 In-Reply-To: <20250411074958.2858496-1-cratiu@nvidia.com> References: <20250411074958.2858496-1-cratiu@nvidia.com> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-ClientProxiedBy: rnnvmail203.nvidia.com (10.129.68.9) To rnnvmail201.nvidia.com (10.129.68.8) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH1PEPF0000A345:EE_|SJ0PR12MB5673:EE_ X-MS-Office365-Filtering-Correlation-Id: 88266203-d39b-4974-aa39-08dd78cd9ea2 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|82310400026|36860700013|1800799024|7416014|376014; X-Microsoft-Antispam-Message-Info: cK6SUg8WG9pyAEjPp4+cC43MsA29sXFZc2K6F0UuUVRIYF4dfL+nAubfzi7jA0Et6H/MaZ+mOTCQMoN2B5pxUH4Td+HeupHAQS1OQIIJQHxzM44vVMpiNhdyjEUK1USCJonSwLrshnvRIVjq1vrHalzDV0uz78DdXpltRAI3OYHd0Awomk0TfFA9NfMI9JoKde32BGBSR5pbDZ8IaxdCXJCqbDishk8GoJqRVt2Tm6S+f/JyNVdRenimzr/MSt4JIjGSJ0EoXdqZAqzk0Vta9xB3NXHdkU+FLb9yUgHggwZKW2dTzLbY8aAqID49uDWsh7gJGKxhPT9yek4oVYj9V6cndwG6ozkquwsY3LkC+iSyatFDN8dYDnR3bwGk9hzw1Q0XCZt3fTRTYIpB3p9Gbpt0K6VeBkBk0/RXN45zAnTuU3cfHRXbqGR0S80CJmjP210wlxY532UbGHhwVgUwCUDS1FdNNLwEaMSDj6dVVdYPkCS5EiEMRIDUqQ9v8E8rkAVZ4F6Hj52I2wjOtModjI8Qjm6VwePCai4WwZvF5UrCdj/Yj8hDo9O6bpjTtZVKUxbjD5guwebD4n4qL9A2MJyDLIoJPsd9x0tRoEtmfkWsZ87CF9tew+/5JkhvuIWKlRuTd1roQkKvNLmB9VdXYYW1KIdmsVO/RWJ6pxa7kWcwOofY5nvqzaCFHHW4ZSpSVdtVT86a0teCelPt+oD7hB1eQF61xFmAqVixMkqkaIEFz2rV3dFeyl3B09b07uvw3xEs+5+Rdjsb4CWZL7RydwVSHbm0tqGi0nq1xh2pmxO820NFE10mQLLi+oxaC9m516XNm7TSvujc49l3MI4oj2FRjUNyUSAc0ETidh0LoYvbysA0vLSpGt/KO+f/xiW5oLhVOE8dub0PokjQUj+jh2SwIzkAhff0lva13lCLi2Ofo3Bldm6bxI5VR2VH9Je/cFmZ8Mxb6dOSvltfHaEt7xkdV5tqFY0afnDa2qH4molIO/br8DEeoRqJZp8wk2lPwypYz69uxkRpob+OwbbqFD+S23x5pKhMOPRkpYLRIxqgp02Lhu7AJWWUMt4XY1ZKU1dBDM5unwuWDlUzl4JPGrEKRnrh3aAAufvCGCVZvtvc1waz75o/QdlZlDSBojg2TD4qqpT7TQ0IpnmxX4/mLoBNeAcgJxwH9cBDMyLcODQ95NkEVcdj8daLQ39/Iyew16jdvVUvnPkibqU9gj/FToadyGOSeocIpeyzBrsjJnh2WhNX30vAlAamBA9xlo6wAArfAqNvxMcd38YhAtv1qg7cxuXL8sYA4kxlvChpHKyF8ScKAZf7SlTuL2YcnQfmF8Hu6x+q0wwqRxY0x5il8qPtXQ9wk9rVm485hgbbRPePmumpNihqJTgBt+8ESPHfrFuiMhIV1wkEVFyA6ApTiuytrVbXRgqRGj3LFNvVTP8z/RX8XrMaPC8X9h9H3vI8paX3ckfoauqcq1QhKJzZ4MAPIucBnk2fW3k6Dp5+Xje02/gAc599kjhHU/snS3Je 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)(36860700013)(1800799024)(7416014)(376014); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Apr 2025 07:51:08.0161 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 88266203-d39b-4974-aa39-08dd78cd9ea2 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: CH1PEPF0000A345.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ0PR12MB5673 Refactor the bonding ipsec offload operations to fix a number of long-standing control plane races between state migration and user deletion and a few other issues. xfrm state deletion can happen concurrently with bond_change_active_slave() operation. This manifests itself as a bond_ipsec_del_sa() call with x->lock held, followed by a bond_ipsec_free_sa() a bit later from a wq. The alternate path of these calls coming from xfrm_dev_state_flush() can't happen, as that needs the RTNL lock and bond_change_active_slave() already holds it. 1. bond_ipsec_del_sa_all() might call xdo_dev_state_delete() a second time on an xfrm state that was concurrently killed. This is bad. 2. bond_ipsec_add_sa_all() can add a state on the new device, but pending bond_ipsec_free_sa() calls from the old device will then hit the WARN_ON() and then, worse, call xdo_dev_state_free() on the new device without a corresponding xdo_dev_state_delete(). 3. Resolve a sleeping in atomic context introduced by the mentioned "Fixes" commit. bond_ipsec_del_sa_all() and bond_ipsec_add_sa_all() now acquire x->lock and check for x->km.state to help with problems 1 and 2. And since xso.real_dev is now a private pointer managed by the bonding driver in xfrm state, make better use of it to fully fix problems 1 and 2. In bond_ipsec_del_sa_all(), set xso.real_dev to NULL while holding both the mutex and x->lock, which makes sure that neither bond_ipsec_del_sa() nor bond_ipsec_free_sa() could run concurrently. Fix problem 3 by moving the list cleanup (which requires the mutex) from bond_ipsec_del_sa() (called from atomic context) to bond_ipsec_free_sa() Finally, simplify bond_ipsec_del_sa() and bond_ipsec_free_sa() by using xso->real_dev directly, since it's now protected by locks and can be trusted to always reflect the offload device. Fixes: 2aeeef906d5a ("bonding: change ipsec_lock from spin lock to mutex") Signed-off-by: Cosmin Ratiu Reviewed-by: Leon Romanovsky --- drivers/net/bonding/bond_main.c | 82 +++++++++++++++------------------ include/net/xfrm.h | 7 ++- 2 files changed, 41 insertions(+), 48 deletions(-) diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 14f7c9712ad4..8ed8c29659a0 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -545,7 +545,20 @@ static void bond_ipsec_add_sa_all(struct bonding *bond) slave_warn(bond_dev, real_dev, "%s: failed to add SA\n", __func__); continue; } + + spin_lock_bh(&ipsec->xs->lock); + /* xs might have been killed by the user during the migration + * to the new dev, but bond_ipsec_del_sa() should have done + * nothing, as xso.real_dev is NULL. + * Delete it from the device we just added it to. The pending + * bond_ipsec_free_sa() call will do the rest of the cleanup. + */ + if (ipsec->xs->km.state == XFRM_STATE_DEAD && + real_dev->xfrmdev_ops->xdo_dev_state_delete) + real_dev->xfrmdev_ops->xdo_dev_state_delete(real_dev, + ipsec->xs); ipsec->xs->xso.real_dev = real_dev; + spin_unlock_bh(&ipsec->xs->lock); } out: mutex_unlock(&bond->ipsec_lock); @@ -560,48 +573,20 @@ static void bond_ipsec_del_sa(struct net_device *bond_dev, struct xfrm_state *xs) { struct net_device *real_dev; - netdevice_tracker tracker; - struct bond_ipsec *ipsec; - struct bonding *bond; - struct slave *slave; - if (!bond_dev) + if (!bond_dev || !xs->xso.real_dev) return; - rcu_read_lock(); - bond = netdev_priv(bond_dev); - slave = rcu_dereference(bond->curr_active_slave); - real_dev = slave ? slave->dev : NULL; - netdev_hold(real_dev, &tracker, GFP_ATOMIC); - rcu_read_unlock(); - - if (!slave) - goto out; - - if (!xs->xso.real_dev) - goto out; - - WARN_ON(xs->xso.real_dev != real_dev); + real_dev = xs->xso.real_dev; if (!real_dev->xfrmdev_ops || !real_dev->xfrmdev_ops->xdo_dev_state_delete || netif_is_bond_master(real_dev)) { slave_warn(bond_dev, real_dev, "%s: no slave xdo_dev_state_delete\n", __func__); - goto out; + return; } real_dev->xfrmdev_ops->xdo_dev_state_delete(real_dev, xs); -out: - netdev_put(real_dev, &tracker); - mutex_lock(&bond->ipsec_lock); - list_for_each_entry(ipsec, &bond->ipsec_list, list) { - if (ipsec->xs == xs) { - list_del(&ipsec->list); - kfree(ipsec); - break; - } - } - mutex_unlock(&bond->ipsec_lock); } static void bond_ipsec_del_sa_all(struct bonding *bond) @@ -629,9 +614,15 @@ static void bond_ipsec_del_sa_all(struct bonding *bond) __func__); continue; } + + spin_lock_bh(&ipsec->xs->lock); ipsec->xs->xso.real_dev = NULL; - real_dev->xfrmdev_ops->xdo_dev_state_delete(real_dev, - ipsec->xs); + /* Don't double delete states killed by the user. */ + if (ipsec->xs->km.state != XFRM_STATE_DEAD) + real_dev->xfrmdev_ops->xdo_dev_state_delete(real_dev, + ipsec->xs); + spin_unlock_bh(&ipsec->xs->lock); + if (real_dev->xfrmdev_ops->xdo_dev_state_free) real_dev->xfrmdev_ops->xdo_dev_state_free(real_dev, ipsec->xs); @@ -643,34 +634,33 @@ static void bond_ipsec_free_sa(struct net_device *bond_dev, struct xfrm_state *xs) { struct net_device *real_dev; - netdevice_tracker tracker; + struct bond_ipsec *ipsec; struct bonding *bond; - struct slave *slave; if (!bond_dev) return; - rcu_read_lock(); bond = netdev_priv(bond_dev); - slave = rcu_dereference(bond->curr_active_slave); - real_dev = slave ? slave->dev : NULL; - netdev_hold(real_dev, &tracker, GFP_ATOMIC); - rcu_read_unlock(); - - if (!slave) - goto out; + mutex_lock(&bond->ipsec_lock); if (!xs->xso.real_dev) goto out; - WARN_ON(xs->xso.real_dev != real_dev); + real_dev = xs->xso.real_dev; xs->xso.real_dev = NULL; - if (real_dev && real_dev->xfrmdev_ops && + if (real_dev->xfrmdev_ops && real_dev->xfrmdev_ops->xdo_dev_state_free) real_dev->xfrmdev_ops->xdo_dev_state_free(real_dev, xs); out: - netdev_put(real_dev, &tracker); + list_for_each_entry(ipsec, &bond->ipsec_list, list) { + if (ipsec->xs == xs) { + list_del(&ipsec->list); + kfree(ipsec); + break; + } + } + mutex_unlock(&bond->ipsec_lock); } /** diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 3d2f6c879311..b7e8f3f49627 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h @@ -154,8 +154,11 @@ struct xfrm_dev_offload { */ struct net_device *dev; netdevice_tracker dev_tracker; - /* This is a private pointer used by the bonding driver. - * Device drivers should not use it. + /* This is a private pointer used by the bonding driver (and eventually + * should be moved there). Device drivers should not use it. + * Protected by xfrm_state.lock AND bond.ipsec_lock in most cases, + * except in the .xdo_dev_state_del() flow, where only xfrm_state.lock + * is held. */ struct net_device *real_dev; unsigned long offload_handle;