I have verified this in noble proposed and validated that it fixes the bug.
** Description changed: - Impact] + [Impact] On systems that utilize both uprobes and perf_events style profiling, it is possible to hit a panic in the uprobe_free_utask code. This occurs during process exit. If the profiler fires while uprobe_free_utask is in the process of cleaning up the utask, the NMI may read freed memory because the cleanup code frees the utask before setting its pointer to NULL. This submitter has encountered the problem on systems running workloads without intentionally trying to trigger the problem. The stacks look something like this: - RIP: 0010:is_uprobe_at_func_entry+0x28/0x80 - ... - ? die_addr+0x36/0x90 - ? exc_general_protection+0x217/0x420 - ? asm_exc_general_protection+0x26/0x30 - ? is_uprobe_at_func_entry+0x28/0x80 - perf_callchain_user+0x20a/0x360 - get_perf_callchain+0x147/0x1d0 - bpf_get_stackid+0x60/0x90 - bpf_prog_9aac297fb833e2f5_do_perf_event+0x434/0x53b - ? __smp_call_single_queue+0xad/0x120 - bpf_overflow_handler+0x75/0x110 - ... - asm_sysvec_apic_timer_interrupt+0x1a/0x20 - RIP: 0010:__kmem_cache_free+0x1cb/0x350 - ... - ? uprobe_free_utask+0x62/0x80 - ? acct_collect+0x4c/0x220 - uprobe_free_utask+0x62/0x80 - mm_release+0x12/0xb0 - do_exit+0x26b/0xaa0 - __x64_sys_exit+0x1b/0x20 - do_syscall_64+0x5a/0x80 + RIP: 0010:is_uprobe_at_func_entry+0x28/0x80 + ... + ? die_addr+0x36/0x90 + ? exc_general_protection+0x217/0x420 + ? asm_exc_general_protection+0x26/0x30 + ? is_uprobe_at_func_entry+0x28/0x80 + perf_callchain_user+0x20a/0x360 + get_perf_callchain+0x147/0x1d0 + bpf_get_stackid+0x60/0x90 + bpf_prog_9aac297fb833e2f5_do_perf_event+0x434/0x53b + ? __smp_call_single_queue+0xad/0x120 + bpf_overflow_handler+0x75/0x110 + ... + asm_sysvec_apic_timer_interrupt+0x1a/0x20 + RIP: 0010:__kmem_cache_free+0x1cb/0x350 + ... + ? uprobe_free_utask+0x62/0x80 + ? acct_collect+0x4c/0x220 + uprobe_free_utask+0x62/0x80 + mm_release+0x12/0xb0 + do_exit+0x26b/0xaa0 + __x64_sys_exit+0x1b/0x20 + do_syscall_64+0x5a/0x80 The person who reported the issue upstream provided this reproducer. (Run each command in a separate terminal): - # while :; do bpftrace -e 'uprobe:/bin/ls:_start { printf("hit\n"); }' -c ls; done - # bpftrace -e 'profile:hz:100000 { @[ustack()] = count(); }' + # while :; do bpftrace -e 'uprobe:/bin/ls:_start { printf("hit\n"); }' -c ls; done + # bpftrace -e 'profile:hz:100000 { @[ustack()] = count(); }' However, since the binutils are stripped on some of the releases where I tested this, I ran the following instead: - # while :; do bpftrace -e 'uprobe:libc:malloc { printf("hit\n"); }' -c ls; done - # bpftrace -e 'profile:hz:100000 { @[ustack()] = count(); }' + # while :; do bpftrace -e 'uprobe:libc:malloc { printf("hit\n"); }' -c ls; done + # bpftrace -e 'profile:hz:100000 { @[ustack()] = count(); }' [Backport] The fix is upstream as commit b583ef82b671 ("uprobes: Fix race in uprobe_free_utask") However this patch was massaged by stable for its inclusion in 6.12, 6.6, and 6.1. Instead of re-doing stable's conflict resolution, take the patch directly from 6.6.x instead, at commit eff00c5e29ab. This patch is in stable as of 6.12.19, 6.6.83, and 6.1.131. [Test] I've run the provided reproducer and validated that I can reproduce the problem without the patch applied and that I cannot reproduce it again once I have applied the patch. [Potential Regression] The regression potential here seems quite low. The fix has been upstream for a couple releases and no subsequent issues have been reported. It makes no functional change beyond ensuring that the utask pointer is set to NULL before the utask structure itself is freed. The dereference and free occur on the same cpu. ** Tags removed: verification-needed-noble-linux ** Tags added: verification-done-noble-linux -- You received this bug notification because you are a member of Ubuntu Bugs, which is subscribed to Ubuntu. https://bugs.launchpad.net/bugs/2104210 Title: uprobe-related panics during profiling To manage notifications about this bug go to: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/2104210/+subscriptions -- ubuntu-bugs mailing list ubuntu-bugs@lists.ubuntu.com https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs