On Tue, Mar 10, 2020 at 04:32:28PM +0900, Yoshiki Komachi wrote: > btf_enum_check_member() checked if the size of "enum" as a struct > member exceeded struct_size or not. Then, the function compared it > with the size of "int". Although the size of "enum" is 4-byte by > default (i.e., equivalent to "int"), the packing feature enables > us to reduce it, as illustrated by the following example: > > struct A { > char m; > enum { E0, E1 } __attribute__((packed)) n; > }; > > With such a setup above, the bpf loader gave an error attempting > to load it: > > ------------------------------------------------------------------ > ... > > [3] ENUM (anon) size=1 vlen=2 > E0 val=0 > E1 val=1 > [4] STRUCT A size=2 vlen=2 > m type_id=2 bits_offset=0 > n type_id=3 bits_offset=8 > > [4] STRUCT A size=2 vlen=2 > n type_id=3 bits_offset=8 Member exceeds struct_size > > libbpf: Error loading .BTF into kernel: -22. > > ------------------------------------------------------------------ > > The related issue was previously fixed by the commit 9eea98497951 ("bpf: > fix BTF verification of enums"). On the other hand, this series fixes > this issue as well, and adds a selftest program for it. > > Changes in v2: > - change an example in commit message based on Andrii's review > - add a selftest program for packed "enum" type members in struct/union Acked-by: Martin KaFai Lau <kafai@xxxxxx>