]> git.ipfire.org Git - thirdparty/kernel/linux.git/commit
xfrm: reduce struct sec_path size
authorPaolo Abeni <pabeni@redhat.com>
Fri, 6 Feb 2026 17:14:36 +0000 (18:14 +0100)
committerJakub Kicinski <kuba@kernel.org>
Wed, 11 Feb 2026 04:21:48 +0000 (20:21 -0800)
commitdc010e1b4bb63d7b24854a3a332c97a78fad15d7
tree677dcf5b6051260d8f25ddaa0b60fa183fa7a8bb
parente72d4c537f40bcefe2cac1276d35228e86074cab
xfrm: reduce struct sec_path size

The mentioned struct has an hole and uses unnecessary wide type to
store MAC length and indexes of very small arrays.

It's also embedded into the skb_extensions, and the latter, due
to recent CAN changes, may exceeds the 192 bytes mark (3 cachelines
on x86_64 arch) on some reasonable configurations.

Reordering and the sec_path fields, shrinking xfrm_offload.orig_mac_len
to 16 bits and xfrm_offload.{len,olen,verified_cnt} to u8, we can save
16 bytes and keep skb_extensions size under control.

Before:

struct sec_path {
int                        len;
int                        olen;
int                        verified_cnt;

/* XXX 4 bytes hole, try to pack */$
struct xfrm_state *        xvec[6];
struct xfrm_offload ovec[1];

/* size: 88, cachelines: 2, members: 5 */
/* sum members: 84, holes: 1, sum holes: 4 */
/* last cacheline: 24 bytes */
};

After:

struct sec_path {
struct xfrm_state *        xvec[6];
struct xfrm_offload        ovec[1];
/* typedef u8 -> __u8 */ unsigned char              len;
/* typedef u8 -> __u8 */ unsigned char              olen;
/* typedef u8 -> __u8 */ unsigned char              verified_cnt;

/* size: 72, cachelines: 2, members: 5 */
/* padding: 1 */
/* last cacheline: 8 bytes */
};

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Florian Westphal <fw@strlen.de>
Reviewed-by: Steffen Klassert <steffen.klassert@secunet.com>
Link: https://patch.msgid.link/83846bd2e3fa08899bd0162e41bfadfec95e82ef.1770398071.git.pabeni@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/xfrm.h