From nobody Tue Apr 7 13:00:54 2026 Received: from mail-pj1-f53.google.com (mail-pj1-f53.google.com [209.85.216.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CF4D72C3257 for ; Fri, 13 Mar 2026 03:03:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773371041; cv=none; b=lT+w9HdFGcj1waI2u9aQXFLSNsPo3/EYDXcVktJuGP1MIRkaVxRo4txLy7KRbD9wVcB1ibHMkGtKjeXkhw9BkoE9toyVCizaJJFAwD5gr40CZMuF3u1iHx4lEjJl1E4dcxaheeA+6e2Kh1u14ZNk0ws5VhYgH6H9fPE7HN+J81w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773371041; c=relaxed/simple; bh=G4W6YNhY1DK0N/jD/Bs+737si/SON3wre12H8bnq7/w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=sTj1b7b7pgZB6DQHU0kJmffC04TXHq3osNM71mytpBOA8POKTCB7JHwLnN83A441WVO4zo65Pj1/M44iAGqV9bkbcOyAdfs+DnMV0e/Ba9O46xcWOnC/cYusZL4ZaJnERQU20g0nMxpC0SWmQCHV9Hq0PZ63qz+nxEFiUNFYM+w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=mi1UIez1; arc=none smtp.client-ip=209.85.216.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="mi1UIez1" Received: by mail-pj1-f53.google.com with SMTP id 98e67ed59e1d1-358e3cc5e7eso940344a91.0 for ; Thu, 12 Mar 2026 20:03:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773371039; x=1773975839; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=qBeXDORWZ/mDBhe03hVB52ezLWB2XO1J0L+2w863tec=; b=mi1UIez1OOgw+Am+wYGD8FX1HXjsYFCISq/mPs5FmYgBb5pDDDo5wzBny7MgAnsDu9 QzFi/fRUFTm9GESi7Pp9JvFeAQTlSA5/wOFh0JorQ918lpy/00JZ3yUltDM3oEDsuRky K1E31Gq68sSJAQ2CjL+KAUSPShqkXZprAu/S0FF4+RCMLRNsImRxucGT9R6R6Ws27klI brhKvQXleFwQvFvi/RSX7mXgD7bLjLJ/7eYqUc6CC8TbRSXYqLVTyQwTNOqdekAiLxe3 UPS+R+kXItn4aiJg6o1EQNWjupCxENetMexuDhOXwmY+XfDKXEBY4r4vwUs0dSMI86/Y CWlg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773371039; x=1773975839; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=qBeXDORWZ/mDBhe03hVB52ezLWB2XO1J0L+2w863tec=; b=OJHC3EkpC1P6m/2jA/dYRW0Ghrr/damOMA0Pz6MVdrn7yMXN6dBAprW2DxCUBIaYAk oqqqOF6xMaDQDDyZ3xniXxxKU3Sz0XQEuTIuCQStRufh8b3weS3CIzPbS307FBOQ0oHn GMyloV0VIetqz2lX4bVcFU1ZfmTil7hiPGm5yRHULCL/yXjmm1h65X7oP+g2hRbA2Nr6 va+HAUfga5rjTGB48w4BncN25pq4m+XMBKyK40DSs1IovhWpz1ecy/nDo4dt9frz0p4h XQCGWlRl71xsY4Nf2ucJUd0jOoTRtis2p/70oI4jLfhuHB27e/MrFIqVpzZ3OJ7lfKuS ZEXA== X-Forwarded-Encrypted: i=1; AJvYcCW1+3Eb23xDFVjwlHktX2Ltp7jGkIA3JDTjqrmeCJr3Ix2Vy7GMdUPcZ4AsAoB0RVI4jtLRP/6ZNq9zI10=@vger.kernel.org X-Gm-Message-State: AOJu0YxVLk11wNX4Ld2crYBTjIPstvcCWhvSeYoo1T8UTdhnNth1SMhZ NOIHE1bELX90RROzh40UzItTAE5U4kmpaZTK+2LU47eAI/z8MW2zX0pH X-Gm-Gg: ATEYQzzXWD45H1qO9jppu5ZSPO7kWl4pm7t20Ngle5nFrvN/al2K0qp7QBehYB6ZwxW +6LvY2DbiNyQzYdPzmhskRvqIq5QM3cy4YgCxeBa+6y8mCh8pNNdTwuituRKoTo8txQicGifqSf y5XXVVE2IkHh14DSqlJ3DakFy9sORgin/1Wk1FD+AfdnWRPN2g8qWg7ib4vymCBxn9owpTaluKG TTKUGjGKKlHvClVo97u6+Ljq/Pdrpsdlpk+cyqKaTKbn38XX0iyGBLo13DTLa4pfATL94JPfNLJ 566zflQtay2pTOVda0sWP8ObB0pbxnh0JZC2ZcvgYu0Ot3Y4eLpSOKPn7wYPrkSXGFhn8gdx97X Xg0jj+7b/FdCDYHwCNEavGT6Rwid0pwGbUucw8lqqW0/ocr4wdorvXViBRCAqSldClQm8GFnleI EVHWG2PXaPxjvS1gcXRm72i13FPkkyb1SW0HC7TaO4Mr1VR+0Q7e7XYuTGkS4xtRLCTv+Fsm1TY +zMMREpNDzUtR2yMnhnyYIDDm56dojptRy0Bvy0LtJBPkCLoup3NOrHcK5zGL4= X-Received: by 2002:a17:90b:2783:b0:359:3088:6ab1 with SMTP id 98e67ed59e1d1-35a21e1ca4fmr1607854a91.1.1773371039000; Thu, 12 Mar 2026 20:03:59 -0700 (PDT) Received: from 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa ([240e:34c:5765:adb0:54b3:92b9:a11b:1cae]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35a24a7dc1csm293967a91.1.2026.03.12.20.03.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Mar 2026 20:03:58 -0700 (PDT) From: Hangbin Liu Date: Fri, 13 Mar 2026 11:03:09 +0800 Subject: [PATCH net-next v2 1/4] net: use ndo_set_features to set offload features for bonding/bridge/team Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260313-offload_compute-v2-1-ffbc8ce5d50c@gmail.com> References: <20260313-offload_compute-v2-0-ffbc8ce5d50c@gmail.com> In-Reply-To: <20260313-offload_compute-v2-0-ffbc8ce5d50c@gmail.com> To: Jay Vosburgh , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Jiri Pirko , Nikolay Aleksandrov , Ido Schimmel , Simon Horman , Sabrina Dubroca , Sridhar Samudrala Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, bridge@lists.linux.dev, Hangbin Liu X-Mailer: b4 0.14.3 Convert bonding, bridge, and team drivers to use ndo_set_features callback instead of manually calling netdev_compute_master_upper_features() during port add/remove operations. This change centralizes the feature computation flow: Before: - netdev_master_upper_dev_link() - netdev_compute_master_upper_features() <- called manually - compute offload features - netdev_change_features() - __netdev_update_features() - update other features After: - netdev_master_upper_dev_link() - __netdev_upper_dev_link() - netdev_change_features() - __netdev_update_features() - ndo_set_features() - netdev_compute_master_upper_features() This ensures offload features are computed automatically when upper/lower device links change, removing the need for manual feature computation calls in the driver code. The netdev_change_features() call in team_uninit() is also removed since it calls team_port_del() for each port, which now triggers feature updates automatically. Signed-off-by: Hangbin Liu --- drivers/net/bonding/bond_main.c | 11 ++++++++--- drivers/net/team/team_core.c | 12 ++++++++---- net/bridge/br_device.c | 7 +++++++ net/bridge/br_if.c | 4 ---- net/core/dev.c | 8 ++++++-- 5 files changed, 29 insertions(+), 13 deletions(-) diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_mai= n.c index 90b71bd53040..2c84d3ce3b04 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -1509,6 +1509,12 @@ static netdev_features_t bond_fix_features(struct ne= t_device *dev, return features; } =20 +static int bond_set_features(struct net_device *dev, netdev_features_t fea= tures) +{ + netdev_compute_master_upper_features(dev, true); + return 0; +} + static int bond_header_create(struct sk_buff *skb, struct net_device *bond= _dev, unsigned short type, const void *daddr, const void *saddr, unsigned int len) @@ -2273,7 +2279,6 @@ int bond_enslave(struct net_device *bond_dev, struct = net_device *slave_dev, } =20 bond->slave_cnt++; - netdev_compute_master_upper_features(bond->dev, true); bond_set_carrier(bond); =20 /* Needs to be called before bond_select_active_slave(), which will @@ -2528,7 +2533,6 @@ static int __bond_release_one(struct net_device *bond= _dev, call_netdevice_notifiers(NETDEV_RELEASE, bond->dev); } =20 - netdev_compute_master_upper_features(bond->dev, true); if (!(bond_dev->features & NETIF_F_VLAN_CHALLENGED) && (old_features & NETIF_F_VLAN_CHALLENGED)) slave_info(bond_dev, slave_dev, "last VLAN challenged slave left bond - = VLAN blocking is removed\n"); @@ -4026,7 +4030,7 @@ static int bond_slave_netdev_event(unsigned long even= t, case NETDEV_FEAT_CHANGE: if (!bond->notifier_ctx) { bond->notifier_ctx =3D true; - netdev_compute_master_upper_features(bond->dev, true); + netdev_change_features(bond->dev); bond->notifier_ctx =3D false; } break; @@ -5953,6 +5957,7 @@ static const struct net_device_ops bond_netdev_ops = =3D { .ndo_add_slave =3D bond_enslave, .ndo_del_slave =3D bond_release, .ndo_fix_features =3D bond_fix_features, + .ndo_set_features =3D bond_set_features, .ndo_features_check =3D passthru_features_check, .ndo_get_xmit_slave =3D bond_xmit_get_slave, .ndo_sk_get_lower_dev =3D bond_sk_get_lower_dev, diff --git a/drivers/net/team/team_core.c b/drivers/net/team/team_core.c index b7282f5c9632..4906ea3717b1 100644 --- a/drivers/net/team/team_core.c +++ b/drivers/net/team/team_core.c @@ -1247,7 +1247,6 @@ static int team_port_add(struct team *team, struct ne= t_device *port_dev, port->index =3D -1; list_add_tail_rcu(&port->list, &team->port_list); team_port_enable(team, port); - netdev_compute_master_upper_features(team->dev, true); __team_port_change_port_added(port, !!netif_oper_up(port_dev)); __team_options_change_check(team); =20 @@ -1337,7 +1336,6 @@ static int team_port_del(struct team *team, struct ne= t_device *port_dev, bool un } kfree_rcu(port, rcu); netdev_info(dev, "Port device %s removed\n", portname); - netdev_compute_master_upper_features(team->dev, true); =20 return 0; } @@ -1645,7 +1643,6 @@ static void team_uninit(struct net_device *dev) team_mcast_rejoin_fini(team); team_notify_peers_fini(team); team_queue_override_fini(team); - netdev_change_features(dev); } =20 static void team_destructor(struct net_device *dev) @@ -1972,6 +1969,12 @@ static netdev_features_t team_fix_features(struct ne= t_device *dev, return features; } =20 +static int team_set_features(struct net_device *dev, netdev_features_t fea= tures) +{ + netdev_compute_master_upper_features(dev, true); + return 0; +} + static int team_change_carrier(struct net_device *dev, bool new_carrier) { struct team *team =3D netdev_priv(dev); @@ -2007,6 +2010,7 @@ static const struct net_device_ops team_netdev_ops = =3D { .ndo_add_slave =3D team_add_slave, .ndo_del_slave =3D team_del_slave, .ndo_fix_features =3D team_fix_features, + .ndo_set_features =3D team_set_features, .ndo_change_carrier =3D team_change_carrier, .ndo_features_check =3D passthru_features_check, }; @@ -2944,7 +2948,7 @@ static int team_device_event(struct notifier_block *u= nused, case NETDEV_FEAT_CHANGE: if (!port->team->notifier_ctx) { port->team->notifier_ctx =3D true; - netdev_compute_master_upper_features(port->team->dev, true); + netdev_change_features(port->team->dev); port->team->notifier_ctx =3D false; } break; diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c index f7502e62dd35..f82082050e36 100644 --- a/net/bridge/br_device.c +++ b/net/bridge/br_device.c @@ -289,6 +289,12 @@ static netdev_features_t br_fix_features(struct net_de= vice *dev, return br_features_recompute(br, features); } =20 +static int br_set_features(struct net_device *dev, netdev_features_t featu= res) +{ + netdev_compute_master_upper_features(dev, false); + return 0; +} + #ifdef CONFIG_NET_POLL_CONTROLLER static void br_poll_controller(struct net_device *br_dev) { @@ -456,6 +462,7 @@ static const struct net_device_ops br_netdev_ops =3D { .ndo_add_slave =3D br_add_slave, .ndo_del_slave =3D br_del_slave, .ndo_fix_features =3D br_fix_features, + .ndo_set_features =3D br_set_features, .ndo_fdb_add =3D br_fdb_add, .ndo_fdb_del =3D br_fdb_delete, .ndo_fdb_del_bulk =3D br_fdb_delete_bulk, diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c index d39571e13744..030248bc94c5 100644 --- a/net/bridge/br_if.c +++ b/net/bridge/br_if.c @@ -680,8 +680,6 @@ int br_add_if(struct net_bridge *br, struct net_device = *dev, =20 br_mtu_auto_adjust(br); =20 - netdev_compute_master_upper_features(br->dev, false); - kobject_uevent(&p->kobj, KOBJ_ADD); =20 return 0; @@ -734,8 +732,6 @@ int br_del_if(struct net_bridge *br, struct net_device = *dev) if (changed_addr) call_netdevice_notifiers(NETDEV_CHANGEADDR, br->dev); =20 - netdev_compute_master_upper_features(br->dev, false); - return 0; } =20 diff --git a/net/core/dev.c b/net/core/dev.c index f48dc299e4b2..16b3fc620807 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -8920,6 +8920,9 @@ static int __netdev_upper_dev_link(struct net_device = *dev, __netdev_walk_all_upper_dev(upper_dev, __netdev_update_lower_level, priv); =20 + /* re-compute all features after adding link */ + netdev_change_features(upper_dev); + return 0; =20 rollback: @@ -9012,6 +9015,9 @@ static void __netdev_upper_dev_unlink(struct net_devi= ce *dev, __netdev_update_lower_level(upper_dev, priv); __netdev_walk_all_upper_dev(upper_dev, __netdev_update_lower_level, priv); + + /* re-compute all features after removing link */ + netdev_change_features(upper_dev); } =20 /** @@ -12874,8 +12880,6 @@ void netdev_compute_master_upper_features(struct ne= t_device *dev, bool update_he =20 netif_set_tso_max_segs(dev, tso_max_segs); netif_set_tso_max_size(dev, tso_max_size); - - netdev_change_features(dev); } EXPORT_SYMBOL(netdev_compute_master_upper_features); =20 --=20 Git-155) From nobody Tue Apr 7 13:00:54 2026 Received: from mail-pj1-f51.google.com (mail-pj1-f51.google.com [209.85.216.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8322520468E for ; Fri, 13 Mar 2026 03:04:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773371052; cv=none; b=trP2kOLM6L3cqyfT+lkbmebeMos5hq25kT76igt0XFBgsIeJI4/WcnxUx2OvsX1IB2az/ppZqPyOmXcXE/+kuC1Xslkq2F5PXgS/0sMc3NJKtJGtgTpcMg8wXy5AAHkobJSDtWVO86/Yh0bmkDmJDXmtuQT/E9VgXOeKzIlRkKg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773371052; c=relaxed/simple; bh=pbtKIDznCvGEVtQHODrKsx+vVNFY8ZkNIx/vZ7lzIsQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rqN+YFNDAi3tE1k9N5ECSDLl+DXOdieV1Q1Fcm7M7U54frAqEW/xKrcnULJbptkUr7XN69oQg5vohtWyNFWBYrz2sxdSv5HOuYZ5ZixcH671rRNuResZ7jtLA++tFtleZX7HPzDFajJsXQ6YMTt9FYZ/UgKHdZkRMmcA16DvCg8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=CUF6SP+n; arc=none smtp.client-ip=209.85.216.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="CUF6SP+n" Received: by mail-pj1-f51.google.com with SMTP id 98e67ed59e1d1-3567e2b4159so866464a91.0 for ; Thu, 12 Mar 2026 20:04:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773371051; x=1773975851; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=JPGq7YNOGl3DkR8NTBoIGDJAXGD2GV5oTegfoP6i0Xk=; b=CUF6SP+nfvm8EGykUo+yEDyeYPu231983gEVErsdnljr4Uh8U1n71xl5duKcS2Q4/a O+c3zpoaLPFsbSw2jBkHT3ftoUFS4QfgaHsSTS9+5wRVl9G/qyoSuXpYKdl7MEQGe2gE UUbF6qnuCtlYiKwQty5J0AmgYDHc2o8rAqErUNJpBl4lW073H5mNKom04GOmHPH0ERNA bswAzMfRLxi+skeU98p/uks4TeiLXzNMlc6kXDliluweXrEYWnsm54ZB2swTdfCq7txc maSPWkrKYypLkbraokqeTQcM9/11cXTmK/g2pxlWPsnXrOnHIeSKY7eEQR+9R1oXobpY dv0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773371051; x=1773975851; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=JPGq7YNOGl3DkR8NTBoIGDJAXGD2GV5oTegfoP6i0Xk=; b=F/fKHfz+NCJdVVHTsWrLV773jXysWRaaikITw24SlRBTbpZqcktELLJ071/0wi/rxp Ok4MkjGw+09cYTkcuDUAx6qHhF4f7citcnpt0vXtu42F2Py+nvHDTJ2Jz2r6GwDYtGme MWyWVcso4I6qb+J0CgPBuXWJpwplQw+MMwqkbyZcQoCgqHLbHLuoDlA0DZah8z83Ft4w u5xG8YoAmgxSgc8twe/i4mX8m44A3HBe0cEs/L+DmXdDUsp/m3hQEDPANHJMu5LK+vnF 8EvM4dr5NnS3j9zJX+KtxDLub7vbsNzqMcZjzjRJXTfFP4dyTGgg5RZLiqB0hH1fXTiA VfTg== X-Forwarded-Encrypted: i=1; AJvYcCVRsZIaL0GIOUSZrxeKAt9yI33+YOpuZy4v3hiEk38EAfghx+Tjmpco/0fenASjSmQOnY/61Gg53woHlFg=@vger.kernel.org X-Gm-Message-State: AOJu0Yy8uKNxUiyHFluXVNoCtyyivcZGVSLf9RJVrc3rk/G+s1VeEboC +kMHNFKUhTooXT+eQCDoQZEzb+pKuSulzhBkmqaRolTdqk3WVkoXY9Rx X-Gm-Gg: ATEYQzwnUfXDdXdjQyGdF6HYuuhLlkTcUatWsUlzpEKASspYtvBWBDSEkgDgl5RaVGr ZZJBS23pSrmFSF4IEoNVe7oUVJyl5C9tEh81hnKexdNlXiKSOWh69HQ48wyQ1ztr9M3fzKsoqtL kYfqksPBFxWIxj19wRTYDwWb8GiXUHGquEKnglkir5VunrZ18dVwegoRJHdsI9vFsYcggz0PEEs Q7JMJ/yzBorB02UgNcNtKIpiHYPSAT4ZA9HVvzNvoSmEPRsndQNXenxzTQraM0LUSvbPLPeHIkY mFKccdRzVvjPy6EnWZMhzfN4pdT2OesYUf2vn3YGqk0JZowwmqG2How3ZHSFGTT0lp4I6atCMqy 7MJcYi4MFKkM5F5UED3wNxBaKD1DLd9wuq3Ij/L1bBNmz/+Y8HERkvoruWaeBDLKniGeAR4MO/W BPEwsA7+giMgdGWRTfVUssjNHQW4Qvirf+TvZkqz+32Reu+d3NPh4rfR+b/jpLW+XDo4gprQRdy yhlJosZTcAvpZ611Fr2ValrfjlwS88nzAPewFDllecC7Fe+YDFMJLWkk2UOFaU= X-Received: by 2002:a17:90b:3b41:b0:35a:3e2:7cbb with SMTP id 98e67ed59e1d1-35a220558b3mr1403433a91.29.1773371050802; Thu, 12 Mar 2026 20:04:10 -0700 (PDT) Received: from 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa ([240e:34c:5765:adb0:54b3:92b9:a11b:1cae]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35a24a7dc1csm293967a91.1.2026.03.12.20.03.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Mar 2026 20:04:10 -0700 (PDT) From: Hangbin Liu Date: Fri, 13 Mar 2026 11:03:10 +0800 Subject: [PATCH net-next v2 2/4] macsec: move netdev_upper_dev_link() after macsec_changelink_common() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260313-offload_compute-v2-2-ffbc8ce5d50c@gmail.com> References: <20260313-offload_compute-v2-0-ffbc8ce5d50c@gmail.com> In-Reply-To: <20260313-offload_compute-v2-0-ffbc8ce5d50c@gmail.com> To: Jay Vosburgh , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Jiri Pirko , Nikolay Aleksandrov , Ido Schimmel , Simon Horman , Sabrina Dubroca , Sridhar Samudrala Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, bridge@lists.linux.dev, Hangbin Liu X-Mailer: b4 0.14.3 After calling netdev_change_features() in __netdev_upper_dev_link(), the call stack looks like: - netdev_upper_dev_link - __netdev_upper_dev_link - netdev_change_features - notifier_call_chain - rtnetlink_event - rtmsg_ifinfo_event - rtmsg_ifinfo_build_skb In macsec, we call netdev_upper_dev_link() before macsec_changelink_common(), which causes the fields of the MACsec Security Entity to be uninitialized. Later, macsec_fill_info() returns -EMSGSIZE and triggers WARN_ON() in rtmsg_ifinfo_build_skb. Fix this by moving netdev_upper_dev_link() after macsec_changelink_common(), and return 0 if secy->key_len is not initialized yet. Suggested-by: Sabrina Dubroca Signed-off-by: Hangbin Liu --- drivers/net/macsec.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c index f6cad0746a02..6bb38084bc1e 100644 --- a/drivers/net/macsec.c +++ b/drivers/net/macsec.c @@ -4161,10 +4161,6 @@ static int macsec_newlink(struct net_device *dev, lockdep_set_class(&dev->addr_list_lock, &macsec_netdev_addr_lock_key); =20 - err =3D netdev_upper_dev_link(real_dev, dev, extack); - if (err < 0) - goto unregister; - /* need to be already registered so that ->init has run and * the MAC addr is set */ @@ -4177,12 +4173,12 @@ static int macsec_newlink(struct net_device *dev, =20 if (rx_handler && sci_exists(real_dev, sci)) { err =3D -EBUSY; - goto unlink; + goto unregister; } =20 err =3D macsec_add_dev(dev, sci, icv_len); if (err) - goto unlink; + goto unregister; =20 if (data) { err =3D macsec_changelink_common(dev, data); @@ -4190,6 +4186,10 @@ static int macsec_newlink(struct net_device *dev, goto del_dev; } =20 + err =3D netdev_upper_dev_link(real_dev, dev, extack); + if (err < 0) + goto del_dev; + /* If h/w offloading is available, propagate to the device */ if (macsec_is_offloaded(macsec)) { const struct macsec_ops *ops; @@ -4200,7 +4200,7 @@ static int macsec_newlink(struct net_device *dev, ctx.secy =3D &macsec->secy; err =3D macsec_offload(ops->mdo_add_secy, &ctx); if (err) - goto del_dev; + goto unlink; =20 macsec->insert_tx_tag =3D macsec_needs_tx_tag(macsec, ops); @@ -4209,7 +4209,7 @@ static int macsec_newlink(struct net_device *dev, =20 err =3D register_macsec_dev(real_dev, dev); if (err < 0) - goto del_dev; + goto unlink; =20 netdev_update_features(dev); netif_stacked_transfer_operstate(real_dev, dev); @@ -4219,10 +4219,10 @@ static int macsec_newlink(struct net_device *dev, =20 return 0; =20 -del_dev: - macsec_del_dev(macsec); unlink: netdev_upper_dev_unlink(real_dev, dev); +del_dev: + macsec_del_dev(macsec); unregister: unregister_netdevice(dev); return err; @@ -4337,7 +4337,8 @@ static int macsec_fill_info(struct sk_buff *skb, csid =3D secy->xpn ? MACSEC_CIPHER_ID_GCM_AES_XPN_256 : MACSEC_CIPHER_ID= _GCM_AES_256; break; default: - goto nla_put_failure; + WARN_ON_ONCE(1); + return 0; } =20 if (nla_put_sci(skb, IFLA_MACSEC_SCI, secy->sci, --=20 Git-155) From nobody Tue Apr 7 13:00:54 2026 Received: from mail-pj1-f43.google.com (mail-pj1-f43.google.com [209.85.216.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 220183093BB for ; Fri, 13 Mar 2026 03:04:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773371067; cv=none; b=QWt7ndkuSVAUDFcPxa/ykHITmR11P/UWRqHV6sBrVNFYG6sBQBmgZCZGh73cuDS3sOHwFbWR+0rzTtV5/Bj/7h5a4U7fBENMOFaDnawTwADgdwKg+TGASeFK021IzfJOLMWLZoafYAaitLKzTOBWy+pm8stowcNFR4ghfGPkFLw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773371067; c=relaxed/simple; bh=ckIN5ASkuNOY9pUfpsVNZbSyJ16scvuiSr26ig8bsBM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mUYeyTeoKBet2AMjUXXLpCvw13A7oomtVwhc7CZyp2JPWYfAI6gXBD+F+NEFCTuzxF7CR8IVwu4427jEIFJHPyDKa0qU6R6OC+CP6migHq4aSyp9liKRZPyfJvsSunshfC0/hwHF+wGpIfXlPdS5pTaonLiVGrUjdGJgBWx4zK4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=AmkT2iYG; arc=none smtp.client-ip=209.85.216.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="AmkT2iYG" Received: by mail-pj1-f43.google.com with SMTP id 98e67ed59e1d1-35a0b413684so1107770a91.3 for ; Thu, 12 Mar 2026 20:04:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773371065; x=1773975865; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=djyy+9DJ7NGUH5/yQnciZZwbkw5XEWCb6BieiKG0OKc=; b=AmkT2iYGVOTdJsjOhe/Uun46/BXfvZurHOtGouq/h1/+WZjdtUOo4SQyKWXUfG9nsk htMJXmXTwHfGhQzGD8ZeOlp3BrrWnpnngT+6+jbsaUV94K+AQSjT+iEr1kMDQz3jo7yy cOZROTRaQZHRc3wp1ScueGHR7slOCScWjpb1FbUqYy62tB+KMdzQ0flK4uRtrt6F5MwO jZ0GkVFjSYyt+/AEC7IMPIbnfU8kvT1UEjGb0ZvZSZakUN7w6CcA+jfxgCtO1BeZ4Zk7 3TRnJ5sODjSw12gxcnz6s7WJG6PGKgn3iEGzSxT1lGzB++mMdDpigwrnowUVCVWTeJem KsJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773371065; x=1773975865; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=djyy+9DJ7NGUH5/yQnciZZwbkw5XEWCb6BieiKG0OKc=; b=ISh57sq8ZMwpcEQ8HQsdr1QDn3WNDrN5BRKctY1V7v1645QF4K9JnfQhM30L/1ba2V ZtWz9PwmUCP8GTzdw1HR8gs9z7QXWGEZrksR7yJbHBbBnQU7cITrjQe2STTsbzd7bXvn JyWsasVXVKYNZ5fRG126JN3Z9clXjlskWvHqqkfW76kv+yAohvJUDLDbTaCF92H9g/iZ fwHj0nkOnQjxB3+RbWzr+Kmu5RjWm1SabJSt4Wt0WUtw6kjXqwMtxXrTfd8MjUbno9Fh phEKCmnGYT6MYuR46gmj5fS+Cz9Lv4uWIotucmMw7gno0cUgwW1G9nwKxOKUwkWu3D8s bfHw== X-Forwarded-Encrypted: i=1; AJvYcCXojwog+IPQyJeK7YWwfptR2eoAa+4g4o8I2CfAnw2tfCT92jrmuVDVJ83pBCi2UZy7RPOqG0+JZXhQb5w=@vger.kernel.org X-Gm-Message-State: AOJu0YxiRMPo3Vkwjxq/wOHJx7LO12quhq7gp4e5ak/HgVrRKNMkVzCp IiU/c2v6ChUem0kHalcPQcWDrcv5p8xm2W60z+hrCKmFx5S+UZDxjH7O X-Gm-Gg: ATEYQzwhtvYZ9X+KgUughpBYikpE148446Y5YHFZPu3EzpvtcNrTwJVxd0GvuaNis+a QR//hWIbBpH+rysgfrEWufqrQO+rjjsNYjBkqnv06tVCh9AL20YBbF6iVCXzK8oEsD0CAvvvu06 58KmlQ6lHAnv4BsDVBVIphxxD72tINUCxtYxQyoLfyOXkf1+gJGmX7W03/d2QTraXRFE6e2yHlN AplaTEp+Jcfbf0eH6Qq6UHDm5gqKAYkJ3nUdG0sCNDGnodfQFGjP8amt4QRiaNLUVGdRhX7Klv8 oN4vfimEO4W0aYvYDLfTh+el4gw7z1IZfOxLcUkp9/v+F5ciH9BOchF/zGM6xudhaLDLG/waf1i Uo6NlG3UyM0EXedPac/eD/MSDc3uJ9MQFx9jlJgRkxY/ytI+ZqsXfxUpzknPvb28NaN0OrwR3+E jTfsie1PV/HlfOkKLkLU4v25FzsMD9FXCUE7/HcWgyhTH8r7XwfXcOjNPEeOBFemOWdEJVMKRF6 fjATdbkQH+WtSLXzEscavpjE5B35KUpX9d8+qeQoKxVIIW3ePem X-Received: by 2002:a17:90b:4cc4:b0:359:9885:3bb7 with SMTP id 98e67ed59e1d1-35a220aab7bmr1375535a91.32.1773371065498; Thu, 12 Mar 2026 20:04:25 -0700 (PDT) Received: from 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa ([240e:34c:5765:adb0:54b3:92b9:a11b:1cae]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35a24a7dc1csm293967a91.1.2026.03.12.20.04.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Mar 2026 20:04:24 -0700 (PDT) From: Hangbin Liu Date: Fri, 13 Mar 2026 11:03:11 +0800 Subject: [PATCH net-next v2 3/4] failover: use ndo_set_features for failover offload compute Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260313-offload_compute-v2-3-ffbc8ce5d50c@gmail.com> References: <20260313-offload_compute-v2-0-ffbc8ce5d50c@gmail.com> In-Reply-To: <20260313-offload_compute-v2-0-ffbc8ce5d50c@gmail.com> To: Jay Vosburgh , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Jiri Pirko , Nikolay Aleksandrov , Ido Schimmel , Simon Horman , Sabrina Dubroca , Sridhar Samudrala Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, bridge@lists.linux.dev, Hangbin Liu X-Mailer: b4 0.14.3 Convert net_failover to use the ndo_set_features callback and calls netdev_compute_master_upper_features() to compute new offload flags during slave registration/unregistration. This simplifies the failover code significantly by removing the custom feature computation logic and relying on the centralized feature update mechanism. The callback is automatically invoked during feature updates when upper/lower device links change. Signed-off-by: Hangbin Liu --- drivers/net/net_failover.c | 67 ++++++------------------------------------= ---- include/net/net_failover.h | 7 ----- 2 files changed, 8 insertions(+), 66 deletions(-) diff --git a/drivers/net/net_failover.c b/drivers/net/net_failover.c index d0361aaf25ef..10041a271bf5 100644 --- a/drivers/net/net_failover.c +++ b/drivers/net/net_failover.c @@ -300,6 +300,12 @@ static int net_failover_vlan_rx_kill_vid(struct net_de= vice *dev, __be16 proto, return 0; } =20 +static int net_failover_set_features(struct net_device *dev, netdev_featur= es_t features) +{ + netdev_compute_master_upper_features(dev, true); + return 0; +} + static const struct net_device_ops failover_dev_ops =3D { .ndo_open =3D net_failover_open, .ndo_stop =3D net_failover_close, @@ -312,6 +318,7 @@ static const struct net_device_ops failover_dev_ops =3D= { .ndo_vlan_rx_kill_vid =3D net_failover_vlan_rx_kill_vid, .ndo_validate_addr =3D eth_validate_addr, .ndo_features_check =3D passthru_features_check, + .ndo_set_features =3D net_failover_set_features, }; =20 #define FAILOVER_NAME "net_failover" @@ -373,61 +380,6 @@ static rx_handler_result_t net_failover_handle_frame(s= truct sk_buff **pskb) return RX_HANDLER_ANOTHER; } =20 -static void net_failover_compute_features(struct net_device *dev) -{ - netdev_features_t vlan_features =3D FAILOVER_VLAN_FEATURES & - NETIF_F_ALL_FOR_ALL; - netdev_features_t enc_features =3D FAILOVER_ENC_FEATURES; - unsigned short max_hard_header_len =3D ETH_HLEN; - unsigned int dst_release_flag =3D IFF_XMIT_DST_RELEASE | - IFF_XMIT_DST_RELEASE_PERM; - struct net_failover_info *nfo_info =3D netdev_priv(dev); - struct net_device *primary_dev, *standby_dev; - - primary_dev =3D rcu_dereference(nfo_info->primary_dev); - if (primary_dev) { - vlan_features =3D - netdev_increment_features(vlan_features, - primary_dev->vlan_features, - FAILOVER_VLAN_FEATURES); - enc_features =3D - netdev_increment_features(enc_features, - primary_dev->hw_enc_features, - FAILOVER_ENC_FEATURES); - - dst_release_flag &=3D primary_dev->priv_flags; - if (primary_dev->hard_header_len > max_hard_header_len) - max_hard_header_len =3D primary_dev->hard_header_len; - } - - standby_dev =3D rcu_dereference(nfo_info->standby_dev); - if (standby_dev) { - vlan_features =3D - netdev_increment_features(vlan_features, - standby_dev->vlan_features, - FAILOVER_VLAN_FEATURES); - enc_features =3D - netdev_increment_features(enc_features, - standby_dev->hw_enc_features, - FAILOVER_ENC_FEATURES); - - dst_release_flag &=3D standby_dev->priv_flags; - if (standby_dev->hard_header_len > max_hard_header_len) - max_hard_header_len =3D standby_dev->hard_header_len; - } - - dev->vlan_features =3D vlan_features; - dev->hw_enc_features =3D enc_features | NETIF_F_GSO_ENCAP_ALL; - dev->hard_header_len =3D max_hard_header_len; - - dev->priv_flags &=3D ~IFF_XMIT_DST_RELEASE; - if (dst_release_flag =3D=3D (IFF_XMIT_DST_RELEASE | - IFF_XMIT_DST_RELEASE_PERM)) - dev->priv_flags |=3D IFF_XMIT_DST_RELEASE; - - netdev_change_features(dev); -} - static void net_failover_lower_state_changed(struct net_device *slave_dev, struct net_device *primary_dev, struct net_device *standby_dev) @@ -550,7 +502,6 @@ static int net_failover_slave_register(struct net_devic= e *slave_dev, } =20 net_failover_lower_state_changed(slave_dev, primary_dev, standby_dev); - net_failover_compute_features(failover_dev); =20 call_netdevice_notifiers(NETDEV_JOIN, slave_dev); =20 @@ -621,8 +572,6 @@ static int net_failover_slave_unregister(struct net_dev= ice *slave_dev, =20 dev_put(slave_dev); =20 - net_failover_compute_features(failover_dev); - netdev_info(failover_dev, "failover %s slave:%s unregistered\n", slave_is_standby ? "standby" : "primary", slave_dev->name); =20 @@ -736,7 +685,7 @@ struct failover *net_failover_create(struct net_device = *standby_dev) /* Don't allow failover devices to change network namespaces. */ failover_dev->netns_immutable =3D true; =20 - failover_dev->hw_features =3D FAILOVER_VLAN_FEATURES | + failover_dev->hw_features =3D MASTER_UPPER_DEV_VLAN_FEATURES | NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_HW_VLAN_CTAG_FILTER; diff --git a/include/net/net_failover.h b/include/net/net_failover.h index b12a1c469d1c..f0f038d113a0 100644 --- a/include/net/net_failover.h +++ b/include/net/net_failover.h @@ -30,11 +30,4 @@ struct net_failover_info { struct failover *net_failover_create(struct net_device *standby_dev); void net_failover_destroy(struct failover *failover); =20 -#define FAILOVER_VLAN_FEATURES (NETIF_F_HW_CSUM | NETIF_F_SG | \ - NETIF_F_FRAGLIST | NETIF_F_ALL_TSO | \ - NETIF_F_HIGHDMA | NETIF_F_LRO) - -#define FAILOVER_ENC_FEATURES (NETIF_F_HW_CSUM | NETIF_F_SG | \ - NETIF_F_RXCSUM | NETIF_F_ALL_TSO) - #endif /* _NET_FAILOVER_H */ --=20 Git-155) From nobody Tue Apr 7 13:00:54 2026 Received: from mail-pj1-f54.google.com (mail-pj1-f54.google.com [209.85.216.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B48602F5A29 for ; Fri, 13 Mar 2026 03:04:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773371079; cv=none; b=QxkqzGxZjlyQT+jFPcOBlYmjLDuFlyNyYdCBPs3LeDsLTJf/odnZF2yzYK5BITBgWwvZYKmvmSPpVIVYkIr9UhPe44S4+nEBz7RdKW2YH4eUPZeICb1v9jIZIOd+T9XR32Svf/x4URpOrOH0Hu/CRthKFZ0JsUhjZop7TfIPmYg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773371079; c=relaxed/simple; bh=I4tJr0wcN2egmg+HlHDIhE18HXzqUjm9zwXxnCfbyB0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=LbvPSkOB4NTxYepzj1RzEBvb95R3CTgXEp5woZKWIM2hY7nth0879Sj+87NY9pmovnmuK7MvUpBIhbhSQ56pyv+T53zHBRboF4ILtKIzOLiHYrVV9tpGGGSrJy//Ft0cZhxx6/XZKPAKy0p44lwnkKqbMAQDYiaZ4oAeqPQ6w34= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=bTj7pkH0; arc=none smtp.client-ip=209.85.216.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="bTj7pkH0" Received: by mail-pj1-f54.google.com with SMTP id 98e67ed59e1d1-359f35dfef6so957815a91.2 for ; Thu, 12 Mar 2026 20:04:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773371078; x=1773975878; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=sjhGrfJof2HReSiAWd8q2bv7fT33KudQzX2odTz69Us=; b=bTj7pkH0d6HU46LwWbkTr1ufLYqwv7giB0nypH9hGMYUS4s71aQ7e2wisHdXlsNB+J y2sG2zbjmz5qUFQpvhuFT0GZ19NLLKmuWOXbAC5ebhHBQXbwqRG7yfDEUzSZwMkRgKhN r866WSu8Biy0OBpM39gavG4HPXrLl3ZVpoDsDZ02gueWb0Z3+yHWD2Idy1t0uQTw0hTx fGnZDL71g7zggAiiYa/mpd9xaxHdURuQZcp9WVAAWJQyCMxykVbdVIc7NohWFdU+Vvva +fdyTdjm7dporK2U8FI8ZJqX7Tpc0wRZee14hWlZzhn/50Y2gJMW7Fszlr2h6R6NGUFT KT0g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773371078; x=1773975878; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=sjhGrfJof2HReSiAWd8q2bv7fT33KudQzX2odTz69Us=; b=TV1DjwUmsHLz8W7jE9GkEfLXickUk5q6KWioj0J1/zT8W4GmjBkxUDS69RtI54a6A8 RpndwITqar449dNT8JP4JUDFvw9djdV1QY680l3E00q45P6DdCpNC2ru4nMDAkv9YRah Vy/2+GP10Agzj+Inkg52f0Gk/NHseUpe7lkUEnQPmmkINvs42M+GUGcbPtmuMVJjWXAb VWkwUjRRoVEX0VAzvw1pADkpOHoiSoCAbRoztxRb4PJNYW1LMj8WBVXJ0/s3lOde3Oqv 4RFHLkCXOzuVRQtWzop7axgLS9JtWdQkHv3D2HMCf2bVrPpGcHivJ8D+dPAWazVWrvLY VmFA== X-Forwarded-Encrypted: i=1; AJvYcCWE6lE+6xZHuIZNqIRbG2YwBAEtc8YnvN5Yjv49zxBCcadqAsqxQKJAPyEPBga0lhpRXZc+cJxQer4g3lw=@vger.kernel.org X-Gm-Message-State: AOJu0Yy4ulojfCM3SRfZEVW6uEQRDBOdOB6OERCINdf5IeKhLB6pQSi4 uNlNVg8sM8lEGknHDitcPnFGv78RvvEo+vqNiug63sXoRxuNYlkktYYP X-Gm-Gg: ATEYQzw7iARkTZWxYFRSHFhnl3XobHVAxPw3NQ/2C6NEkZiBQt6UmxslqYfkYysf6yO mDFS9cRO1Uv1na+FF7ylTtRJpiilbwVyXMYN97Yo1wuba87WZT92c3KbYSKJd600nnP82gEKCat 6v+e7uOD9n+cucD1fJ/aGhJBjLq0taGN4AJ7fS/UtYzOWkXDpwQig79dlwExgq2OJ/OvAxGN1d1 bEOVtmnI0+QZG6pNzTFJG9Yxp781q/AjsGXdSvGpGJtf6tcNlhs3YVxKmUoCTKGwzcr1g2Tig/K oU/fxki77lNHGfmIiy9tdeahsUJDVzMwKPL2fFJrwp/tXurvmSv2C19eeQfgSY/wVmF3pDYnRZ0 QZ9o0VV7CZL9js/E8eQYJnhtNvHtzcaq7CvsV/8kPXyHGqQCo4UsHBt68b/epJ+/5O06/2GKzou GmyRKAyHPXq/Ov2wt2pNHmthDzGt/MzqcelKEgkFrGus2B1CRRb5uTOnwBsP+x/K+YzRGnzD8Mh RFrET0ScGbldLBvm74JNWSeW+b2nkQ2+LWl1sjdi0s170omKD95 X-Received: by 2002:a17:90b:5291:b0:352:ccae:fe62 with SMTP id 98e67ed59e1d1-35a21ebac06mr1377246a91.10.1773371078075; Thu, 12 Mar 2026 20:04:38 -0700 (PDT) Received: from 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa ([240e:34c:5765:adb0:54b3:92b9:a11b:1cae]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35a24a7dc1csm293967a91.1.2026.03.12.20.04.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Mar 2026 20:04:36 -0700 (PDT) From: Hangbin Liu Date: Fri, 13 Mar 2026 11:03:12 +0800 Subject: [PATCH net-next v2 4/4] net: no need to disable LRO specifically Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260313-offload_compute-v2-4-ffbc8ce5d50c@gmail.com> References: <20260313-offload_compute-v2-0-ffbc8ce5d50c@gmail.com> In-Reply-To: <20260313-offload_compute-v2-0-ffbc8ce5d50c@gmail.com> To: Jay Vosburgh , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Jiri Pirko , Nikolay Aleksandrov , Ido Schimmel , Simon Horman , Sabrina Dubroca , Sridhar Samudrala Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, bridge@lists.linux.dev, Hangbin Liu X-Mailer: b4 0.14.3 In commit "net: use ndo_set_features to set offload features for bonding/bridge/team" we called netdev_change_features() in __netdev_upper_dev_link(), which will disable LRO automatically on lower device if upper device doesn't have LRO enabled. So we don't need to dev_disable_lro() again after netdev_upper_dev_link(). Signed-off-by: Hangbin Liu --- drivers/net/bonding/bond_main.c | 3 --- drivers/net/team/team_core.c | 3 --- net/8021q/vlan.c | 2 -- net/bridge/br_if.c | 2 -- net/hsr/hsr_slave.c | 1 - 5 files changed, 11 deletions(-) diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_mai= n.c index 2c84d3ce3b04..57620e93cc37 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -2222,9 +2222,6 @@ int bond_enslave(struct net_device *bond_dev, struct = net_device *slave_dev, } #endif =20 - if (!(bond_dev->features & NETIF_F_LRO)) - dev_disable_lro(slave_dev); - res =3D netdev_rx_handler_register(slave_dev, bond_handle_frame, new_slave); if (res) { diff --git a/drivers/net/team/team_core.c b/drivers/net/team/team_core.c index 4906ea3717b1..73d4f68a7ccd 100644 --- a/drivers/net/team/team_core.c +++ b/drivers/net/team/team_core.c @@ -1191,9 +1191,6 @@ static int team_port_add(struct team *team, struct ne= t_device *port_dev, goto err_enable_netpoll; } =20 - if (!(dev->features & NETIF_F_LRO)) - dev_disable_lro(port_dev); - err =3D netdev_rx_handler_register(port_dev, team_handle_frame, port); if (err) { diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c index 2b74ed56eb16..fda3a80e9340 100644 --- a/net/8021q/vlan.c +++ b/net/8021q/vlan.c @@ -193,8 +193,6 @@ int register_vlan_dev(struct net_device *dev, struct ne= tlink_ext_ack *extack) vlan_group_set_device(grp, vlan->vlan_proto, vlan_id, dev); grp->nr_vlan_devs++; =20 - netdev_update_features(dev); - return 0; =20 out_unregister_netdev: diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c index 030248bc94c5..0aa653a1e651 100644 --- a/net/bridge/br_if.c +++ b/net/bridge/br_if.c @@ -620,8 +620,6 @@ int br_add_if(struct net_bridge *br, struct net_device = *dev, if (err) goto err5; =20 - dev_disable_lro(dev); - list_add_rcu(&p->list, &br->port_list); =20 nbp_update_port_count(br); diff --git a/net/hsr/hsr_slave.c b/net/hsr/hsr_slave.c index 44f83c8c56a7..4b6ab185392b 100644 --- a/net/hsr/hsr_slave.c +++ b/net/hsr/hsr_slave.c @@ -169,7 +169,6 @@ static int hsr_portdev_setup(struct hsr_priv *hsr, stru= ct net_device *dev, res =3D netdev_rx_handler_register(dev, hsr_handle_frame, port); if (res) goto fail_rx_handler; - dev_disable_lro(dev); =20 return 0; =20 --=20 Git-155)