Skip to content

Commit 5a8cb23

Browse files
committed
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/[email protected] Signed-off-by: Andrii Nakryiko <[email protected]>
2 parents cb4a119 + 97596ed commit 5a8cb23

File tree

6 files changed

+25
-5
lines changed

6 files changed

+25
-5
lines changed

include/uapi/linux/bpf.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6724,6 +6724,7 @@ struct bpf_link_info {
67246724
__u32 name_len;
67256725
__u32 offset; /* offset from file_name */
67266726
__u64 cookie;
6727+
__u64 ref_ctr_offset;
67276728
} uprobe; /* BPF_PERF_EVENT_UPROBE, BPF_PERF_EVENT_URETPROBE */
67286729
struct {
67296730
__aligned_u64 func_name; /* in/out */

kernel/bpf/syscall.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3800,14 +3800,14 @@ static int bpf_perf_link_fill_kprobe(const struct perf_event *event,
38003800
static int bpf_perf_link_fill_uprobe(const struct perf_event *event,
38013801
struct bpf_link_info *info)
38023802
{
3803+
u64 ref_ctr_offset, offset;
38033804
char __user *uname;
3804-
u64 addr, offset;
38053805
u32 ulen, type;
38063806
int err;
38073807

38083808
uname = u64_to_user_ptr(info->perf_event.uprobe.file_name);
38093809
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,
38113811
&type, NULL);
38123812
if (err)
38133813
return err;
@@ -3819,6 +3819,7 @@ static int bpf_perf_link_fill_uprobe(const struct perf_event *event,
38193819
info->perf_event.uprobe.name_len = ulen;
38203820
info->perf_event.uprobe.offset = offset;
38213821
info->perf_event.uprobe.cookie = event->bpf_cookie;
3822+
info->perf_event.uprobe.ref_ctr_offset = ref_ctr_offset;
38223823
return 0;
38233824
}
38243825
#endif

kernel/trace/trace_uprobe.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1489,7 +1489,7 @@ int bpf_get_uprobe_info(const struct perf_event *event, u32 *fd_type,
14891489
: BPF_FD_TYPE_UPROBE;
14901490
*filename = tu->filename;
14911491
*probe_offset = tu->offset;
1492-
*probe_addr = 0;
1492+
*probe_addr = tu->ref_ctr_offset;
14931493
return 0;
14941494
}
14951495
#endif /* CONFIG_PERF_EVENTS */

tools/bpf/bpftool/link.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,7 @@ show_perf_event_uprobe_json(struct bpf_link_info *info, json_writer_t *wtr)
380380
u64_to_ptr(info->perf_event.uprobe.file_name));
381381
jsonw_uint_field(wtr, "offset", info->perf_event.uprobe.offset);
382382
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);
383384
}
384385

385386
static void
@@ -823,6 +824,8 @@ static void show_perf_event_uprobe_plain(struct bpf_link_info *info)
823824
printf("%s+%#x ", buf, info->perf_event.uprobe.offset);
824825
if (info->perf_event.uprobe.cookie)
825826
printf("cookie %llu ", info->perf_event.uprobe.cookie);
827+
if (info->perf_event.uprobe.ref_ctr_offset)
828+
printf("ref_ctr_offset 0x%llx ", info->perf_event.uprobe.ref_ctr_offset);
826829
}
827830

828831
static void show_perf_event_tracepoint_plain(struct bpf_link_info *info)

tools/include/uapi/linux/bpf.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6724,6 +6724,7 @@ struct bpf_link_info {
67246724
__u32 name_len;
67256725
__u32 offset; /* offset from file_name */
67266726
__u64 cookie;
6727+
__u64 ref_ctr_offset;
67276728
} uprobe; /* BPF_PERF_EVENT_UPROBE, BPF_PERF_EVENT_URETPROBE */
67286729
struct {
67296730
__aligned_u64 func_name; /* in/out */

tools/testing/selftests/bpf/prog_tests/fill_link_info.c

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ static noinline void uprobe_func(void)
3737
static int verify_perf_link_info(int fd, enum bpf_perf_event_type type, long addr,
3838
ssize_t offset, ssize_t entry_offset)
3939
{
40+
ssize_t ref_ctr_offset = entry_offset /* ref_ctr_offset for uprobes */;
4041
struct bpf_link_info info;
4142
__u32 len = sizeof(info);
4243
char buf[PATH_MAX];
@@ -97,6 +98,7 @@ static int verify_perf_link_info(int fd, enum bpf_perf_event_type type, long add
9798
case BPF_PERF_EVENT_UPROBE:
9899
case BPF_PERF_EVENT_URETPROBE:
99100
ASSERT_EQ(info.perf_event.uprobe.offset, offset, "uprobe_offset");
101+
ASSERT_EQ(info.perf_event.uprobe.ref_ctr_offset, ref_ctr_offset, "uprobe_ref_ctr_offset");
100102

101103
ASSERT_EQ(info.perf_event.uprobe.name_len, strlen(UPROBE_FILE) + 1,
102104
"name_len");
@@ -241,20 +243,32 @@ static void test_uprobe_fill_link_info(struct test_fill_link_info *skel,
241243
.retprobe = type == BPF_PERF_EVENT_URETPROBE,
242244
.bpf_cookie = PERF_EVENT_COOKIE,
243245
);
246+
const char *sema[1] = {
247+
"uprobe_link_info_sema_1",
248+
};
249+
__u64 *ref_ctr_offset;
244250
struct bpf_link *link;
245251
int link_fd, err;
246252

253+
err = elf_resolve_syms_offsets("/proc/self/exe", 1, sema,
254+
(unsigned long **) &ref_ctr_offset, STT_OBJECT);
255+
if (!ASSERT_OK(err, "elf_resolve_syms_offsets_object"))
256+
return;
257+
258+
opts.ref_ctr_offset = *ref_ctr_offset;
247259
link = bpf_program__attach_uprobe_opts(skel->progs.uprobe_run,
248260
0, /* self pid */
249261
UPROBE_FILE, uprobe_offset,
250262
&opts);
251263
if (!ASSERT_OK_PTR(link, "attach_uprobe"))
252-
return;
264+
goto out;
253265

254266
link_fd = bpf_link__fd(link);
255-
err = verify_perf_link_info(link_fd, type, 0, uprobe_offset, 0);
267+
err = verify_perf_link_info(link_fd, type, 0, uprobe_offset, *ref_ctr_offset);
256268
ASSERT_OK(err, "verify_perf_link_info");
257269
bpf_link__destroy(link);
270+
out:
271+
free(ref_ctr_offset);
258272
}
259273

260274
static int verify_kmulti_link_info(int fd, bool retprobe, bool has_cookies)

0 commit comments

Comments
 (0)