Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'bpf-retrieve-ref_ctr_offset-from-uprobe-perf-link'

Jiri Olsa says:

====================
bpf: Retrieve ref_ctr_offset from uprobe perf link

hi,
adding ref_ctr_offset retrieval for uprobe perf link info.

v2 changes:
- display ref_ctr_offset as hex number [Andrii]
- added acks

thanks,
jirka
---
====================

Link: https://patch.msgid.link/20250509153539.779599-1-jolsa@kernel.org
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>

+25 -5
+1
include/uapi/linux/bpf.h
··· 6724 6724 __u32 name_len; 6725 6725 __u32 offset; /* offset from file_name */ 6726 6726 __u64 cookie; 6727 + __u64 ref_ctr_offset; 6727 6728 } uprobe; /* BPF_PERF_EVENT_UPROBE, BPF_PERF_EVENT_URETPROBE */ 6728 6729 struct { 6729 6730 __aligned_u64 func_name; /* in/out */
+3 -2
kernel/bpf/syscall.c
··· 3800 3800 static int bpf_perf_link_fill_uprobe(const struct perf_event *event, 3801 3801 struct bpf_link_info *info) 3802 3802 { 3803 + u64 ref_ctr_offset, offset; 3803 3804 char __user *uname; 3804 - u64 addr, offset; 3805 3805 u32 ulen, type; 3806 3806 int err; 3807 3807 3808 3808 uname = u64_to_user_ptr(info->perf_event.uprobe.file_name); 3809 3809 ulen = info->perf_event.uprobe.name_len; 3810 - err = bpf_perf_link_fill_common(event, uname, &ulen, &offset, &addr, 3810 + err = bpf_perf_link_fill_common(event, uname, &ulen, &offset, &ref_ctr_offset, 3811 3811 &type, NULL); 3812 3812 if (err) 3813 3813 return err; ··· 3819 3819 info->perf_event.uprobe.name_len = ulen; 3820 3820 info->perf_event.uprobe.offset = offset; 3821 3821 info->perf_event.uprobe.cookie = event->bpf_cookie; 3822 + info->perf_event.uprobe.ref_ctr_offset = ref_ctr_offset; 3822 3823 return 0; 3823 3824 } 3824 3825 #endif
+1 -1
kernel/trace/trace_uprobe.c
··· 1489 1489 : BPF_FD_TYPE_UPROBE; 1490 1490 *filename = tu->filename; 1491 1491 *probe_offset = tu->offset; 1492 - *probe_addr = 0; 1492 + *probe_addr = tu->ref_ctr_offset; 1493 1493 return 0; 1494 1494 } 1495 1495 #endif /* CONFIG_PERF_EVENTS */
+3
tools/bpf/bpftool/link.c
··· 380 380 u64_to_ptr(info->perf_event.uprobe.file_name)); 381 381 jsonw_uint_field(wtr, "offset", info->perf_event.uprobe.offset); 382 382 jsonw_uint_field(wtr, "cookie", info->perf_event.uprobe.cookie); 383 + jsonw_uint_field(wtr, "ref_ctr_offset", info->perf_event.uprobe.ref_ctr_offset); 383 384 } 384 385 385 386 static void ··· 824 823 printf("%s+%#x ", buf, info->perf_event.uprobe.offset); 825 824 if (info->perf_event.uprobe.cookie) 826 825 printf("cookie %llu ", info->perf_event.uprobe.cookie); 826 + if (info->perf_event.uprobe.ref_ctr_offset) 827 + printf("ref_ctr_offset 0x%llx ", info->perf_event.uprobe.ref_ctr_offset); 827 828 } 828 829 829 830 static void show_perf_event_tracepoint_plain(struct bpf_link_info *info)
+1
tools/include/uapi/linux/bpf.h
··· 6724 6724 __u32 name_len; 6725 6725 __u32 offset; /* offset from file_name */ 6726 6726 __u64 cookie; 6727 + __u64 ref_ctr_offset; 6727 6728 } uprobe; /* BPF_PERF_EVENT_UPROBE, BPF_PERF_EVENT_URETPROBE */ 6728 6729 struct { 6729 6730 __aligned_u64 func_name; /* in/out */