Skip to content

Commit

Permalink
bpf: Support ->fill_link_info for kprobe_multi
Browse files Browse the repository at this point in the history
By adding support for ->fill_link_info to the kprobe_multi link, users will
be able to inspect it using `bpftool link show`. This enhancement will
expose both the count of probed functions and their respective addresses to
the user.

Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
  • Loading branch information
laoar authored and intel-lab-lkp committed Jun 2, 2023
1 parent d4ae3e5 commit 270f3eb
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 0 deletions.
4 changes: 4 additions & 0 deletions include/uapi/linux/bpf.h
Original file line number Diff line number Diff line change
Expand Up @@ -6438,6 +6438,10 @@ struct bpf_link_info {
__s32 priority;
__u32 flags;
} netfilter;
struct {
__u64 addrs;
__u32 count;
} kprobe_multi;
};
} __attribute__((aligned(8)));

Expand Down
26 changes: 26 additions & 0 deletions kernel/trace/bpf_trace.c
Original file line number Diff line number Diff line change
Expand Up @@ -2548,9 +2548,35 @@ static void bpf_kprobe_multi_link_dealloc(struct bpf_link *link)
kfree(kmulti_link);
}

static int bpf_kprobe_multi_link_fill_link_info(const struct bpf_link *link,
struct bpf_link_info *info)
{
u64 *uaddrs = (u64 *)u64_to_user_ptr(info->kprobe_multi.addrs);
struct bpf_kprobe_multi_link *kmulti_link;
u32 ucount = info->kprobe_multi.count;

if (!uaddrs ^ !ucount)
return -EINVAL;

kmulti_link = container_of(link, struct bpf_kprobe_multi_link, link);
if (!uaddrs) {
info->kprobe_multi.count = kmulti_link->cnt;
return 0;
}

if (!ucount)
return 0;
if (ucount != kmulti_link->cnt)
return -EINVAL;
if (copy_to_user(uaddrs, kmulti_link->addrs, ucount * sizeof(u64)))
return -EFAULT;
return 0;
}

static const struct bpf_link_ops bpf_kprobe_multi_link_lops = {
.release = bpf_kprobe_multi_link_release,
.dealloc = bpf_kprobe_multi_link_dealloc,
.fill_link_info = bpf_kprobe_multi_link_fill_link_info,
};

static void bpf_kprobe_multi_cookie_swap(void *a, void *b, int size, const void *priv)
Expand Down
4 changes: 4 additions & 0 deletions tools/include/uapi/linux/bpf.h
Original file line number Diff line number Diff line change
Expand Up @@ -6438,6 +6438,10 @@ struct bpf_link_info {
__s32 priority;
__u32 flags;
} netfilter;
struct {
__u64 addrs;
__u32 count;
} kprobe_multi;
};
} __attribute__((aligned(8)));

Expand Down

0 comments on commit 270f3eb

Please sign in to comment.