xfrm_state_afinfo is a very large struct; its over 4kbyte on 64bit systems.
The size comes from two arrays to store the l4 protocol type pointers (esp, ah, ipcomp and so on). There are only a handful of those, so just use pointers for protocols that we implement instead of mostly-empty arrays. This also removes the template init/sort related indirections. Structure size goes down to 120 bytes on x86_64. include/net/xfrm.h | 49 ++--- net/ipv4/ah4.c | 3 net/ipv4/esp4.c | 3 net/ipv4/esp4_offload.c | 4 net/ipv4/ipcomp.c | 3 net/ipv4/xfrm4_state.c | 45 ----- net/ipv4/xfrm4_tunnel.c | 3 net/ipv6/ah6.c | 4 net/ipv6/esp6.c | 3 net/ipv6/esp6_offload.c | 4 net/ipv6/ipcomp6.c | 3 net/ipv6/mip6.c | 6 net/ipv6/xfrm6_state.c | 137 ---------------- net/xfrm/xfrm_input.c | 24 +- net/xfrm/xfrm_policy.c | 2 net/xfrm/xfrm_state.c | 400 +++++++++++++++++++++++++++++++++++------------- 16 files changed, 343 insertions(+), 350 deletions(-) Florian Westphal (6): xfrm: remove init_tempsel indirection from xfrm_state_afinfo xfrm: remove init_temprop indirection from xfrm_state_afinfo xfrm: remove init_flags indirection from xfrm_state_afinfo xfrm: remove state and template sort indirections from xfrm_state_afinfo xfrm: remove eth_proto value from xfrm_state_afinfo xfrm: remove type and offload_type map from xfrm_state_afinfo