]> git.ipfire.org Git - thirdparty/linux.git/commit
ipv6: Move ipv6_fl_list from ipv6_pinfo to inet_sock.
authorKuniyuki Iwashima <kuniyu@google.com>
Tue, 14 Oct 2025 22:42:07 +0000 (22:42 +0000)
committerJakub Kicinski <kuba@kernel.org>
Fri, 17 Oct 2025 23:06:52 +0000 (16:06 -0700)
commit1c17f4373d4db1e1f0ebd3ddcd8e7a642927a826
tree5e0f389d4c438634f8ede1c10435739d34cea71c
parent0746da01767e8a0df97ae5d031d852e932e03682
ipv6: Move ipv6_fl_list from ipv6_pinfo to inet_sock.

In {tcp6,udp6,raw6}_sock, struct ipv6_pinfo is always placed at
the beginning of a new cache line because

  1. __alignof__(struct tcp_sock) is 64 due to ____cacheline_aligned
     of __cacheline_group_begin(tcp_sock_write_tx)

  2. __alignof__(struct udp_sock) is 64 due to ____cacheline_aligned
     of struct numa_drop_counters

  3. in raw6_sock, struct numa_drop_counters is placed before
     struct ipv6_pinfo

.  struct ipv6_pinfo is 136 bytes, but the last cache line is
only used by ipv6_fl_list:

  $ pahole -C ipv6_pinfo vmlinux
  struct ipv6_pinfo {
  ...
   /* --- cacheline 2 boundary (128 bytes) --- */
   struct ipv6_fl_socklist *  ipv6_fl_list;         /*   128     8 */

   /* size: 136, cachelines: 3, members: 23 */

Let's move ipv6_fl_list from struct ipv6_pinfo to struct inet_sock
to save a full cache line for {tcp6,udp6,raw6}_sock.

Now, struct ipv6_pinfo is 128 bytes, and {tcp6,udp6,raw6}_sock have
64 bytes less, while {tcp,udp,raw}_sock retain the same size.

Before:

  # grep -E "^(RAW|UDP[^L\-]|TCP)" /proc/slabinfo | awk '{print $1, "\t", $4}'
  RAWv6   1408
  UDPv6   1472
  TCPv6   2560
  RAW   1152
  UDP    1280
  TCP   2368

After:

  # grep -E "^(RAW|UDP[^L\-]|TCP)" /proc/slabinfo | awk '{print $1, "\t", $4}'
  RAWv6   1344
  UDPv6   1408
  TCPv6   2496
  RAW   1152
  UDP    1280
  TCP   2368

Also, ipv6_fl_list and inet_flags (SNDFLOW bit) are placed in the
same cache line.

  $ pahole -C inet_sock vmlinux
  ...
   /* --- cacheline 11 boundary (704 bytes) was 56 bytes ago --- */
   struct ipv6_pinfo *        pinet6;               /*   760     8 */
   /* --- cacheline 12 boundary (768 bytes) --- */
   struct ipv6_fl_socklist *  ipv6_fl_list;         /*   768     8 */
   unsigned long              inet_flags;           /*   776     8 */

Doc churn is due to the insufficient Type column (only 1 space short).

Suggested-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Kuniyuki Iwashima <kuniyu@google.com>
Link: https://patch.msgid.link/20251014224210.2964778-1-kuniyu@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Documentation/networking/net_cachelines/inet_sock.rst
drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c
include/linux/ipv6.h
include/net/inet_sock.h
net/ipv6/ip6_flowlabel.c
net/ipv6/tcp_ipv6.c
net/sctp/ipv6.c