[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <90c19324a093536f1e0e2e3de3a36df4207a28d3.camel@redhat.com>
Date: Thu, 03 Feb 2022 09:57:11 +0100
From: Paolo Abeni <pabeni@...hat.com>
To: Eric Dumazet <eric.dumazet@...il.com>,
"David S . Miller" <davem@...emloft.net>,
Jakub Kicinski <kuba@...nel.org>
Cc: netdev <netdev@...r.kernel.org>,
Eric Dumazet <edumazet@...gle.com>,
Coco Li <lixiaoyan@...gle.com>
Subject: Re: [PATCH net-next 02/15] ipv6: add dev->gso_ipv6_max_size
Hello,
On Wed, 2022-02-02 at 17:51 -0800, Eric Dumazet wrote:
> From: Eric Dumazet <edumazet@...gle.com>
>
> This enable TCP stack to build TSO packets bigger than
> 64KB if the driver is LSOv2 compatible.
>
> This patch introduces new variable gso_ipv6_max_size
> that is modifiable through ip link.
>
> ip link set dev eth0 gso_ipv6_max_size 185000
>
> User input is capped by driver limit.
>
> Signed-off-by: Coco Li <lixiaoyan@...gle.com>
> Signed-off-by: Eric Dumazet <edumazet@...gle.com>
> ---
> include/linux/netdevice.h | 12 ++++++++++++
> include/uapi/linux/if_link.h | 1 +
> net/core/dev.c | 1 +
> net/core/rtnetlink.c | 15 +++++++++++++++
> net/core/sock.c | 6 ++++++
> tools/include/uapi/linux/if_link.h | 1 +
> 6 files changed, 36 insertions(+)
>
> diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
> index b1f68df2b37bc4b623f61cc2c6f0c02ba2afbe02..2a563869ba44f7d48095d36b1395e3fbd8cfff87 100644
> --- a/include/linux/netdevice.h
> +++ b/include/linux/netdevice.h
> @@ -1949,6 +1949,7 @@ enum netdev_ml_priv_type {
> * @linkwatch_dev_tracker: refcount tracker used by linkwatch.
> * @watchdog_dev_tracker: refcount tracker used by watchdog.
> * @tso_ipv6_max_size: Maximum size of IPv6 TSO packets (driver/NIC limit)
> + * @gso_ipv6_max_size: Maximum size of IPv6 GSO packets (user/admin limit)
> *
> * FIXME: cleanup struct net_device such that network protocol info
> * moves out.
> @@ -2284,6 +2285,7 @@ struct net_device {
> netdevice_tracker linkwatch_dev_tracker;
> netdevice_tracker watchdog_dev_tracker;
> unsigned int tso_ipv6_max_size;
> + unsigned int gso_ipv6_max_size;
> };
> #define to_net_dev(d) container_of(d, struct net_device, dev)
>
> @@ -4804,6 +4806,10 @@ static inline void netif_set_gso_max_size(struct net_device *dev,
> {
> /* dev->gso_max_size is read locklessly from sk_setup_caps() */
> WRITE_ONCE(dev->gso_max_size, size);
> +
> + /* legacy drivers want to lower gso_max_size, regardless of family. */
> + size = min(size, dev->gso_ipv6_max_size);
> + WRITE_ONCE(dev->gso_ipv6_max_size, size);
> }
>
> static inline void netif_set_gso_max_segs(struct net_device *dev,
> @@ -4827,6 +4833,12 @@ static inline void netif_set_tso_ipv6_max_size(struct net_device *dev,
> dev->tso_ipv6_max_size = size;
> }
>
> +static inline void netif_set_gso_ipv6_max_size(struct net_device *dev,
> + unsigned int size)
> +{
> + size = min(size, dev->tso_ipv6_max_size);
> + WRITE_ONCE(dev->gso_ipv6_max_size, size);
Dumb questions on my side: should the above be limited to
tso_ipv6_max_size ? or increasing gso_ipv6_max_size helps even if the
egress NIC does not support LSOv2?
Should gso_ipv6_max_size be capped to some reasonable value (well lower
than 4G), to avoid the stack building very complex skbs?
Thanks!
Paolo
Powered by blists - more mailing lists