From nobody Thu Apr 9 08:50:12 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 A5FBC363C50 for ; Tue, 10 Mar 2026 07:47:00 +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=1773128823; cv=none; b=g/zFOrnMxtWgsIdpBJPLcXGKJLAbiGjunj8EHBQKDgYd1rxjreoja/4emuMzI93tw971siZx24XYybGNaHT7ldkt1x2QhjeMZn5xQmqVZ1c14pE9bn51aZa1xd7SBKm8Qmfd59bVfkd94Mt2yzzERFvBeFYLBaFyHOipO1k7xiE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773128823; c=relaxed/simple; bh=ckIN5ASkuNOY9pUfpsVNZbSyJ16scvuiSr26ig8bsBM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RwndYQZlu4NmHUCtO1iIJ3Gs/vMTIOU9Q0KW+xVNOFZECzdclXoDFEWNGbg9f6IFiMkqqiVPH2EHaPsLuVzV8fzSQGwARIr/moO2tm5bEjOEiYDK2PvHKRJPOOaEWPki1Tl3KSmIBq9uyDpHz5ipKyKP7wwJ9yVlQFF2k4JmS9s= 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=P+RGhi4f; 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="P+RGhi4f" Received: by mail-pj1-f53.google.com with SMTP id 98e67ed59e1d1-35983877dc5so4109014a91.2 for ; Tue, 10 Mar 2026 00:47:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773128820; x=1773733620; 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=P+RGhi4fJv0WuGJifLYhB3BxBwXFLt5xBL5YYWH6dBHzWt+sixle3rMvsmTVptqP0C no+jzpzltm6GldEddudb84pYSUqs+4AlhWgZ18t5QD07ALcUbmeYCQS7wMsSSYtxGIEt zxFJ17TFlJ4lj8850XF+E2D9B4l0RLcJYHddcMRuisajbFMfY+J7k/Np1oxUYLEoeI18 roTcNXkDSwIx0SPC1hgcUZr3TF9W9wzJvp0lTKmNlH7e5QYKuAP7ItfUQT2lVjLVEhQV ZS1gj0W/nS1cn/kMvXMh40ewEP4OGvs/Up3MLkHbTQsu3LzsrwhWGsMhiIgRHHgSHQwH lKDg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773128820; x=1773733620; 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=I+fTWPBWik+9vPQJqwRlzG3uSu5QeXtfwuELMHQuwZugyzzCuZkgdfEaCyvwqOm8j4 aE01mKRHDo6zSZc3RwDItsiSSrxNOKw1SQP4cfdKX//kR1O8eXz8F5f3JovdRojMgqk/ vBTmrxNRmJaImAcQVCp3wwS8Zmzbqt86gsZLDKd4bLF4HjEEjF6AmL6Orq4MfEKtFGW9 zjm2h8X7HtbrHGw/oJK533UL/1P7mmx4OA8NBg37P2iOx6ekmKq6i/mio8IgsFiFtz2V 21I/Svaf4Q8BiK5UEVRwZ4ODSAgV6Nq4jtT+/fzAQWwdMAQ5fGfYmYYSVVAfmRbOwjK2 Ep8g== X-Forwarded-Encrypted: i=1; AJvYcCUIyRrRL1YrKm93CCaOaQ2EsJMGs6LYRYI5q8tyIHlb6lnI+yliY+OIPXKz3KJ4YrL1VL33DVvnWYObM7k=@vger.kernel.org X-Gm-Message-State: AOJu0Yzpf8O0mxp8lnI/g53tVmf4o/JFimIRmypBQT4gbydZ4gn7QAAD J1UnZ/wdvfbkLBTelNPRCFzKmLA3dYtekk5uqiOuohfTXUd7hNXKMigNghpbP7iK X-Gm-Gg: ATEYQzxXLBAzD5bhAhQLcj/qrRusrDH/rWSFhJAkFYX7Ja0If+ZEM5N6RfJafg+wrWt iDg7tr+0vJ01phW76bNKrSbP5cVPjBKSvZAuq6vQd6p0QCBgXIh39x7C58SvhhDeYH3p34jKIWM W/cKyFlWbdZFZi8ep6U+AtyR7EIao54QZFfIehCtwGMfTf4bf08P/tFQbvuptt2JbJ99rlnCBR7 Ix8TZhxCHo5EXbTsKkaueReUt8XpB5PD/V8LWu2h9MKMaaqNLXaNizPVGMk9D0qIjtRGp9PcKhr KlUpnwYfRe9k12n8Stm60sdVf7XTvU3d6P4w8Q7PV8EToVohceNx5TmmBlBkGuVX70Ti8D1A1CC qZsXlQ4WCMjQrS5Pn3DRD+5k2ctb8Cinfm0VXBNRF4ckq/e8QuP36G7Kon8QcbDNWwM88jgY+o3 b0Akv77KEMgSNHT8G+5oZSlPfmLMEjcDUXzYjrKJ3ra6N6Op103vnrDmyk2q/NrehLPvqlh4q/f yjZgTWcFiJvS0E12ok3A8/ku9UmLAGkoIuS7efVNkk= X-Received: by 2002:a17:90b:3a4b:b0:359:7fe6:7e5 with SMTP id 98e67ed59e1d1-359be30aee2mr10825721a91.24.1773128819911; Tue, 10 Mar 2026 00:46: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 ([209.132.188.88]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-359bc7ef38csm7260607a91.2.2026.03.10.00.46.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Mar 2026 00:46:59 -0700 (PDT) From: Hangbin Liu Date: Tue, 10 Mar 2026 15:45:06 +0800 Subject: [PATCH net-next 2/3] 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: <20260310-offload_compute-v1-2-3df79c09ea65@gmail.com> References: <20260310-offload_compute-v1-0-3df79c09ea65@gmail.com> In-Reply-To: <20260310-offload_compute-v1-0-3df79c09ea65@gmail.com> To: Jay Vosburgh , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Jiri Pirko , Nikolay Aleksandrov , Ido Schimmel , Simon Horman , 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)