From: Anton Protopopov <aspsk@xxxxxxxxxxxxx> Date: Wed, 3 Apr 2024 14:33:03 +0200 > The struct bpf_fib_lookup is supposed to be of size 64. A recent commit > 59b418c7063d ("bpf: Add a check for struct bpf_fib_lookup size") added > a static assertion to check this property so that future changes to the > structure will not accidentally break this assumption. > > As it immediately turned out, on some 32-bit arm systems, when AEABI=n, > the total size of the structure was equal to 68, see [1]. This happened > because the bpf_fib_lookup structure contains a union of two 16-bit > fields: > > union { > __u16 tot_len; > __u16 mtu_result; > }; > > which was supposed to compile to a 16-bit-aligned 16-bit field. On the > aforementioned setups it was instead both aligned and padded to 32-bits. > > Declare this inner union as __attribute__((packed, aligned(2))) such > that it always is of size 2 and is aligned to 16 bits. > > [1] https://lore.kernel.org/all/CA+G9fYtsoP51f-oP_Sp5MOq-Ffv8La2RztNpwvE6+R1VtFiLrw@xxxxxxxxxxxxxx/#t > > Signed-off-by: Anton Protopopov <aspsk@xxxxxxxxxxxxx> Reviewed-by: Alexander Lobakin <aleksander.lobakin@xxxxxxxxx> > --- > include/uapi/linux/bpf.h | 2 +- > tools/include/uapi/linux/bpf.h | 2 +- > 2 files changed, 2 insertions(+), 2 deletions(-) > > diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h > index 79c548276b6b..6fe9f11c8abe 100644 > --- a/include/uapi/linux/bpf.h > +++ b/include/uapi/linux/bpf.h > @@ -7157,7 +7157,7 @@ struct bpf_fib_lookup { > > /* output: MTU value */ > __u16 mtu_result; > - }; > + } __attribute__((packed, aligned(2))); > /* input: L3 device index for lookup > * output: device index from FIB lookup > */ > diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h > index 79c548276b6b..6fe9f11c8abe 100644 > --- a/tools/include/uapi/linux/bpf.h > +++ b/tools/include/uapi/linux/bpf.h > @@ -7157,7 +7157,7 @@ struct bpf_fib_lookup { > > /* output: MTU value */ > __u16 mtu_result; > - }; > + } __attribute__((packed, aligned(2))); > /* input: L3 device index for lookup > * output: device index from FIB lookup > */ Thanks, Olek