Message ID | 20220509222149.1763877-3-eric.dumazet@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | tcp: BIG TCP implementation | expand |
Hi Eric,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on net-next/master]
url: https://github.com/intel-lab-lkp/linux/commits/Eric-Dumazet/tcp-BIG-TCP-implementation/20220510-062530
base: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git 9c095bd0d4c451d31d0fd1131cc09d3b60de815d
config: um-i386_defconfig (https://download.01.org/0day-ci/archive/20220510/202205100923.RHeXqtNd-lkp@intel.com/config)
compiler: gcc-11 (Debian 11.2.0-20) 11.2.0
reproduce (this is a W=1 build):
# https://github.com/intel-lab-lkp/linux/commit/8f9b47ee99f57d1747010d002315092bfa17ed50
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Eric-Dumazet/tcp-BIG-TCP-implementation/20220510-062530
git checkout 8f9b47ee99f57d1747010d002315092bfa17ed50
# save the config file
mkdir build_dir && cp config build_dir/.config
make W=1 O=build_dir ARCH=um SUBARCH=i386 SHELL=/bin/bash
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
In file included from include/net/inet_sock.h:22,
from include/net/ip.h:29,
from include/linux/errqueue.h:6,
from net/core/sock.c:91:
net/core/sock.c: In function 'sk_setup_caps':
>> include/net/sock.h:389:37: error: 'struct sock_common' has no member named 'skc_v6_rcv_saddr'; did you mean 'skc_rcv_saddr'?
389 | #define sk_v6_rcv_saddr __sk_common.skc_v6_rcv_saddr
| ^~~~~~~~~~~~~~~~
net/core/sock.c:2317:72: note: in expansion of macro 'sk_v6_rcv_saddr'
2317 | !sk_is_tcp(sk) || ipv6_addr_v4mapped(&sk->sk_v6_rcv_saddr)))
| ^~~~~~~~~~~~~~~
vim +389 include/net/sock.h
4dc6dc7162c08b Eric Dumazet 2009-07-15 368
68835aba4d9b74 Eric Dumazet 2010-11-30 369 #define sk_dontcopy_begin __sk_common.skc_dontcopy_begin
68835aba4d9b74 Eric Dumazet 2010-11-30 370 #define sk_dontcopy_end __sk_common.skc_dontcopy_end
4dc6dc7162c08b Eric Dumazet 2009-07-15 371 #define sk_hash __sk_common.skc_hash
5080546682bae3 Eric Dumazet 2013-10-02 372 #define sk_portpair __sk_common.skc_portpair
05dbc7b59481ca Eric Dumazet 2013-10-03 373 #define sk_num __sk_common.skc_num
05dbc7b59481ca Eric Dumazet 2013-10-03 374 #define sk_dport __sk_common.skc_dport
5080546682bae3 Eric Dumazet 2013-10-02 375 #define sk_addrpair __sk_common.skc_addrpair
5080546682bae3 Eric Dumazet 2013-10-02 376 #define sk_daddr __sk_common.skc_daddr
5080546682bae3 Eric Dumazet 2013-10-02 377 #define sk_rcv_saddr __sk_common.skc_rcv_saddr
^1da177e4c3f41 Linus Torvalds 2005-04-16 378 #define sk_family __sk_common.skc_family
^1da177e4c3f41 Linus Torvalds 2005-04-16 379 #define sk_state __sk_common.skc_state
^1da177e4c3f41 Linus Torvalds 2005-04-16 380 #define sk_reuse __sk_common.skc_reuse
055dc21a1d1d21 Tom Herbert 2013-01-22 381 #define sk_reuseport __sk_common.skc_reuseport
9fe516ba3fb29b Eric Dumazet 2014-06-27 382 #define sk_ipv6only __sk_common.skc_ipv6only
26abe14379f8e2 Eric W. Biederman 2015-05-08 383 #define sk_net_refcnt __sk_common.skc_net_refcnt
^1da177e4c3f41 Linus Torvalds 2005-04-16 384 #define sk_bound_dev_if __sk_common.skc_bound_dev_if
^1da177e4c3f41 Linus Torvalds 2005-04-16 385 #define sk_bind_node __sk_common.skc_bind_node
8feaf0c0a5488b Arnaldo Carvalho de Melo 2005-08-09 386 #define sk_prot __sk_common.skc_prot
07feaebfcc10cd Eric W. Biederman 2007-09-12 387 #define sk_net __sk_common.skc_net
efe4208f47f907 Eric Dumazet 2013-10-03 388 #define sk_v6_daddr __sk_common.skc_v6_daddr
efe4208f47f907 Eric Dumazet 2013-10-03 @389 #define sk_v6_rcv_saddr __sk_common.skc_v6_rcv_saddr
33cf7c90fe2f97 Eric Dumazet 2015-03-11 390 #define sk_cookie __sk_common.skc_cookie
70da268b569d32 Eric Dumazet 2015-10-08 391 #define sk_incoming_cpu __sk_common.skc_incoming_cpu
8e5eb54d303b7c Eric Dumazet 2015-10-08 392 #define sk_flags __sk_common.skc_flags
ed53d0ab761f5c Eric Dumazet 2015-10-08 393 #define sk_rxhash __sk_common.skc_rxhash
efe4208f47f907 Eric Dumazet 2013-10-03 394
43f51df4172955 Eric Dumazet 2021-11-15 395 /* early demux fields */
8b3f91332291fa Jakub Kicinski 2021-12-23 396 struct dst_entry __rcu *sk_rx_dst;
43f51df4172955 Eric Dumazet 2021-11-15 397 int sk_rx_dst_ifindex;
43f51df4172955 Eric Dumazet 2021-11-15 398 u32 sk_rx_dst_cookie;
43f51df4172955 Eric Dumazet 2021-11-15 399
^1da177e4c3f41 Linus Torvalds 2005-04-16 400 socket_lock_t sk_lock;
9115e8cd2a0c6e Eric Dumazet 2016-12-03 401 atomic_t sk_drops;
9115e8cd2a0c6e Eric Dumazet 2016-12-03 402 int sk_rcvlowat;
9115e8cd2a0c6e Eric Dumazet 2016-12-03 403 struct sk_buff_head sk_error_queue;
b178bb3dfc30d9 Eric Dumazet 2010-11-16 404 struct sk_buff_head sk_receive_queue;
fa438ccfdfd3f6 Eric Dumazet 2007-03-04 405 /*
fa438ccfdfd3f6 Eric Dumazet 2007-03-04 406 * The backlog queue is special, it is always used with
fa438ccfdfd3f6 Eric Dumazet 2007-03-04 407 * the per-socket spinlock held and requires low latency
fa438ccfdfd3f6 Eric Dumazet 2007-03-04 408 * access. Therefore we special case it's implementation.
b178bb3dfc30d9 Eric Dumazet 2010-11-16 409 * Note : rmem_alloc is in this structure to fill a hole
b178bb3dfc30d9 Eric Dumazet 2010-11-16 410 * on 64bit arches, not because its logically part of
b178bb3dfc30d9 Eric Dumazet 2010-11-16 411 * backlog.
fa438ccfdfd3f6 Eric Dumazet 2007-03-04 412 */
fa438ccfdfd3f6 Eric Dumazet 2007-03-04 413 struct {
b178bb3dfc30d9 Eric Dumazet 2010-11-16 414 atomic_t rmem_alloc;
b178bb3dfc30d9 Eric Dumazet 2010-11-16 415 int len;
fa438ccfdfd3f6 Eric Dumazet 2007-03-04 416 struct sk_buff *head;
fa438ccfdfd3f6 Eric Dumazet 2007-03-04 417 struct sk_buff *tail;
fa438ccfdfd3f6 Eric Dumazet 2007-03-04 418 } sk_backlog;
f35f821935d8df Eric Dumazet 2021-11-15 419
On Mon, May 9, 2022 at 6:36 PM kernel test robot <lkp@intel.com> wrote: > > Hi Eric, > > Thank you for the patch! Yet something to improve: > > [auto build test ERROR on net-next/master] > > url: https://github.com/intel-lab-lkp/linux/commits/Eric-Dumazet/tcp-BIG-TCP-implementation/20220510-062530 > base: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git 9c095bd0d4c451d31d0fd1131cc09d3b60de815d > config: um-i386_defconfig (https://download.01.org/0day-ci/archive/20220510/202205100923.RHeXqtNd-lkp@intel.com/config) > compiler: gcc-11 (Debian 11.2.0-20) 11.2.0 > reproduce (this is a W=1 build): > # https://github.com/intel-lab-lkp/linux/commit/8f9b47ee99f57d1747010d002315092bfa17ed50 > git remote add linux-review https://github.com/intel-lab-lkp/linux > git fetch --no-tags linux-review Eric-Dumazet/tcp-BIG-TCP-implementation/20220510-062530 > git checkout 8f9b47ee99f57d1747010d002315092bfa17ed50 > # save the config file > mkdir build_dir && cp config build_dir/.config > make W=1 O=build_dir ARCH=um SUBARCH=i386 SHELL=/bin/bash > > If you fix the issue, kindly add following tag as appropriate > Reported-by: kernel test robot <lkp@intel.com> > > All errors (new ones prefixed by >>): > > In file included from include/net/inet_sock.h:22, > from include/net/ip.h:29, > from include/linux/errqueue.h:6, > from net/core/sock.c:91: > net/core/sock.c: In function 'sk_setup_caps': > >> include/net/sock.h:389:37: error: 'struct sock_common' has no member named 'skc_v6_rcv_saddr'; did you mean 'skc_rcv_saddr'? > 389 | #define sk_v6_rcv_saddr __sk_common.skc_v6_rcv_saddr > | ^~~~~~~~~~~~~~~~ > net/core/sock.c:2317:72: note: in expansion of macro 'sk_v6_rcv_saddr' > 2317 | !sk_is_tcp(sk) || ipv6_addr_v4mapped(&sk->sk_v6_rcv_saddr))) > | ^~~~~~~~~~~~~~~ > > Alexander used : + if (sk->sk_gso_max_size > GSO_LEGACY_MAX_SIZE && + (!IS_ENABLED(CONFIG_IPV6) || sk->sk_family != AF_INET6 || + !sk_is_tcp(sk) || ipv6_addr_v4mapped(&sk->sk_v6_rcv_saddr))) + sk->sk_gso_max_size = GSO_LEGACY_MAX_SIZE; I guess we could simply allow gso_max_size to be bigger than GSO_LEGACY_MAX_SIZE only if IS_ENABLED(CONFIG_IPV6) So the above code could really be: #if IS_ENABLED(CONFIG_IPV6) if (sk->sk_gso_max_size > GSO_LEGACY_MAX_SIZE && (sk->sk_family != AF_INET6 || !sk_is_tcp(sk) || ipv6_addr_v4mapped(&sk->sk_v6_rcv_saddr))) sk->sk_gso_max_size = GSO_LEGACY_MAX_SIZE; #endif
On Mon, May 9, 2022 at 7:09 PM Eric Dumazet <edumazet@google.com> wrote: > > > Alexander used : > > + if (sk->sk_gso_max_size > GSO_LEGACY_MAX_SIZE && > + (!IS_ENABLED(CONFIG_IPV6) || sk->sk_family > != AF_INET6 || > + !sk_is_tcp(sk) || > ipv6_addr_v4mapped(&sk->sk_v6_rcv_saddr))) > + sk->sk_gso_max_size = GSO_LEGACY_MAX_SIZE; > > I guess we could simply allow gso_max_size to be bigger than > GSO_LEGACY_MAX_SIZE only > if IS_ENABLED(CONFIG_IPV6) > > So the above code could really be: > > #if IS_ENABLED(CONFIG_IPV6) > if (sk->sk_gso_max_size > GSO_LEGACY_MAX_SIZE && > (sk->sk_family != AF_INET6 || > !sk_is_tcp(sk) || > ipv6_addr_v4mapped(&sk->sk_v6_rcv_saddr))) > sk->sk_gso_max_size = GSO_LEGACY_MAX_SIZE; > #endif In v6, I will squash the following diff to Alexander patch: diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index dfd57a647c97ed0f400ffe89c73919367a900f75..6bd9e09b34ec583a05a929ca979511e6423dbeb7 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -2271,8 +2271,13 @@ struct net_device { /* TCP minimal MSS is 8 (TCP_MIN_GSO_SIZE), * and shinfo->gso_segs is a 16bit field. + * If IPV6 is not enabled, we keep legacy value. */ +#if IS_ENABLED(CONFIG_IPV6) #define GSO_MAX_SIZE (8 * GSO_MAX_SEGS) +#else +#define GSO_MAX_SIZE GSO_LEGACY_MAX_SIZE +#endif unsigned int gso_max_size; #define TSO_LEGACY_MAX_SIZE 65536 diff --git a/net/core/dev.c b/net/core/dev.c index 7349f75891d5724a060781abc80a800bdf835f74..4be3695846520af18a687cdcaa70c5f327ba94e8 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -3003,7 +3003,7 @@ EXPORT_SYMBOL(netif_set_real_num_queues); */ void netif_set_tso_max_size(struct net_device *dev, unsigned int size) { - dev->tso_max_size = size; + dev->tso_max_size = min(GSO_MAX_SIZE, size); if (size < READ_ONCE(dev->gso_max_size)) netif_set_gso_max_size(dev, size); } diff --git a/net/core/sock.c b/net/core/sock.c index f7c3171078b6fccd25757e8fe54dd56a2a674238..2a931f396472108ccedcd3d08189c63775caecff 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -2312,10 +2312,13 @@ void sk_setup_caps(struct sock *sk, struct dst_entry *dst) sk->sk_route_caps |= NETIF_F_SG | NETIF_F_HW_CSUM; /* pairs with the WRITE_ONCE() in netif_set_gso_max_size() */ sk->sk_gso_max_size = READ_ONCE(dst->dev->gso_max_size); +#if IS_ENABLED(CONFIG_IPV6) if (sk->sk_gso_max_size > GSO_LEGACY_MAX_SIZE && - (!IS_ENABLED(CONFIG_IPV6) || sk->sk_family != AF_INET6 || - !sk_is_tcp(sk) || ipv6_addr_v4mapped(&sk->sk_v6_rcv_saddr))) + (sk->sk_family != AF_INET6 || + !sk_is_tcp(sk) || + ipv6_addr_v4mapped(&sk->sk_v6_rcv_saddr))) sk->sk_gso_max_size = GSO_LEGACY_MAX_SIZE; +#endif sk->sk_gso_max_size -= (MAX_TCP_HEADER + 1); /* pairs with the WRITE_ONCE() in netif_set_gso_max_segs() */ max_segs = max_t(u32, READ_ONCE(dst->dev->gso_max_segs), 1);
Hi Eric, Thank you for the patch! Yet something to improve: [auto build test ERROR on net-next/master] url: https://github.com/intel-lab-lkp/linux/commits/Eric-Dumazet/tcp-BIG-TCP-implementation/20220510-062530 base: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git 9c095bd0d4c451d31d0fd1131cc09d3b60de815d config: arm-spear3xx_defconfig (https://download.01.org/0day-ci/archive/20220510/202205101045.zaceqBiC-lkp@intel.com/config) compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project 3abb68a626160e019c30a4860e569d7bc75e486a) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # install arm cross compiling tool for clang build # apt-get install binutils-arm-linux-gnueabi # https://github.com/intel-lab-lkp/linux/commit/8f9b47ee99f57d1747010d002315092bfa17ed50 git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Eric-Dumazet/tcp-BIG-TCP-implementation/20220510-062530 git checkout 8f9b47ee99f57d1747010d002315092bfa17ed50 # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=arm SHELL=/bin/bash If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All errors (new ones prefixed by >>): >> net/core/sock.c:2317:51: error: no member named 'skc_v6_rcv_saddr' in 'struct sock_common'; did you mean 'skc_rcv_saddr'? !sk_is_tcp(sk) || ipv6_addr_v4mapped(&sk->sk_v6_rcv_saddr))) ^ include/net/sock.h:389:37: note: expanded from macro 'sk_v6_rcv_saddr' #define sk_v6_rcv_saddr __sk_common.skc_v6_rcv_saddr ^ include/net/sock.h:171:11: note: 'skc_rcv_saddr' declared here __be32 skc_rcv_saddr; ^ 1 error generated. vim +2317 net/core/sock.c 2295 2296 void sk_setup_caps(struct sock *sk, struct dst_entry *dst) 2297 { 2298 u32 max_segs = 1; 2299 2300 sk_dst_set(sk, dst); 2301 sk->sk_route_caps = dst->dev->features; 2302 if (sk_is_tcp(sk)) 2303 sk->sk_route_caps |= NETIF_F_GSO; 2304 if (sk->sk_route_caps & NETIF_F_GSO) 2305 sk->sk_route_caps |= NETIF_F_GSO_SOFTWARE; 2306 if (unlikely(sk->sk_gso_disabled)) 2307 sk->sk_route_caps &= ~NETIF_F_GSO_MASK; 2308 if (sk_can_gso(sk)) { 2309 if (dst->header_len && !xfrm_dst_offload_ok(dst)) { 2310 sk->sk_route_caps &= ~NETIF_F_GSO_MASK; 2311 } else { 2312 sk->sk_route_caps |= NETIF_F_SG | NETIF_F_HW_CSUM; 2313 /* pairs with the WRITE_ONCE() in netif_set_gso_max_size() */ 2314 sk->sk_gso_max_size = READ_ONCE(dst->dev->gso_max_size); 2315 if (sk->sk_gso_max_size > GSO_LEGACY_MAX_SIZE && 2316 (!IS_ENABLED(CONFIG_IPV6) || sk->sk_family != AF_INET6 || > 2317 !sk_is_tcp(sk) || ipv6_addr_v4mapped(&sk->sk_v6_rcv_saddr))) 2318 sk->sk_gso_max_size = GSO_LEGACY_MAX_SIZE; 2319 sk->sk_gso_max_size -= (MAX_TCP_HEADER + 1); 2320 /* pairs with the WRITE_ONCE() in netif_set_gso_max_segs() */ 2321 max_segs = max_t(u32, READ_ONCE(dst->dev->gso_max_segs), 1); 2322 } 2323 } 2324 sk->sk_gso_max_segs = max_segs; 2325 } 2326 EXPORT_SYMBOL_GPL(sk_setup_caps); 2327
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe.h b/drivers/net/ethernet/amd/xgbe/xgbe.h index 607a2c90513b529ca0383410a3f513d98a75a72f..d9547552ceefe1d291155ab7619a5f2fa6296340 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe.h +++ b/drivers/net/ethernet/amd/xgbe/xgbe.h @@ -151,7 +151,8 @@ #define XGBE_TX_MAX_BUF_SIZE (0x3fff & ~(64 - 1)) /* Descriptors required for maximum contiguous TSO/GSO packet */ -#define XGBE_TX_MAX_SPLIT ((GSO_MAX_SIZE / XGBE_TX_MAX_BUF_SIZE) + 1) +#define XGBE_TX_MAX_SPLIT \ + ((GSO_LEGACY_MAX_SIZE / XGBE_TX_MAX_BUF_SIZE) + 1) /* Maximum possible descriptors needed for an SKB: * - Maximum number of SKB frags diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c index fb11081001a088fcddde68b88bae1da65a3f2c06..838870bc6dbd6e3a3d8c9443ff4675a0e411006b 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c @@ -2038,7 +2038,7 @@ mlx5e_hw_gro_skb_has_enough_space(struct sk_buff *skb, u16 data_bcnt) { int nr_frags = skb_shinfo(skb)->nr_frags; - return PAGE_SIZE * nr_frags + data_bcnt <= GSO_MAX_SIZE; + return PAGE_SIZE * nr_frags + data_bcnt <= GRO_MAX_SIZE; } static void diff --git a/drivers/net/ethernet/sfc/ef100_nic.c b/drivers/net/ethernet/sfc/ef100_nic.c index a69d756e09b9316660aea5a48d07d86af9cd9112..b2536d2c218a6db8acf1e8a5802860639c5e71a6 100644 --- a/drivers/net/ethernet/sfc/ef100_nic.c +++ b/drivers/net/ethernet/sfc/ef100_nic.c @@ -1008,7 +1008,8 @@ static int ef100_process_design_param(struct efx_nic *efx, } return 0; case ESE_EF100_DP_GZ_TSO_MAX_PAYLOAD_LEN: - nic_data->tso_max_payload_len = min_t(u64, reader->value, GSO_MAX_SIZE); + nic_data->tso_max_payload_len = min_t(u64, reader->value, + GSO_LEGACY_MAX_SIZE); netif_set_tso_max_size(efx->net_dev, nic_data->tso_max_payload_len); return 0; diff --git a/drivers/net/ethernet/sfc/falcon/tx.c b/drivers/net/ethernet/sfc/falcon/tx.c index f7306e93a8b8db9b220c5c3b95dc95c7eaaf2580..b9369483758cd6ebcd263852542175610b4d2789 100644 --- a/drivers/net/ethernet/sfc/falcon/tx.c +++ b/drivers/net/ethernet/sfc/falcon/tx.c @@ -98,7 +98,8 @@ unsigned int ef4_tx_max_skb_descs(struct ef4_nic *efx) /* Possibly more for PCIe page boundaries within input fragments */ if (PAGE_SIZE > EF4_PAGE_SIZE) max_descs += max_t(unsigned int, MAX_SKB_FRAGS, - DIV_ROUND_UP(GSO_MAX_SIZE, EF4_PAGE_SIZE)); + DIV_ROUND_UP(GSO_LEGACY_MAX_SIZE, + EF4_PAGE_SIZE)); return max_descs; } diff --git a/drivers/net/ethernet/sfc/tx_common.c b/drivers/net/ethernet/sfc/tx_common.c index 9bc8281b7f5bdd3d95924c6f8294d39202424a27..658ea2d340704d186bb9f94ad24497cbd2d15752 100644 --- a/drivers/net/ethernet/sfc/tx_common.c +++ b/drivers/net/ethernet/sfc/tx_common.c @@ -416,7 +416,8 @@ unsigned int efx_tx_max_skb_descs(struct efx_nic *efx) /* Possibly more for PCIe page boundaries within input fragments */ if (PAGE_SIZE > EFX_PAGE_SIZE) max_descs += max_t(unsigned int, MAX_SKB_FRAGS, - DIV_ROUND_UP(GSO_MAX_SIZE, EFX_PAGE_SIZE)); + DIV_ROUND_UP(GSO_LEGACY_MAX_SIZE, + EFX_PAGE_SIZE)); return max_descs; } diff --git a/drivers/net/ethernet/synopsys/dwc-xlgmac.h b/drivers/net/ethernet/synopsys/dwc-xlgmac.h index 98e3a271e017ae17f23866beab8021d2f2ab26c0..a848e10f3ea457da1b17571df6a35b077a96c794 100644 --- a/drivers/net/ethernet/synopsys/dwc-xlgmac.h +++ b/drivers/net/ethernet/synopsys/dwc-xlgmac.h @@ -38,7 +38,8 @@ #define XLGMAC_RX_DESC_MAX_DIRTY (XLGMAC_RX_DESC_CNT >> 3) /* Descriptors required for maximum contiguous TSO/GSO packet */ -#define XLGMAC_TX_MAX_SPLIT ((GSO_MAX_SIZE / XLGMAC_TX_MAX_BUF_SIZE) + 1) +#define XLGMAC_TX_MAX_SPLIT \ + ((GSO_LEGACY_MAX_SIZE / XLGMAC_TX_MAX_BUF_SIZE) + 1) /* Maximum possible descriptors needed for a SKB */ #define XLGMAC_TX_MAX_DESC_NR (MAX_SKB_FRAGS + XLGMAC_TX_MAX_SPLIT + 2) diff --git a/drivers/net/hyperv/rndis_filter.c b/drivers/net/hyperv/rndis_filter.c index 866af2cc27a3e0df11812d6ade17dde1d247ff4a..6da36cb8af8055eba338490b6bc7493181e8644c 100644 --- a/drivers/net/hyperv/rndis_filter.c +++ b/drivers/net/hyperv/rndis_filter.c @@ -1349,7 +1349,7 @@ static int rndis_netdev_set_hwcaps(struct rndis_device *rndis_device, struct net_device_context *net_device_ctx = netdev_priv(net); struct ndis_offload hwcaps; struct ndis_offload_params offloads; - unsigned int gso_max_size = GSO_MAX_SIZE; + unsigned int gso_max_size = GSO_LEGACY_MAX_SIZE; int ret; /* Find HW offload capabilities */ diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c index 44ca6110213caaf7222c8b69c6c3fc2a08687495..79b2827e4081b4015fc51ace4e1467214c45fd48 100644 --- a/drivers/scsi/fcoe/fcoe.c +++ b/drivers/scsi/fcoe/fcoe.c @@ -667,7 +667,7 @@ static void fcoe_netdev_features_change(struct fc_lport *lport, if (netdev->features & NETIF_F_FSO) { lport->seq_offload = 1; - lport->lso_max = netdev->gso_max_size; + lport->lso_max = min(netdev->gso_max_size, GSO_LEGACY_MAX_SIZE); FCOE_NETDEV_DBG(netdev, "Supports LSO for max len 0x%x\n", lport->lso_max); } else { diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 74c97a34921d48c593c08e2bed72e099f42520a3..9a34cc45b20a4465a9e1532c39f410b26604144f 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -2262,7 +2262,8 @@ struct net_device { const struct rtnl_link_ops *rtnl_link_ops; /* for setting kernel sock attribute on TCP connection setup */ -#define GSO_MAX_SIZE 65536 +#define GSO_LEGACY_MAX_SIZE 65536u +#define GSO_MAX_SIZE UINT_MAX unsigned int gso_max_size; #define TSO_LEGACY_MAX_SIZE 65536 #define TSO_MAX_SIZE UINT_MAX diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c index 8d54fef9a568a189d14253bcf01e3d586e746084..9b5a1f630bb0dbfe577c0f2a63094cb5872ade1d 100644 --- a/net/bpf/test_run.c +++ b/net/bpf/test_run.c @@ -1001,7 +1001,7 @@ static int convert___skb_to_skb(struct sk_buff *skb, struct __sk_buff *__skb) cb->pkt_len = skb->len; } else { if (__skb->wire_len < skb->len || - __skb->wire_len > GSO_MAX_SIZE) + __skb->wire_len > GSO_LEGACY_MAX_SIZE) return -EINVAL; cb->pkt_len = __skb->wire_len; } diff --git a/net/core/dev.c b/net/core/dev.c index f036ccb61da4da3ffc52c4f2402427054b831e8a..a1bbe000953f9365b4419f2ddbef96ddada42d3a 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -2998,7 +2998,8 @@ EXPORT_SYMBOL(netif_set_real_num_queues); * @size: max skb->len of a TSO frame * * Set the limit on the size of TSO super-frames the device can handle. - * Unless explicitly set the stack will assume the value of %GSO_MAX_SIZE. + * Unless explicitly set the stack will assume the value of + * %GSO_LEGACY_MAX_SIZE. */ void netif_set_tso_max_size(struct net_device *dev, unsigned int size) { @@ -10602,7 +10603,7 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name, dev_net_set(dev, &init_net); - dev->gso_max_size = GSO_MAX_SIZE; + dev->gso_max_size = GSO_LEGACY_MAX_SIZE; dev->gso_max_segs = GSO_MAX_SEGS; dev->gro_max_size = GRO_MAX_SIZE; dev->tso_max_size = TSO_LEGACY_MAX_SIZE; diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 21b117b710bf2154f11b6511de7d578d0eafb65e..823db8999a2c1d5959042393783492dbecf1352c 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -2809,7 +2809,7 @@ static int do_setlink(const struct sk_buff *skb, if (tb[IFLA_GSO_MAX_SIZE]) { u32 max_size = nla_get_u32(tb[IFLA_GSO_MAX_SIZE]); - if (max_size > GSO_MAX_SIZE || max_size > dev->tso_max_size) { + if (max_size > dev->tso_max_size) { err = -EINVAL; goto errout; } diff --git a/net/core/sock.c b/net/core/sock.c index 6b287eb5427b32865d25fc22122fefeff3a4ccf5..f7c3171078b6fccd25757e8fe54dd56a2a674238 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -2312,6 +2312,10 @@ void sk_setup_caps(struct sock *sk, struct dst_entry *dst) sk->sk_route_caps |= NETIF_F_SG | NETIF_F_HW_CSUM; /* pairs with the WRITE_ONCE() in netif_set_gso_max_size() */ sk->sk_gso_max_size = READ_ONCE(dst->dev->gso_max_size); + if (sk->sk_gso_max_size > GSO_LEGACY_MAX_SIZE && + (!IS_ENABLED(CONFIG_IPV6) || sk->sk_family != AF_INET6 || + !sk_is_tcp(sk) || ipv6_addr_v4mapped(&sk->sk_v6_rcv_saddr))) + sk->sk_gso_max_size = GSO_LEGACY_MAX_SIZE; sk->sk_gso_max_size -= (MAX_TCP_HEADER + 1); /* pairs with the WRITE_ONCE() in netif_set_gso_max_segs() */ max_segs = max_t(u32, READ_ONCE(dst->dev->gso_max_segs), 1); diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c index c7d30a3bbd81d27e16e800ec446569b93a4123ba..075e744bfb4829c087f4a85448e2f778dba439b4 100644 --- a/net/ipv4/tcp_bbr.c +++ b/net/ipv4/tcp_bbr.c @@ -310,7 +310,7 @@ static u32 bbr_tso_segs_goal(struct sock *sk) */ bytes = min_t(unsigned long, sk->sk_pacing_rate >> READ_ONCE(sk->sk_pacing_shift), - GSO_MAX_SIZE - 1 - MAX_TCP_HEADER); + GSO_LEGACY_MAX_SIZE - 1 - MAX_TCP_HEADER); segs = max_t(u32, bytes / tp->mss_cache, bbr_min_tso_segs(sk)); return min(segs, 0x7FU); diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index b092228e434261f45f79cc6c1fad613e0bb045c0..b4b2284ed4a2c9e2569bd945e3b4e023c5502f25 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c @@ -1553,7 +1553,7 @@ int tcp_fragment(struct sock *sk, enum tcp_queue tcp_queue, * SO_SNDBUF values. * Also allow first and last skb in retransmit queue to be split. */ - limit = sk->sk_sndbuf + 2 * SKB_TRUESIZE(GSO_MAX_SIZE); + limit = sk->sk_sndbuf + 2 * SKB_TRUESIZE(GSO_LEGACY_MAX_SIZE); if (unlikely((sk->sk_wmem_queued >> 1) > limit && tcp_queue != TCP_FRAG_IN_WRITE_QUEUE && skb != tcp_rtx_queue_head(sk) && diff --git a/net/sctp/output.c b/net/sctp/output.c index 72fe6669c50de2c76842cf50d039b65a61943bd8..a63df055ac57d551e89edfb3a4982768a318cf67 100644 --- a/net/sctp/output.c +++ b/net/sctp/output.c @@ -134,7 +134,8 @@ void sctp_packet_config(struct sctp_packet *packet, __u32 vtag, dst_hold(tp->dst); sk_setup_caps(sk, tp->dst); } - packet->max_size = sk_can_gso(sk) ? READ_ONCE(tp->dst->dev->gso_max_size) + packet->max_size = sk_can_gso(sk) ? min(READ_ONCE(tp->dst->dev->gso_max_size), + GSO_LEGACY_MAX_SIZE) : asoc->pathmtu; rcu_read_unlock(); }