Re: include/linux/build_bug.h:78:41: error: static assertion failed: "struct bpf_fib_lookup size check"

From: Alexander Lobakin
Date: Wed Apr 03 2024 - 06:14:43 EST


From: Anton Protopopov <aspsk@xxxxxxxxxxxxx>
Date: Wed, 3 Apr 2024 12:09:29 +0200

> On Wed, Apr 3, 2024 at 11:57 AM Anton Protopopov <aspsk@xxxxxxxxxxxxx> wrote:
>>
>> On Wed, Apr 3, 2024 at 11:39 AM Alexander Lobakin
>> <aleksander.lobakin@xxxxxxxxx> wrote:
>>>
>>> From: Arnd Bergmann <arnd@xxxxxxxx>
>>> Date: Wed, 03 Apr 2024 10:45:36 +0200
>>>
>>>> On Wed, Apr 3, 2024, at 10:10, Anton Protopopov wrote:
>>>>> On Wed, Apr 3, 2024 at 10:03 AM Naresh Kamboju
>>>>> <naresh.kamboju@xxxxxxxxxx> wrote:
>>>>>>
>>>>>> The arm footbridge_defconfig failed with gcc-13 and gcc-8 on Linux next
>>>>>> starting from next-20240328..next-20240402.
>>>>>>
>>>>>> arm:
>>>>>> build:
>>>>>> * gcc-8-footbridge_defconfig - Failed
>>>>>> * gcc-13-footbridge_defconfig - Failed
>>>>>>
>>>>>> Reported-by: Linux Kernel Functional Testing <lkft@xxxxxxxxxx>
>>>>>>
>>>>>> In file included from include/linux/bitfield.h:10,
>>>>>> from arch/arm/include/asm/ptrace.h:13,
>>>>>> from arch/arm/include/asm/processor.h:14,
>>>>>> from include/linux/prefetch.h:15,
>>>>>> from arch/arm/include/asm/atomic.h:12,
>>>>>> from include/linux/atomic.h:7,
>>>>>> from net/core/filter.c:20:
>>>>>> include/linux/build_bug.h:78:41: error: static assertion failed:
>>>>>> "struct bpf_fib_lookup size check"
>>>>>> 78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
>>>>>> | ^~~~~~~~~~~~~~
>>>>>
>>>>> Thanks, I will take a look today
>>>
>>> Naresh,
>>>
>>> Could you please remove that static_assert() and dump bpf_bif_lookup
>>> layout from pahole?
>>>
>>> Anton unionized { smac, dmac } with __u32 mark. On x86_64, the offset of
>>> smac was 52 (aligned to 4) already, so I don't really get what AEABI
>>> does here. IIRC it aligns every structure to 8 bytes?
>>>
>>> Maybe we could just add __attribute__((__packed__))
>>> __attribute__((__aligned__(4))) to that anonymous union at the end.
>>
>> Yeah, I am sending a patch for this right now. Better not to depend on
>> compiler options
>
> One __packed__ was not enough though. The problem was also with the
> union of two __u16's which is padded to be 32 bits when AEABI=n and
> the whole structure is packed (so total size is 66 in this case).

Hmm, on my setup it's 64 bytes. Since it's UAPI, it always must be of
the same size. There's probably a padding somewhere in the middle.

Also, don't forget to always set __aligned__(4 or 8) together with
__packed__, otherwise the compilers generate terrible code (they assume
the structure alignment is 1 and access to every field can be unaligned).

Thanks,
Olek