Eduard Zingerman <eddyz87@xxxxxxxxx> writes: > Alexei Starovoitov <alexei.starovoitov@xxxxxxxxx> writes: > >> Hi All, >> >> Looks like pahole fails to deduplicate BTF when kernel and >> kernel module are built with gcc-14. >> I see this issue with various kernel .config-s on bpf and >> bpf-next trees. >> I tried pahole 1.28 and the latest master. Same issues. >> >> BTF in bpf_testmod.ko built with gcc-14 has 2849 types. >> When built with gcc-13 it has 454 types. >> So something is confusing dedup logic. >> Would be great if dedup experts can take a look, >> since this dedup issue is breaking a lot of selftests/bpf. > > It does not look like the problem is with dedup. > Quick glance at structure definitions does not show any duplications, > just much more structs compared to clang: Or maybe it is. For example, task_struct is added to .ko BTF generated by gcc, but not clang. This can only happen if dedup fails to merge structures in base and module btf, right? Here is an interesting observation: $ bpftool btf dump file ~/tmp/objs-gcc/bpf_testmod.ko format c | awk '/struct task_struct \{/ {s=1} s {print $0} /^\}/ {s=0}' > ~/tmp/task_struct.ko.c $ bpftool btf dump file ~/tmp/objs-gcc/vmlinux format c | awk '/struct task_struct \{/ {s=1} s {print $0} /^\}/ {s=0}' > ~/tmp/task_struct.vmlinux.c $ diff -pruN ~/tmp/task_struct.ko.c ~/tmp/task_struct.vmlinux.c --- /home/ezingerman/tmp/task_struct.ko.c 2025-04-25 12:37:48.312480603 -0700 +++ /home/ezingerman/tmp/task_struct.vmlinux.c 2025-04-25 12:38:03.096644654 -0700 @@ -18,7 +18,6 @@ struct task_struct { int static_prio; int normal_prio; unsigned int rt_priority; - long: 0; struct sched_entity se; struct sched_rt_entity rt; struct sched_dl_entity dl; @@ -46,7 +45,6 @@ struct task_struct { short unsigned int migration_flags; int rcu_read_lock_nesting; union rcu_special rcu_read_unlock_special; - long: 0; struct list_head rcu_node_entry; struct rcu_node *rcu_blocked_node; long unsigned int rcu_tasks_nvcsw; @@ -55,16 +53,13 @@ struct task_struct { int rcu_tasks_idle_cpu; struct list_head rcu_tasks_holdout_list; int rcu_tasks_exit_cpu; - long: 0; struct list_head rcu_tasks_exit_list; int trc_reader_nesting; int trc_ipi_to_cpu; union rcu_special trc_reader_special; - long: 0; struct list_head trc_holdout_list; struct list_head trc_blkd_node; int trc_blkd_cpu; - long: 0; struct sched_info sched_info; struct list_head tasks; struct plist_node pushable_tasks; @@ -166,7 +161,6 @@ struct task_struct { struct mutex_waiter *blocked_on; struct mutex *blocker_mutex; int non_block_count; - long: 0; struct irqtrace_events irqtrace; unsigned int hardirq_threaded; u64 hardirq_chain_key; @@ -277,7 +271,6 @@ struct task_struct { __u64 __mce_reserved: 62; struct callback_head mce_kill_me; int mce_count; - long: 0; struct llist_head kretprobe_instances; struct llist_head rethooks; struct callback_head l1d_flush_kill;