Commit 9fd112b1 authored by Jiri Olsa's avatar Jiri Olsa Committed by Alexei Starovoitov

bpf: Store cookies in kprobe_multi bpf_link_info data

Storing cookies in kprobe_multi bpf_link_info data. The cookies
field is optional and if provided it needs to be an array of
__u64 with kprobe_multi.count length.
Acked-by: default avatarYafang Shao <laoar.shao@gmail.com>
Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
Acked-by: default avatarSong Liu <song@kernel.org>
Link: https://lore.kernel.org/r/20240119110505.400573-3-jolsa@kernel.orgSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent d5c16492
...@@ -6563,6 +6563,7 @@ struct bpf_link_info { ...@@ -6563,6 +6563,7 @@ struct bpf_link_info {
__u32 count; /* in/out: kprobe_multi function count */ __u32 count; /* in/out: kprobe_multi function count */
__u32 flags; __u32 flags;
__u64 missed; __u64 missed;
__aligned_u64 cookies;
} kprobe_multi; } kprobe_multi;
struct { struct {
__aligned_u64 path; __aligned_u64 path;
......
...@@ -2679,6 +2679,7 @@ static void bpf_kprobe_multi_link_dealloc(struct bpf_link *link) ...@@ -2679,6 +2679,7 @@ static void bpf_kprobe_multi_link_dealloc(struct bpf_link *link)
static int bpf_kprobe_multi_link_fill_link_info(const struct bpf_link *link, static int bpf_kprobe_multi_link_fill_link_info(const struct bpf_link *link,
struct bpf_link_info *info) struct bpf_link_info *info)
{ {
u64 __user *ucookies = u64_to_user_ptr(info->kprobe_multi.cookies);
u64 __user *uaddrs = u64_to_user_ptr(info->kprobe_multi.addrs); u64 __user *uaddrs = u64_to_user_ptr(info->kprobe_multi.addrs);
struct bpf_kprobe_multi_link *kmulti_link; struct bpf_kprobe_multi_link *kmulti_link;
u32 ucount = info->kprobe_multi.count; u32 ucount = info->kprobe_multi.count;
...@@ -2686,6 +2687,8 @@ static int bpf_kprobe_multi_link_fill_link_info(const struct bpf_link *link, ...@@ -2686,6 +2687,8 @@ static int bpf_kprobe_multi_link_fill_link_info(const struct bpf_link *link,
if (!uaddrs ^ !ucount) if (!uaddrs ^ !ucount)
return -EINVAL; return -EINVAL;
if (ucookies && !ucount)
return -EINVAL;
kmulti_link = container_of(link, struct bpf_kprobe_multi_link, link); kmulti_link = container_of(link, struct bpf_kprobe_multi_link, link);
info->kprobe_multi.count = kmulti_link->cnt; info->kprobe_multi.count = kmulti_link->cnt;
...@@ -2699,6 +2702,18 @@ static int bpf_kprobe_multi_link_fill_link_info(const struct bpf_link *link, ...@@ -2699,6 +2702,18 @@ static int bpf_kprobe_multi_link_fill_link_info(const struct bpf_link *link,
else else
ucount = kmulti_link->cnt; ucount = kmulti_link->cnt;
if (ucookies) {
if (kmulti_link->cookies) {
if (copy_to_user(ucookies, kmulti_link->cookies, ucount * sizeof(u64)))
return -EFAULT;
} else {
for (i = 0; i < ucount; i++) {
if (put_user(0, ucookies + i))
return -EFAULT;
}
}
}
if (kallsyms_show_value(current_cred())) { if (kallsyms_show_value(current_cred())) {
if (copy_to_user(uaddrs, kmulti_link->addrs, ucount * sizeof(u64))) if (copy_to_user(uaddrs, kmulti_link->addrs, ucount * sizeof(u64)))
return -EFAULT; return -EFAULT;
......
...@@ -6563,6 +6563,7 @@ struct bpf_link_info { ...@@ -6563,6 +6563,7 @@ struct bpf_link_info {
__u32 count; /* in/out: kprobe_multi function count */ __u32 count; /* in/out: kprobe_multi function count */
__u32 flags; __u32 flags;
__u64 missed; __u64 missed;
__aligned_u64 cookies;
} kprobe_multi; } kprobe_multi;
struct { struct {
__aligned_u64 path; __aligned_u64 path;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment