mbox series

[v2,net-next,00/18] net: group together hot data

Message ID 20240306160031.874438-1-edumazet@google.com (mailing list archive)
Headers show
Series net: group together hot data | expand

Message

Eric Dumazet March 6, 2024, 4 p.m. UTC
While our recent structure reorganizations were focused
on increasing max throughput, there is still an
area where improvements are much needed.

In many cases, a cpu handles one packet at a time,
instead of a nice batch.

Hardware interrupt.
 -> Software interrupt.
   -> Network/Protocol stacks.

If the cpu was idle or busy in other layers,
it has to pull many cache lines.

This series adds a new net_hotdata structure, where
some critical (and read-mostly) data used in
rx and tx path is packed in a small number of cache lines.

Synthetic benchmarks will not see much difference,
but latency of single packet should improve.

net_hodata current size on 64bit is 416 bytes,
but might grow in the future.

Also move RPS definitions to a new include file.

v2: - Added tags from Soheil and David (Thanks!)
    - took care of CONFIG_IPV6=n (kernel test robot <lkp@intel.com>)
Closes: https://lore.kernel.org/oe-kbuild-all/202403061318.QMW92UEi-lkp@intel.com/

Eric Dumazet (18):
  net: introduce struct net_hotdata
  net: move netdev_budget and netdev_budget to net_hotdata
  net: move netdev_tstamp_prequeue into net_hotdata
  net: move ptype_all into net_hotdata
  net: move netdev_max_backlog to net_hotdata
  net: move ip_packet_offload and ipv6_packet_offload to net_hotdata
  net: move tcpv4_offload and tcpv6_offload to net_hotdata
  net: move dev_tx_weight to net_hotdata
  net: move dev_rx_weight to net_hotdata
  net: move skbuff_cache(s) to net_hotdata
  udp: move udpv4_offload and udpv6_offload to net_hotdata
  ipv6: move tcpv6_protocol and udpv6_protocol to net_hotdata
  inet: move tcp_protocol and udp_protocol to net_hotdata
  inet: move inet_ehash_secret and udp_ehash_secret into net_hotdata
  ipv6: move inet6_ehash_secret and udp6_ehash_secret into net_hotdata
  ipv6: move tcp_ipv6_hash_secret and udp_ipv6_hash_secret to
    net_hotdata
  net: introduce include/net/rps.h
  net: move rps_sock_flow_table to net_hotdata

 drivers/net/ethernet/intel/ice/ice_arfs.c     |   1 +
 .../net/ethernet/mellanox/mlx4/en_netdev.c    |   1 +
 .../net/ethernet/mellanox/mlx5/core/en_arfs.c |   1 +
 drivers/net/ethernet/sfc/rx_common.c          |   1 +
 drivers/net/ethernet/sfc/siena/rx_common.c    |   1 +
 drivers/net/tun.c                             |   1 +
 include/linux/netdevice.h                     |  88 ------------
 include/linux/skbuff.h                        |   1 -
 include/net/gro.h                             |   5 +-
 include/net/hotdata.h                         |  52 ++++++++
 include/net/protocol.h                        |   3 +
 include/net/rps.h                             | 125 ++++++++++++++++++
 include/net/sock.h                            |  35 -----
 kernel/bpf/cpumap.c                           |   4 +-
 net/bpf/test_run.c                            |   4 +-
 net/core/Makefile                             |   1 +
 net/core/dev.c                                |  58 +++-----
 net/core/dev.h                                |   3 -
 net/core/gro.c                                |  15 +--
 net/core/gro_cells.c                          |   3 +-
 net/core/gso.c                                |   4 +-
 net/core/hotdata.c                            |  22 +++
 net/core/net-procfs.c                         |   7 +-
 net/core/net-sysfs.c                          |   1 +
 net/core/skbuff.c                             |  44 +++---
 net/core/sysctl_net_core.c                    |  25 ++--
 net/core/xdp.c                                |   5 +-
 net/ipv4/af_inet.c                            |  49 +++----
 net/ipv4/inet_hashtables.c                    |   3 +-
 net/ipv4/tcp.c                                |   1 +
 net/ipv4/tcp_offload.c                        |  17 ++-
 net/ipv4/udp.c                                |   2 -
 net/ipv4/udp_offload.c                        |  17 ++-
 net/ipv6/af_inet6.c                           |   1 +
 net/ipv6/inet6_hashtables.c                   |   8 +-
 net/ipv6/ip6_offload.c                        |  18 +--
 net/ipv6/tcp_ipv6.c                           |  17 +--
 net/ipv6/tcpv6_offload.c                      |  16 +--
 net/ipv6/udp.c                                |  19 ++-
 net/ipv6/udp_offload.c                        |  21 ++-
 net/sched/sch_generic.c                       |   3 +-
 net/sctp/socket.c                             |   1 +
 net/xfrm/espintcp.c                           |   4 +-
 net/xfrm/xfrm_input.c                         |   3 +-
 44 files changed, 391 insertions(+), 320 deletions(-)
 create mode 100644 include/net/hotdata.h
 create mode 100644 include/net/rps.h
 create mode 100644 net/core/hotdata.c

Comments

patchwork-bot+netdevbpf@kernel.org March 8, 2024, 6 a.m. UTC | #1
Hello:

This series was applied to netdev/net-next.git (main)
by Jakub Kicinski <kuba@kernel.org>:

On Wed,  6 Mar 2024 16:00:13 +0000 you wrote:
> While our recent structure reorganizations were focused
> on increasing max throughput, there is still an
> area where improvements are much needed.
> 
> In many cases, a cpu handles one packet at a time,
> instead of a nice batch.
> 
> [...]

Here is the summary with links:
  - [v2,net-next,01/18] net: introduce struct net_hotdata
    https://git.kernel.org/netdev/net-next/c/2658b5a8a4ee
  - [v2,net-next,02/18] net: move netdev_budget and netdev_budget to net_hotdata
    https://git.kernel.org/netdev/net-next/c/ae6e22f7b7f0
  - [v2,net-next,03/18] net: move netdev_tstamp_prequeue into net_hotdata
    https://git.kernel.org/netdev/net-next/c/f59b5416c396
  - [v2,net-next,04/18] net: move ptype_all into net_hotdata
    https://git.kernel.org/netdev/net-next/c/0b91fa4bfb1c
  - [v2,net-next,05/18] net: move netdev_max_backlog to net_hotdata
    https://git.kernel.org/netdev/net-next/c/edbc666cdcbf
  - [v2,net-next,06/18] net: move ip_packet_offload and ipv6_packet_offload to net_hotdata
    https://git.kernel.org/netdev/net-next/c/61a0be1a5342
  - [v2,net-next,07/18] net: move tcpv4_offload and tcpv6_offload to net_hotdata
    https://git.kernel.org/netdev/net-next/c/0139806eebd6
  - [v2,net-next,08/18] net: move dev_tx_weight to net_hotdata
    https://git.kernel.org/netdev/net-next/c/26722dc74bf0
  - [v2,net-next,09/18] net: move dev_rx_weight to net_hotdata
    https://git.kernel.org/netdev/net-next/c/71c0de9bac9c
  - [v2,net-next,10/18] net: move skbuff_cache(s) to net_hotdata
    https://git.kernel.org/netdev/net-next/c/aa70d2d16f28
  - [v2,net-next,11/18] udp: move udpv4_offload and udpv6_offload to net_hotdata
    https://git.kernel.org/netdev/net-next/c/6a55ca6b0122
  - [v2,net-next,12/18] ipv6: move tcpv6_protocol and udpv6_protocol to net_hotdata
    https://git.kernel.org/netdev/net-next/c/4ea0875b9d89
  - [v2,net-next,13/18] inet: move tcp_protocol and udp_protocol to net_hotdata
    https://git.kernel.org/netdev/net-next/c/571bf020be9c
  - [v2,net-next,14/18] inet: move inet_ehash_secret and udp_ehash_secret into net_hotdata
    https://git.kernel.org/netdev/net-next/c/6e0735723ab4
  - [v2,net-next,15/18] ipv6: move inet6_ehash_secret and udp6_ehash_secret into net_hotdata
    https://git.kernel.org/netdev/net-next/c/5af674bb90a0
  - [v2,net-next,16/18] ipv6: move tcp_ipv6_hash_secret and udp_ipv6_hash_secret to net_hotdata
    https://git.kernel.org/netdev/net-next/c/df51b8456415
  - [v2,net-next,17/18] net: introduce include/net/rps.h
    https://git.kernel.org/netdev/net-next/c/490a79faf95e
  - [v2,net-next,18/18] net: move rps_sock_flow_table to net_hotdata
    https://git.kernel.org/netdev/net-next/c/ce7f49ab7415

You are awesome, thank you!