From: Simon Horman <horms@kernel.org>
To: Hangbin Liu <liuhangbin@gmail.com>
Cc: netdev@vger.kernel.org, Jay Vosburgh <jv@jvosburgh.net>,
Andrew Lunn <andrew+netdev@lunn.ch>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Sabrina Dubroca <sdubroca@redhat.com>,
Jiri Pirko <jiri@resnulli.us>, Ido Schimmel <idosch@nvidia.com>,
Shuah Khan <shuah@kernel.org>,
Stanislav Fomichev <sdf@fomichev.me>,
Stanislav Fomichev <stfomichev@gmail.com>,
Kuniyuki Iwashima <kuniyu@google.com>,
Ahmed Zaki <ahmed.zaki@intel.com>,
Alexander Lobakin <aleksander.lobakin@intel.com>,
bridge@lists.linux.dev, linux-kselftest@vger.kernel.org
Subject: Re: [PATCHv4 net-next 1/4] net: add a common function to compute features from lowers devices
Date: Tue, 14 Oct 2025 15:02:23 +0100 [thread overview]
Message-ID: <aO5X7368r8veRe5J@horms.kernel.org> (raw)
In-Reply-To: <20251014080217.47988-2-liuhangbin@gmail.com>
On Tue, Oct 14, 2025 at 08:02:14AM +0000, Hangbin Liu wrote:
...
> diff --git a/net/core/dev.c b/net/core/dev.c
> index a64cef2c537e..54f0e792fbd2 100644
> --- a/net/core/dev.c
> +++ b/net/core/dev.c
> @@ -12616,6 +12616,101 @@ netdev_features_t netdev_increment_features(netdev_features_t all,
> }
> EXPORT_SYMBOL(netdev_increment_features);
>
> +/**
> + * netdev_compute_features_from_lowers - compute feature from lowers
> + * @dev: the upper device
> + * @update_header: whether to update upper device's header_len/headroom/tailroom
> + *
> + * Recompute the upper device's feature based on all lower devices.
> + */
> +void netdev_compute_features_from_lowers(struct net_device *dev, bool update_header)
> +{
> + unsigned int dst_release_flag = IFF_XMIT_DST_RELEASE | IFF_XMIT_DST_RELEASE_PERM;
> + netdev_features_t gso_partial_features = VIRTUAL_DEV_GSO_PARTIAL_FEATURES;
> +#ifdef CONFIG_XFRM_OFFLOAD
> + netdev_features_t xfrm_features = VIRTUAL_DEV_XFRM_FEATURES;
> +#endif
Hi Hangbin,
It would be nice to avoid the #ifdefs in this function.
Could xfrm_features be declared unconditoinally.
And then used behind if(IS_ENABLED(CONFIG_XFRM_OFFLOAD)) conditions?
This would increase compile coverage (and readability IMHO).
> + netdev_features_t mpls_features = VIRTUAL_DEV_MPLS_FEATURES;
> + netdev_features_t vlan_features = VIRTUAL_DEV_VLAN_FEATURES;
> + netdev_features_t enc_features = VIRTUAL_DEV_ENC_FEATURES;
> + unsigned short max_header_len = ETH_HLEN;
> + unsigned int tso_max_size = TSO_MAX_SIZE;
> + u16 tso_max_segs = TSO_MAX_SEGS;
> + struct net_device *lower_dev;
> + unsigned short max_headroom;
> + unsigned short max_tailroom;
> + struct list_head *iter;
> +
> + mpls_features = netdev_base_features(mpls_features);
> + vlan_features = netdev_base_features(vlan_features);
> + enc_features = netdev_base_features(enc_features);
> +
> + netdev_for_each_lower_dev(dev, lower_dev, iter) {
> + gso_partial_features = netdev_increment_features(gso_partial_features,
> + lower_dev->gso_partial_features,
> + VIRTUAL_DEV_GSO_PARTIAL_FEATURES);
> +
> + vlan_features = netdev_increment_features(vlan_features,
> + lower_dev->vlan_features,
> + VIRTUAL_DEV_VLAN_FEATURES);
> +
> + enc_features = netdev_increment_features(enc_features,
> + lower_dev->hw_enc_features,
> + VIRTUAL_DEV_ENC_FEATURES);
> +
> +#ifdef CONFIG_XFRM_OFFLOAD
> + xfrm_features = netdev_increment_features(xfrm_features,
> + lower_dev->hw_enc_features,
> + VIRTUAL_DEV_XFRM_FEATURES);
> +#endif
> +
> + mpls_features = netdev_increment_features(mpls_features,
> + lower_dev->mpls_features,
> + VIRTUAL_DEV_MPLS_FEATURES);
> +
> + dst_release_flag &= lower_dev->priv_flags;
> +
> + if (update_header) {
> + max_header_len = max_t(unsigned short, max_header_len,
> + lower_dev->hard_header_len);
Both the type of max_header_len and .hard_header_len is unsigned short.
So I think max() can be used here instead of max_t(). Likewise for the
following two lines.
> + max_headroom = max_t(unsigned short, max_headroom,
> + lower_dev->needed_headroom);
Max Headroom [1] is used uninitialised the first time we reach here.
Likewise for max_tailroom below.
[1] https://en.wikipedia.org/wiki/Max_Headroom
Flagged by Smatch.
> + max_tailroom = max_t(unsigned short, max_tailroom,
> + lower_dev->needed_tailroom);
> + }
> +
> + tso_max_size = min(tso_max_size, lower_dev->tso_max_size);
> + tso_max_segs = min(tso_max_segs, lower_dev->tso_max_segs);
> + }
> +
> + dev->gso_partial_features = gso_partial_features;
> + dev->vlan_features = vlan_features;
> + dev->hw_enc_features = enc_features | NETIF_F_GSO_ENCAP_ALL |
> + NETIF_F_HW_VLAN_CTAG_TX |
> + NETIF_F_HW_VLAN_STAG_TX;
> +#ifdef CONFIG_XFRM_OFFLOAD
> + dev->hw_enc_features |= xfrm_features;
> +#endif
> + dev->mpls_features = mpls_features;
> +
> + dev->priv_flags &= ~IFF_XMIT_DST_RELEASE;
> + if ((dev->priv_flags & IFF_XMIT_DST_RELEASE_PERM) &&
> + dst_release_flag == (IFF_XMIT_DST_RELEASE | IFF_XMIT_DST_RELEASE_PERM))
> + dev->priv_flags |= IFF_XMIT_DST_RELEASE;
> +
> + if (update_header) {
> + dev->hard_header_len = max_header_len;
> + dev->needed_headroom = max_headroom;
> + dev->needed_tailroom = max_tailroom;
Also, maybe it can't happen in practice. But I think that max_headroom and
max_tailroom will may be used uninitialised here if the previous
'update_header' condition is never reached/met.
Also flagged by Smatch.
> + }
> +
> + 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_features_from_lowers);
> +
...
next prev parent reply other threads:[~2025-10-14 14:02 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-14 8:02 [PATCHv4 net-next 0/4] net: common feature compute for upper interface Hangbin Liu
2025-10-14 8:02 ` [PATCHv4 net-next 1/4] net: add a common function to compute features from lowers devices Hangbin Liu
2025-10-14 9:40 ` Jiri Pirko
2025-10-15 1:25 ` Hangbin Liu
2025-10-16 11:27 ` Jiri Pirko
2025-10-16 12:38 ` Hangbin Liu
2025-10-16 13:24 ` Jiri Pirko
2025-10-17 2:53 ` Hangbin Liu
2025-10-14 14:02 ` Simon Horman [this message]
2025-10-15 3:03 ` Hangbin Liu
2025-10-14 8:02 ` [PATCHv4 net-next 2/4] bonding: use common function to compute the features Hangbin Liu
2025-10-14 8:02 ` [PATCHv4 net-next 3/4] team: " Hangbin Liu
2025-10-14 8:02 ` [PATCHv4 net-next 4/4] net: bridge: " Hangbin Liu
-- strict thread matches above, loose matches on Subject: below --
2025-10-16 23:51 [PATCHv4 net-next 1/4] net: add a common function to compute features from lowers devices kernel test robot
2025-10-19 5:52 kernel test robot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aO5X7368r8veRe5J@horms.kernel.org \
--to=horms@kernel.org \
--cc=ahmed.zaki@intel.com \
--cc=aleksander.lobakin@intel.com \
--cc=andrew+netdev@lunn.ch \
--cc=bridge@lists.linux.dev \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=idosch@nvidia.com \
--cc=jiri@resnulli.us \
--cc=jv@jvosburgh.net \
--cc=kuba@kernel.org \
--cc=kuniyu@google.com \
--cc=linux-kselftest@vger.kernel.org \
--cc=liuhangbin@gmail.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=sdf@fomichev.me \
--cc=sdubroca@redhat.com \
--cc=shuah@kernel.org \
--cc=stfomichev@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.