* [PATCH] bpf: avoid padding in struct bpf_common_attr
@ 2026-05-19 20:38 Arnd Bergmann
2026-05-19 20:52 ` Song Liu
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Arnd Bergmann @ 2026-05-19 20:38 UTC (permalink / raw)
To: Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
Eduard Zingerman, Kumar Kartikeya Dwivedi, Leon Hwang
Cc: Arnd Bergmann, Martin KaFai Lau, Song Liu, Yonghong Song,
Jiri Olsa, KP Singh, bpf, linux-kernel
From: Arnd Bergmann <arnd@arndb.de>
Building linux/bpf.h with -Wpadded shows an unintentionally
added portion of padding because of the 64-bit alignment:
./usr/include/linux/bpf.h:1510:1: error: padding struct size to alignment boundary with 4 bytes [-Werror=padded]
Avoid this by adding explicit padding.
Fixes: f28771c0691b ("bpf: Extend BPF syscall with common attributes support")
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
include/uapi/linux/bpf.h | 1 +
1 file changed, 1 insertion(+)
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
index cc4c0b62cdfa..0f0ec00cae4a 100644
--- a/include/uapi/linux/bpf.h
+++ b/include/uapi/linux/bpf.h
@@ -1507,6 +1507,7 @@ struct bpf_common_attr {
__u32 log_size;
__u32 log_level;
__u32 log_true_size;
+ __u32 __pad;
};
#define BPF_OBJ_NAME_LEN 16U
--
2.39.5
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [PATCH] bpf: avoid padding in struct bpf_common_attr 2026-05-19 20:38 [PATCH] bpf: avoid padding in struct bpf_common_attr Arnd Bergmann @ 2026-05-19 20:52 ` Song Liu 2026-05-20 7:51 ` Geert Uytterhoeven 2026-05-19 21:17 ` bot+bpf-ci 2026-05-19 22:17 ` Yonghong Song 2 siblings, 1 reply; 8+ messages in thread From: Song Liu @ 2026-05-19 20:52 UTC (permalink / raw) To: Arnd Bergmann Cc: Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko, Eduard Zingerman, Kumar Kartikeya Dwivedi, Leon Hwang, Arnd Bergmann, Martin KaFai Lau, Yonghong Song, Jiri Olsa, KP Singh, bpf, linux-kernel On Tue, May 19, 2026 at 1:39 PM Arnd Bergmann <arnd@kernel.org> wrote: > > From: Arnd Bergmann <arnd@arndb.de> > > Building linux/bpf.h with -Wpadded shows an unintentionally > added portion of padding because of the 64-bit alignment: > > ./usr/include/linux/bpf.h:1510:1: error: padding struct size to alignment boundary with 4 bytes [-Werror=padded] > > Avoid this by adding explicit padding. > > Fixes: f28771c0691b ("bpf: Extend BPF syscall with common attributes support") > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > --- > include/uapi/linux/bpf.h | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h > index cc4c0b62cdfa..0f0ec00cae4a 100644 > --- a/include/uapi/linux/bpf.h > +++ b/include/uapi/linux/bpf.h > @@ -1507,6 +1507,7 @@ struct bpf_common_attr { > __u32 log_size; > __u32 log_level; > __u32 log_true_size; > + __u32 __pad; > }; Can we instead add "__attribute__((aligned(8)));" here? Thanks, Song > > #define BPF_OBJ_NAME_LEN 16U > -- > 2.39.5 > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] bpf: avoid padding in struct bpf_common_attr 2026-05-19 20:52 ` Song Liu @ 2026-05-20 7:51 ` Geert Uytterhoeven 0 siblings, 0 replies; 8+ messages in thread From: Geert Uytterhoeven @ 2026-05-20 7:51 UTC (permalink / raw) To: Song Liu Cc: Arnd Bergmann, Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko, Eduard Zingerman, Kumar Kartikeya Dwivedi, Leon Hwang, Arnd Bergmann, Martin KaFai Lau, Yonghong Song, Jiri Olsa, KP Singh, bpf, linux-kernel Hi Song, On Tue, 19 May 2026 at 22:52, Song Liu <song@kernel.org> wrote: > On Tue, May 19, 2026 at 1:39 PM Arnd Bergmann <arnd@kernel.org> wrote: > > > > From: Arnd Bergmann <arnd@arndb.de> > > > > Building linux/bpf.h with -Wpadded shows an unintentionally > > added portion of padding because of the 64-bit alignment: > > > > ./usr/include/linux/bpf.h:1510:1: error: padding struct size to alignment boundary with 4 bytes [-Werror=padded] > > > > Avoid this by adding explicit padding. > > > > Fixes: f28771c0691b ("bpf: Extend BPF syscall with common attributes support") > > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > > --- > > include/uapi/linux/bpf.h | 1 + > > 1 file changed, 1 insertion(+) > > > > diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h > > index cc4c0b62cdfa..0f0ec00cae4a 100644 > > --- a/include/uapi/linux/bpf.h > > +++ b/include/uapi/linux/bpf.h > > @@ -1507,6 +1507,7 @@ struct bpf_common_attr { > > __u32 log_size; > > __u32 log_level; > > __u32 log_true_size; > > + __u32 __pad; > > }; > > Can we instead add "__attribute__((aligned(8)));" here? That won't help: 1. The structure is already aligned to 8 bytes, as the first member (out of context) is of type __aligned_u64, 2. Without explicit padding, there would still be an implicit hole at the end of the structure, causing a warning with -Wpadded. Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] bpf: avoid padding in struct bpf_common_attr 2026-05-19 20:38 [PATCH] bpf: avoid padding in struct bpf_common_attr Arnd Bergmann 2026-05-19 20:52 ` Song Liu @ 2026-05-19 21:17 ` bot+bpf-ci 2026-05-19 22:17 ` Yonghong Song 2 siblings, 0 replies; 8+ messages in thread From: bot+bpf-ci @ 2026-05-19 21:17 UTC (permalink / raw) To: arnd, ast, daniel, andrii, eddyz87, memxor, leon.hwang Cc: arnd, martin.lau, song, yonghong.song, jolsa, kpsingh, bpf, linux-kernel, ast, andrii, daniel, martin.lau, eddyz87, yonghong.song, clm, ihor.solodrai [-- Attachment #1: Type: text/plain, Size: 968 bytes --] > diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h > index aec171ccb6ef..bec33bd807dd 100644 > --- a/include/uapi/linux/bpf.h > +++ b/include/uapi/linux/bpf.h > @@ -1506,6 +1506,7 @@ struct bpf_common_attr { > __u32 log_size; > __u32 log_level; > __u32 log_true_size; > + __u32 __pad; > }; Song Liu raised an alternative approach in his review: could we use '__attribute__((aligned(8)))' on the struct instead of adding an explicit padding field? https://lore.kernel.org/bpf/CAPhsuW60EONo84VkYbYsLHdAPzpfZ+ig8z=+M6NEhiNj_--qtQ@mail.gmail.com/ This design question hasn't been addressed in the discussion. Was this alternative considered, and if so, what made the explicit padding approach preferable? --- AI reviewed your patch. Please fix the bug or email reply why it's not a bug. See: https://github.com/kernel-patches/vmtest/blob/master/ci/claude/README.md CI run summary: https://github.com/kernel-patches/bpf/actions/runs/26124721051 ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] bpf: avoid padding in struct bpf_common_attr 2026-05-19 20:38 [PATCH] bpf: avoid padding in struct bpf_common_attr Arnd Bergmann 2026-05-19 20:52 ` Song Liu 2026-05-19 21:17 ` bot+bpf-ci @ 2026-05-19 22:17 ` Yonghong Song 2026-05-20 6:36 ` Arnd Bergmann 2 siblings, 1 reply; 8+ messages in thread From: Yonghong Song @ 2026-05-19 22:17 UTC (permalink / raw) To: Arnd Bergmann, Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko, Eduard Zingerman, Kumar Kartikeya Dwivedi, Leon Hwang Cc: Arnd Bergmann, Martin KaFai Lau, Song Liu, Jiri Olsa, KP Singh, bpf, linux-kernel On 5/19/26 1:38 PM, Arnd Bergmann wrote: > From: Arnd Bergmann <arnd@arndb.de> > > Building linux/bpf.h with -Wpadded shows an unintentionally > added portion of padding because of the 64-bit alignment: > > ./usr/include/linux/bpf.h:1510:1: error: padding struct size to alignment boundary with 4 bytes [-Werror=padded] > > Avoid this by adding explicit padding. > > Fixes: f28771c0691b ("bpf: Extend BPF syscall with common attributes support") > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > --- > include/uapi/linux/bpf.h | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h > index cc4c0b62cdfa..0f0ec00cae4a 100644 > --- a/include/uapi/linux/bpf.h > +++ b/include/uapi/linux/bpf.h > @@ -1507,6 +1507,7 @@ struct bpf_common_attr { > __u32 log_size; > __u32 log_level; > __u32 log_true_size; > + __u32 __pad; Let us make it as __u32 :32; ? This can avoid people to use the '__pad' name. IIUC, typically uapi struct won't have implicit padding. > }; > > #define BPF_OBJ_NAME_LEN 16U ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] bpf: avoid padding in struct bpf_common_attr 2026-05-19 22:17 ` Yonghong Song @ 2026-05-20 6:36 ` Arnd Bergmann 2026-05-20 14:03 ` Alexei Starovoitov 0 siblings, 1 reply; 8+ messages in thread From: Arnd Bergmann @ 2026-05-20 6:36 UTC (permalink / raw) To: Yonghong Song, Arnd Bergmann, Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko, Eduard Zingerman, Kumar Kartikeya Dwivedi, Leon Hwang Cc: Martin KaFai Lau, Song Liu, Jiri Olsa, KP Singh, bpf, linux-kernel On Wed, May 20, 2026, at 00:17, Yonghong Song wrote: > On 5/19/26 1:38 PM, Arnd Bergmann wrote: >> diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h >> index cc4c0b62cdfa..0f0ec00cae4a 100644 >> --- a/include/uapi/linux/bpf.h >> +++ b/include/uapi/linux/bpf.h >> @@ -1507,6 +1507,7 @@ struct bpf_common_attr { >> __u32 log_size; >> __u32 log_level; >> __u32 log_true_size; >> + __u32 __pad; > > Let us make it as > __u32 :32; > ? > This can avoid people to use the '__pad' name. Sure. Do you want me to resend, are are you going to change it yourself? > IIUC, typically uapi struct won't have implicit padding. Correct. I have a patch set that I'm testing to add the Warning to the kernel build process to find these automatically, but I first need to take care of all the existing instances and only report newly added ones at the moment. FWIW, see below for what I currently have in my private tree for linux/bpf.h. Most of these ones are architecture independent, so I just do the same '__u32 :32' that you suggested above. For bpf_cgroup_storage_key and bpf_attr::link_create::{tracing,tcx,expected_revision,cgroup} there is an additional problem sinc ethe 64-bit fields use __u64 instead of __aligned_u64. This makes the structure layout incompatible between i386 and x86_64. In the version below I use a __uapi_arch_pad32 macro to have architecture specific padding that keeps the existing behavior, but this technically also requires adding a compat syscall on x86 (but no other compat architectures) to convert between the two layouts. Using __aligned_u64 consistently here would have avoided this problem, but changing it later is not an ABI change that would affect every architecture with unaligned __u64 (arc, csky, m68k, microblaze, nios2, openrisc, sh and i386). Arnd diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index aec171ccb6ef..0f0ec00cae4a 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -111,7 +111,8 @@ struct bpf_lpm_trie_key_u8 { struct bpf_cgroup_storage_key { __u64 cgroup_inode_id; /* cgroup inode id */ __u32 attach_type; /* program attach type (enum bpf_attach_type) */ -}; + __uapi_arch_pad32; +} __uapi_arch_align; enum bpf_cgroup_iter_order { BPF_CGROUP_ITER_ORDER_UNSPEC = 0, @@ -1562,10 +1564,12 @@ union bpf_attr { __aligned_u64 excl_prog_hash; /* Size of the passed excl_prog_hash. */ __u32 excl_prog_hash_size; + __u32 :32; }; struct { /* anonymous struct used by BPF_MAP_*_ELEM and BPF_MAP_FREEZE commands */ __u32 map_fd; + __u32 :32; __aligned_u64 key; union { __aligned_u64 value; @@ -1668,6 +1672,7 @@ union bpf_attr { * if BPF_F_PATH_FD flag is not set, AT_FDCWD is assumed. */ __s32 path_fd; + __u32 :32; }; struct { /* anonymous struct used by BPF_PROG_ATTACH/DETACH commands */ @@ -1708,6 +1713,7 @@ union bpf_attr { __u32 flags; __u32 cpu; __u32 batch_size; + __u32 :32; } test; struct { /* anonymous struct used by BPF_*_GET_*_ID */ @@ -1809,6 +1815,7 @@ union bpf_attr { struct { __aligned_u64 iter_info; /* extra bpf_iter_link_info */ __u32 iter_info_len; /* iter_info length */ + __u32 :32; }; struct { /* black box user-provided value passed through @@ -1827,12 +1834,13 @@ union bpf_attr { struct { /* this is overlaid with the target_btf_id above. */ __u32 target_btf_id; + __uapi_arch_pad32; /* black box user-provided value passed through * to BPF program at the execution time and * accessible through bpf_get_attach_cookie() BPF helper */ __u64 cookie; - } tracing; + } __uapi_arch_align tracing; struct { __u32 pf; __u32 hooknum; @@ -1844,8 +1852,9 @@ union bpf_attr { __u32 relative_fd; __u32 relative_id; }; + __uapi_arch_pad32; __u64 expected_revision; - } tcx; + } __uapi_arch_align tcx; struct { __aligned_u64 path; __aligned_u64 offsets; @@ -1854,12 +1863,14 @@ union bpf_attr { __u32 cnt; __u32 flags; __u32 pid; + __u32 :32; } uprobe_multi; struct { union { __u32 relative_fd; __u32 relative_id; }; + __uapi_arch_pad32; __u64 expected_revision; } netkit; struct { @@ -1867,6 +1878,7 @@ union bpf_attr { __u32 relative_fd; __u32 relative_id; }; + __uapi_arch_pad32; __u64 expected_revision; } cgroup; }; @@ -1922,6 +1934,7 @@ union bpf_attr { __u32 stream_buf_len; __u32 stream_id; __u32 prog_fd; + __u32 :32; } prog_stream_read; struct { @@ -6648,6 +6661,7 @@ struct sk_reuseport_md { __u32 ip_protocol; /* IP protocol. e.g. IPPROTO_TCP, IPPROTO_UDP */ __u32 bind_inany; /* Is sock bound to an INANY address? */ __u32 hash; /* A hash of the packet 4 tuples */ + __u32 :32; /* When reuse->migrating_sk is NULL, it is selecting a sk for the * new incoming connection request (e.g. selecting a listen sk for * the received SYN in the TCP case). reuse->sk is one of the sk @@ -6706,6 +6720,7 @@ struct bpf_prog_info { __u32 verified_insns; __u32 attach_btf_obj_id; __u32 attach_btf_id; + __u32 :32; /* alignment pad */ } __attribute__((aligned(8))); struct bpf_map_info { @@ -6727,6 +6742,7 @@ struct bpf_map_info { __u64 map_extra; __aligned_u64 hash; __u32 hash_size; + __u32 :32; /* alignment pad */ } __attribute__((aligned(8))); struct bpf_btf_info { @@ -6742,6 +6758,7 @@ struct bpf_link_info { __u32 type; __u32 id; __u32 prog_id; + __u32 :32; /* pad to alignof(__aligned_u64) */ union { struct { __aligned_u64 tp_name; /* in/out: tp_name buffer ptr */ @@ -6759,6 +6776,7 @@ struct bpf_link_info { struct { __u64 cgroup_id; __u32 attach_type; + __uapi_arch_pad32; } cgroup; struct { __aligned_u64 target_name; /* in/out: target_name buffer ptr */ @@ -6777,11 +6795,16 @@ struct bpf_link_info { struct { __u64 cgroup_id; __u32 order; + __uapi_arch_pad32; } cgroup; struct { __u32 tid; __u32 pid; } task; + struct { + __u64 :64; + __u64 :64; + }; }; } iter; struct { @@ -6896,6 +6919,7 @@ struct bpf_sock_addr { __u32 msg_src_ip6[4]; /* Allows 1,2,4,8-byte read and 4,8-byte write. * Stored in network byte order. */ + __u32 :32; /* pad to alignof(u64) */ __bpf_md_ptr(struct bpf_sock *, sk); }; @@ -7555,6 +7579,7 @@ struct bpf_sk_lookup { __u32 local_ip6[4]; /* Network byte order */ __u32 local_port; /* Host byte order */ __u32 ingress_ifindex; /* The arriving interface. Determined by inet_iif. */ + __u32 :32; }; /* ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] bpf: avoid padding in struct bpf_common_attr 2026-05-20 6:36 ` Arnd Bergmann @ 2026-05-20 14:03 ` Alexei Starovoitov 2026-05-20 14:22 ` Geert Uytterhoeven 0 siblings, 1 reply; 8+ messages in thread From: Alexei Starovoitov @ 2026-05-20 14:03 UTC (permalink / raw) To: Arnd Bergmann Cc: Yonghong Song, Arnd Bergmann, Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko, Eduard Zingerman, Kumar Kartikeya Dwivedi, Leon Hwang, Martin KaFai Lau, Song Liu, Jiri Olsa, KP Singh, bpf, LKML On Wed, May 20, 2026 at 8:39 AM Arnd Bergmann <arnd@arndb.de> wrote: > > On Wed, May 20, 2026, at 00:17, Yonghong Song wrote: > > On 5/19/26 1:38 PM, Arnd Bergmann wrote: > >> diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h > >> index cc4c0b62cdfa..0f0ec00cae4a 100644 > >> --- a/include/uapi/linux/bpf.h > >> +++ b/include/uapi/linux/bpf.h > >> @@ -1507,6 +1507,7 @@ struct bpf_common_attr { > >> __u32 log_size; > >> __u32 log_level; > >> __u32 log_true_size; > >> + __u32 __pad; > > > > Let us make it as > > __u32 :32; > > ? > > This can avoid people to use the '__pad' name. > > Sure. Do you want me to resend, are are you going to change > it yourself? No need to add a pad. The issue was fixed in commit f05ddc6771c4 ("bpf: Check tail zero of bpf_common_attr using offsetofend") pw-bot: cr ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] bpf: avoid padding in struct bpf_common_attr 2026-05-20 14:03 ` Alexei Starovoitov @ 2026-05-20 14:22 ` Geert Uytterhoeven 0 siblings, 0 replies; 8+ messages in thread From: Geert Uytterhoeven @ 2026-05-20 14:22 UTC (permalink / raw) To: Alexei Starovoitov Cc: Arnd Bergmann, Yonghong Song, Arnd Bergmann, Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko, Eduard Zingerman, Kumar Kartikeya Dwivedi, Leon Hwang, Martin KaFai Lau, Song Liu, Jiri Olsa, KP Singh, bpf, LKML Hi Alexei, On Wed, 20 May 2026 at 16:03, Alexei Starovoitov <alexei.starovoitov@gmail.com> wrote: > On Wed, May 20, 2026 at 8:39 AM Arnd Bergmann <arnd@arndb.de> wrote: > > On Wed, May 20, 2026, at 00:17, Yonghong Song wrote: > > > On 5/19/26 1:38 PM, Arnd Bergmann wrote: > > >> diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h > > >> index cc4c0b62cdfa..0f0ec00cae4a 100644 > > >> --- a/include/uapi/linux/bpf.h > > >> +++ b/include/uapi/linux/bpf.h > > >> @@ -1507,6 +1507,7 @@ struct bpf_common_attr { > > >> __u32 log_size; > > >> __u32 log_level; > > >> __u32 log_true_size; > > >> + __u32 __pad; > > > > > > Let us make it as > > > __u32 :32; > > > ? > > > This can avoid people to use the '__pad' name. > > > > Sure. Do you want me to resend, are are you going to change > > it yourself? > > No need to add a pad. > The issue was fixed in commit f05ddc6771c4 ("bpf: Check tail zero of > bpf_common_attr using offsetofend") I am afraid that commit does not fix any -Wpadded warnings? Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2026-05-20 14:22 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2026-05-19 20:38 [PATCH] bpf: avoid padding in struct bpf_common_attr Arnd Bergmann 2026-05-19 20:52 ` Song Liu 2026-05-20 7:51 ` Geert Uytterhoeven 2026-05-19 21:17 ` bot+bpf-ci 2026-05-19 22:17 ` Yonghong Song 2026-05-20 6:36 ` Arnd Bergmann 2026-05-20 14:03 ` Alexei Starovoitov 2026-05-20 14:22 ` Geert Uytterhoeven
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®