Re: [PATCH v2 net-next 2/2] net: bonding, dummy, ifb, team: advertise NETIF_F_GSO_SOFTWARE
From: Alexander Lobakin
Date: Mon Nov 02 2020 - 14:26:10 EST
From: Willem de Bruijn <willemdebruijn.kernel@xxxxxxxxx>
Date: Mon, 2 Nov 2020 11:30:17 -0500
Hi!
Thanks for the Ack.
> On Sun, Nov 1, 2020 at 8:17 AM Alexander Lobakin <alobakin@xxxxx> wrote:
>>
>> Virtual netdevs should use NETIF_F_GSO_SOFTWARE to forward GSO skbs
>> as-is and let the final drivers deal with them when supported.
>> Also remove NETIF_F_GSO_UDP_L4 from bonding and team drivers as it's
>> now included in the "software" list.
>
> The rationale is that it is okay to advertise these features with
> software fallback as bonding/teaming "hardware" features, because
> there will always be a downstream device for which they will be
> implemented, possibly in the software fallback, correct?
>
> That does not apply to dummy or IFB. I guess dummy is fine, because
> xmit is a black hole, and IFB because ingress can safely handle these
> packets? How did you arrive at the choice of changing these two, of
> all virtual devices?
Two points:
1. Exactly, dummy is just dummy, while ifb is an intermediate netdev to
share resources, so it should be as fine as with other virtual devs.
2. They both advertise NETIF_F_ALL_TSO | NETIF_F_GSO_ENCAP_ALL, which
assumes that they handle all GSO skbs just like the others (pass
them as is to the real drivers in case with ifb).
>>
>> Suggested-by: Willem de Bruijn <willemb@xxxxxxxxxx>
>> Signed-off-by: Alexander Lobakin <alobakin@xxxxx>
>> ---
>> drivers/net/bonding/bond_main.c | 11 +++++------
>> drivers/net/dummy.c | 2 +-
>> drivers/net/ifb.c | 3 +--
>> drivers/net/team/team.c | 9 ++++-----
>> 4 files changed, 11 insertions(+), 14 deletions(-)
>>
>> diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
>> index 84ecbc6fa0ff..71c9677d135f 100644
>> --- a/drivers/net/bonding/bond_main.c
>> +++ b/drivers/net/bonding/bond_main.c
>> @@ -1228,14 +1228,14 @@ static netdev_features_t bond_fix_features(struct net_device *dev,
>> }
>>
>> #define BOND_VLAN_FEATURES (NETIF_F_HW_CSUM | NETIF_F_SG | \
>> - NETIF_F_FRAGLIST | NETIF_F_ALL_TSO | \
>> + NETIF_F_FRAGLIST | NETIF_F_GSO_SOFTWARE | \
>> NETIF_F_HIGHDMA | NETIF_F_LRO)
>>
>> #define BOND_ENC_FEATURES (NETIF_F_HW_CSUM | NETIF_F_SG | \
>> - NETIF_F_RXCSUM | NETIF_F_ALL_TSO)
>> + NETIF_F_RXCSUM | NETIF_F_GSO_SOFTWARE)
>>
>> #define BOND_MPLS_FEATURES (NETIF_F_HW_CSUM | NETIF_F_SG | \
>> - NETIF_F_ALL_TSO)
>> + NETIF_F_GSO_SOFTWARE)
>>
>>
>> static void bond_compute_features(struct bonding *bond)
>> @@ -1291,8 +1291,7 @@ static void bond_compute_features(struct bonding *bond)
>> bond_dev->vlan_features = vlan_features;
>> bond_dev->hw_enc_features = enc_features | NETIF_F_GSO_ENCAP_ALL |
>> NETIF_F_HW_VLAN_CTAG_TX |
>> - NETIF_F_HW_VLAN_STAG_TX |
>> - NETIF_F_GSO_UDP_L4;
>> + NETIF_F_HW_VLAN_STAG_TX;
>> #ifdef CONFIG_XFRM_OFFLOAD
>> bond_dev->hw_enc_features |= xfrm_features;
>> #endif /* CONFIG_XFRM_OFFLOAD */
>> @@ -4721,7 +4720,7 @@ void bond_setup(struct net_device *bond_dev)
>> NETIF_F_HW_VLAN_CTAG_RX |
>> NETIF_F_HW_VLAN_CTAG_FILTER;
>>
>> - bond_dev->hw_features |= NETIF_F_GSO_ENCAP_ALL | NETIF_F_GSO_UDP_L4;
>> + bond_dev->hw_features |= NETIF_F_GSO_ENCAP_ALL;
>> #ifdef CONFIG_XFRM_OFFLOAD
>> bond_dev->hw_features |= BOND_XFRM_FEATURES;
>> #endif /* CONFIG_XFRM_OFFLOAD */
>> diff --git a/drivers/net/dummy.c b/drivers/net/dummy.c
>> index bab3a9bb5e6f..f82ad7419508 100644
>> --- a/drivers/net/dummy.c
>> +++ b/drivers/net/dummy.c
>> @@ -124,7 +124,7 @@ static void dummy_setup(struct net_device *dev)
>> dev->flags &= ~IFF_MULTICAST;
>> dev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_NO_QUEUE;
>> dev->features |= NETIF_F_SG | NETIF_F_FRAGLIST;
>> - dev->features |= NETIF_F_ALL_TSO;
>> + dev->features |= NETIF_F_GSO_SOFTWARE;
>> dev->features |= NETIF_F_HW_CSUM | NETIF_F_HIGHDMA | NETIF_F_LLTX;
>> dev->features |= NETIF_F_GSO_ENCAP_ALL;
>> dev->hw_features |= dev->features;
>> diff --git a/drivers/net/ifb.c b/drivers/net/ifb.c
>> index 7fe306e76281..fa63d4dee0ba 100644
>> --- a/drivers/net/ifb.c
>> +++ b/drivers/net/ifb.c
>> @@ -187,8 +187,7 @@ static const struct net_device_ops ifb_netdev_ops = {
>> };
>>
>> #define IFB_FEATURES (NETIF_F_HW_CSUM | NETIF_F_SG | NETIF_F_FRAGLIST | \
>> - NETIF_F_TSO_ECN | NETIF_F_TSO | NETIF_F_TSO6 | \
>> - NETIF_F_GSO_ENCAP_ALL | \
>> + NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ENCAP_ALL | \
>> NETIF_F_HIGHDMA | NETIF_F_HW_VLAN_CTAG_TX | \
>> NETIF_F_HW_VLAN_STAG_TX)
>>
>> diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c
>> index 07f1f3933927..b4092127a92c 100644
>> --- a/drivers/net/team/team.c
>> +++ b/drivers/net/team/team.c
>> @@ -975,11 +975,11 @@ static void team_port_disable(struct team *team,
>> }
>>
>> #define TEAM_VLAN_FEATURES (NETIF_F_HW_CSUM | NETIF_F_SG | \
>> - NETIF_F_FRAGLIST | NETIF_F_ALL_TSO | \
>> + NETIF_F_FRAGLIST | NETIF_F_GSO_SOFTWARE | \
>> NETIF_F_HIGHDMA | NETIF_F_LRO)
>>
>> #define TEAM_ENC_FEATURES (NETIF_F_HW_CSUM | NETIF_F_SG | \
>> - NETIF_F_RXCSUM | NETIF_F_ALL_TSO)
>> + NETIF_F_RXCSUM | NETIF_F_GSO_SOFTWARE)
>>
>> static void __team_compute_features(struct team *team)
>> {
>> @@ -1009,8 +1009,7 @@ static void __team_compute_features(struct team *team)
>> team->dev->vlan_features = vlan_features;
>> team->dev->hw_enc_features = enc_features | NETIF_F_GSO_ENCAP_ALL |
>> NETIF_F_HW_VLAN_CTAG_TX |
>> - NETIF_F_HW_VLAN_STAG_TX |
>> - NETIF_F_GSO_UDP_L4;
>> + NETIF_F_HW_VLAN_STAG_TX;
>> team->dev->hard_header_len = max_hard_header_len;
>>
>> team->dev->priv_flags &= ~IFF_XMIT_DST_RELEASE;
>> @@ -2175,7 +2174,7 @@ static void team_setup(struct net_device *dev)
>> NETIF_F_HW_VLAN_CTAG_RX |
>> NETIF_F_HW_VLAN_CTAG_FILTER;
>>
>> - dev->hw_features |= NETIF_F_GSO_ENCAP_ALL | NETIF_F_GSO_UDP_L4;
>> + dev->hw_features |= NETIF_F_GSO_ENCAP_ALL;
>> dev->features |= dev->hw_features;
>> dev->features |= NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_STAG_TX;
>> }
>> --
>> 2.29.2
Al