From nobody Tue Apr 7 06:19:22 2026 Received: from mail-pf1-f182.google.com (mail-pf1-f182.google.com [209.85.210.182]) (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 984C62DCBF4 for ; Mon, 16 Mar 2026 04:27:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773635264; cv=none; b=Nia8xfZDMDooLsK742kUJvY3XCpfvNhXHrYkY1sUi7SfnS8B43W4h/CwC/e6dVjCyf6g8Hlv96DAveriSgsNBlnNHKf/9HWFGuRVb4zmew7Jn/bbDaBfTF5xUayF/E7I8kruY/i48AmY3q37F8PQbXkGskbzZBKeJLzJrkza9m4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773635264; c=relaxed/simple; bh=9i2xWCN02/6dWupq0qfGRAfhr3jgqrdA1Q8ElDVHmj4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KMHBzwU7uMx7NRATNoxTsU/fFak5QqvNpdLD4O9+c+0O0UWZkWdqObajbDmby9H7ioPgftcG1RwHH18BdqzLOt9x9QRP38PY5fiE/GDXWU5HPDv5rnRvrifZsk6AvEmwaoDDpfaDmPzmBbt6KlfBsVWttGuwh8Q15dLWmMcM7BI= 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=kvdxzsxx; arc=none smtp.client-ip=209.85.210.182 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="kvdxzsxx" Received: by mail-pf1-f182.google.com with SMTP id d2e1a72fcca58-8296d553142so1746226b3a.3 for ; Sun, 15 Mar 2026 21:27:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773635263; x=1774240063; 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=C7xj5ZZxKagQhRbiCtY39hgG05M7BNgG4UcL1mqFDwQ=; b=kvdxzsxxepySuOcY3WN8j+vyOkMJIolCyekYtNoLMfb3ZYkQ4KNWwckTK+rrcnOXlT z8B8zdRIIksMXHd/ofKz58ygDnMQX07x23hUnsI1iPrLzGS0vfy3eiGwABc4EPdOREvc 040cLmUP/0EVPliyzWS9olEa4FqCcP+j+yqDHfiqPpDfc1Jo5XusVR1jEBpiviFAg87R zuldpzkDdDGjOhKsTnNN/UAwh91Ohc057GLJg3UiQsZLj9LPQdjp27PNAuOV6XhnXXDw nI15whRefLZRBooyg8I8Q+OLFXJp0I8WUD9IDv9/SKb+efmMdghMy6w0GzVJHLAwf+xb 6THw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773635263; x=1774240063; 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=C7xj5ZZxKagQhRbiCtY39hgG05M7BNgG4UcL1mqFDwQ=; b=K7MRX+B4zYpr+wjdAfUYpxfq7VRIgWffHV3c7l6iIYGZCP/KbAZ36wlqB2+fAjtuX+ Im183zYNR+8FLTXIazback+BwmdFj4JFIi4WXpPe8vtl+3cUdB5OqJZwdyMseFbnsr5s VHnG0XogKf0jk+7CsdTIxToqlVQ/IN9wNn+lsMWGYXfvpbeve/okC3y4Q6D4QJSfHCG/ 5hSYBXL90/f95qGQHvSbn1R2yYabojJEIi88D4DFQGmGyVedqylq6aNessQVIEJnP5p9 XT5v8znMhQ9+TYCIjg6CVsAGKO2V4QvfKooUcQfjtENW9HFYbPrb/qSQUgP1Ypc0Ctxs qGQw== X-Forwarded-Encrypted: i=1; AJvYcCU+3IBqQGJPzbjwHP9D2ROXejii7TbsyloHEUk1Pv9FKZZOb1+fhzYpGOi9JlgI4gMh39zztdPHvp91UZI=@vger.kernel.org X-Gm-Message-State: AOJu0Yx4zqiu5pryNDAGidOF0l7/lL5oWmmVYpf+wmBXolo49PizGWYK c+8Wf1xCAZHRiaZBgap27dWOJKcE4hy9loefkHZMjFEGeg80F48mpoJE X-Gm-Gg: ATEYQzwmaXPI1BbCQQsIbCepAsYWUxMDoHvYb3GNxzPOAiLOs1ciMWBhGFyJ544nl8m 2s2kNeXCBAxs88Z3m4F7cFgZ1yrZRE6oy8cwvFI94dmjGYcBXMIqKVVyjLzx0bYP+Tyj57BJIUT IE4RegRmV3daxLGWiHnezQ4rG4Mf4OgF8vOJTXpglfLiKPsVg6d/jzxE3373agXmzy2ByItCtmr UaLYNAZTbYUoGkGJ+qKClnFbP7nu8ADYyc/Kl++g6SlOaF3nkxP56JR9fLvW5+HP0iJcl20e58d kXCzRTN5G7RvnoAO+58Sa8ZqF4RDknb+BjKFC3uz3LE9IleQO2ENRcBWZM9ePrbJ4HcVyvZII55 9feltsq5SLlk3EAAb9eMTWWdDh/UvUH64/owgwkLmcYJYMND9tQr6r1swWc0RhBt97pUhL2+1Ez ZFHCeplrsgssMHhos6Tf1xZfQ8UHlVfNzRQBUTyCkIyCTlLE5DybdqIHpGkw== X-Received: by 2002:a05:6a00:4605:b0:829:8990:3f86 with SMTP id d2e1a72fcca58-82a198cf37fmr9979104b3a.35.1773635262976; Sun, 15 Mar 2026 21:27:42 -0700 (PDT) Received: from 1.0.0.127.in-addr.arpa ([240e:34c:5760:3860:bc29:deed:92d0:823c]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82a0738422esm12180267b3a.55.2026.03.15.21.27.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 15 Mar 2026 21:27:42 -0700 (PDT) From: Hangbin Liu Date: Mon, 16 Mar 2026 12:26:12 +0800 Subject: [PATCH net-next v3 4/5] failover: use ndo_update_offloads 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: <20260316-offload_compute-v3-4-a5d4a07d86d3@gmail.com> References: <20260316-offload_compute-v3-0-a5d4a07d86d3@gmail.com> In-Reply-To: <20260316-offload_compute-v3-0-a5d4a07d86d3@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_update_offloads 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 | 66 +++++-------------------------------------= ---- include/net/net_failover.h | 7 ----- 2 files changed, 7 insertions(+), 66 deletions(-) diff --git a/drivers/net/net_failover.c b/drivers/net/net_failover.c index d0361aaf25ef..85c238b88b85 100644 --- a/drivers/net/net_failover.c +++ b/drivers/net/net_failover.c @@ -300,6 +300,11 @@ static int net_failover_vlan_rx_kill_vid(struct net_de= vice *dev, __be16 proto, return 0; } =20 +static void failover_update_offloads(struct net_device *dev) +{ + netdev_compute_master_upper_features(dev, true); +} + static const struct net_device_ops failover_dev_ops =3D { .ndo_open =3D net_failover_open, .ndo_stop =3D net_failover_close, @@ -312,6 +317,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_update_offloads =3D failover_update_offloads, }; =20 #define FAILOVER_NAME "net_failover" @@ -373,61 +379,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 +501,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 +571,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 +684,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)