* [PATCH 0/3] bpf: optimize the bpf_kprobe_multi_link_attach function @ 2022-05-12 14:17 Wan Jiabing 2022-05-12 14:17 ` [PATCH 1/3] bpf: use 'error_xxx' tags in bpf_kprobe_multi_link_attach Wan Jiabing ` (2 more replies) 0 siblings, 3 replies; 8+ messages in thread From: Wan Jiabing @ 2022-05-12 14:17 UTC (permalink / raw) To: Steven Rostedt, Ingo Molnar, Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko, Martin KaFai Lau, Song Liu, Yonghong Song, John Fastabend, KP Singh, netdev, bpf, linux-kernel Cc: Wan Jiabing This patch series tries to optimize the bpf_kporbe_multi_link_attach in bpf_trace.c Firstly, there is only one 'error' tag to handle error code. But in one 'error' tag, there are three 'free' functions which is not efficient. So I split this one tag to three tags to make it clear. Secondly, I simplify double 'if' statements to one statement. Finally, coccicheck reports an opportunity for vmemdup_user. So I use vmemdup_user to make code cleaner. Wan Jiabing (3): bpf: use 'error_xxx' tags in bpf_kprobe_multi_link_attach bpf: simplify if-if to if in bpf_kprobe_multi_link_attach bpf: use vmemdup_user instead of kvmalloc and copy_from_user kernel/trace/bpf_trace.c | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) -- 2.35.1 ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/3] bpf: use 'error_xxx' tags in bpf_kprobe_multi_link_attach 2022-05-12 14:17 [PATCH 0/3] bpf: optimize the bpf_kprobe_multi_link_attach function Wan Jiabing @ 2022-05-12 14:17 ` Wan Jiabing 2022-05-12 16:40 ` Song Liu 2022-05-12 17:05 ` David Vernet 2022-05-12 14:17 ` [PATCH 2/3] bpf: simplify if-if to if " Wan Jiabing 2022-05-12 14:17 ` [PATCH 3/3] bpf: use vmemdup_user instead of kvmalloc and copy_from_user Wan Jiabing 2 siblings, 2 replies; 8+ messages in thread From: Wan Jiabing @ 2022-05-12 14:17 UTC (permalink / raw) To: Steven Rostedt, Ingo Molnar, Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko, Martin KaFai Lau, Song Liu, Yonghong Song, John Fastabend, KP Singh, netdev, bpf, linux-kernel Cc: Wan Jiabing Use 'error_addrs', 'error_cookies' and 'error_link' tags to make error handling more efficient. Signed-off-by: Wan Jiabing <[email protected]> --- kernel/trace/bpf_trace.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index 2eaac094caf8..3a8b69ef9a0d 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -2467,20 +2467,20 @@ int bpf_kprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *pr if (uaddrs) { if (copy_from_user(addrs, uaddrs, size)) { err = -EFAULT; - goto error; + goto error_addrs; } } else { struct user_syms us; err = copy_user_syms(&us, usyms, cnt); if (err) - goto error; + goto error_addrs; sort(us.syms, cnt, sizeof(*us.syms), symbols_cmp, NULL); err = ftrace_lookup_symbols(us.syms, cnt, addrs); free_user_syms(&us); if (err) - goto error; + goto error_addrs; } ucookies = u64_to_user_ptr(attr->link_create.kprobe_multi.cookies); @@ -2488,18 +2488,18 @@ int bpf_kprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *pr cookies = kvmalloc(size, GFP_KERNEL); if (!cookies) { err = -ENOMEM; - goto error; + goto error_addrs; } if (copy_from_user(cookies, ucookies, size)) { err = -EFAULT; - goto error; + goto error_cookies; } } link = kzalloc(sizeof(*link), GFP_KERNEL); if (!link) { err = -ENOMEM; - goto error; + goto error_cookies; } bpf_link_init(&link->link, BPF_LINK_TYPE_KPROBE_MULTI, @@ -2507,7 +2507,7 @@ int bpf_kprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *pr err = bpf_link_prime(&link->link, &link_primer); if (err) - goto error; + goto error_link; if (flags & BPF_F_KPROBE_MULTI_RETURN) link->fp.exit_handler = kprobe_multi_link_handler; @@ -2539,10 +2539,12 @@ int bpf_kprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *pr return bpf_link_settle(&link_primer); -error: +error_link: kfree(link); - kvfree(addrs); +error_cookies: kvfree(cookies); +error_addrs: + kvfree(addrs); return err; } #else /* !CONFIG_FPROBE */ -- 2.35.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 1/3] bpf: use 'error_xxx' tags in bpf_kprobe_multi_link_attach 2022-05-12 14:17 ` [PATCH 1/3] bpf: use 'error_xxx' tags in bpf_kprobe_multi_link_attach Wan Jiabing @ 2022-05-12 16:40 ` Song Liu 2022-05-12 17:05 ` David Vernet 1 sibling, 0 replies; 8+ messages in thread From: Song Liu @ 2022-05-12 16:40 UTC (permalink / raw) To: Wan Jiabing Cc: Steven Rostedt, Ingo Molnar, Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko, Martin Lau, Yonghong Song, John Fastabend, KP Singh, Networking, bpf, Linux Kernel Mailing List > On May 12, 2022, at 7:17 AM, Wan Jiabing <[email protected]> wrote: > > Use 'error_addrs', 'error_cookies' and 'error_link' tags to make error > handling more efficient. > > Signed-off-by: Wan Jiabing <[email protected]> > --- > kernel/trace/bpf_trace.c | 20 +++++++++++--------- > 1 file changed, 11 insertions(+), 9 deletions(-) I seriously think current version is simpler. Song ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/3] bpf: use 'error_xxx' tags in bpf_kprobe_multi_link_attach 2022-05-12 14:17 ` [PATCH 1/3] bpf: use 'error_xxx' tags in bpf_kprobe_multi_link_attach Wan Jiabing 2022-05-12 16:40 ` Song Liu @ 2022-05-12 17:05 ` David Vernet 1 sibling, 0 replies; 8+ messages in thread From: David Vernet @ 2022-05-12 17:05 UTC (permalink / raw) To: Wan Jiabing Cc: Steven Rostedt, Ingo Molnar, Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko, Martin KaFai Lau, Song Liu, Yonghong Song, John Fastabend, KP Singh, netdev, bpf, linux-kernel On Thu, May 12, 2022 at 10:17:08PM +0800, Wan Jiabing wrote: > Use 'error_addrs', 'error_cookies' and 'error_link' tags to make error > handling more efficient. Can you add a bit more context to this commit summary? The added goto labels aren't what make the code more performant, it's the avoidance of unnecessary free calls on NULL pointers that (supposedly) does. > > Signed-off-by: Wan Jiabing <[email protected]> > --- > kernel/trace/bpf_trace.c | 20 +++++++++++--------- > 1 file changed, 11 insertions(+), 9 deletions(-) > > diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c > index 2eaac094caf8..3a8b69ef9a0d 100644 > --- a/kernel/trace/bpf_trace.c > +++ b/kernel/trace/bpf_trace.c > @@ -2467,20 +2467,20 @@ int bpf_kprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *pr > if (uaddrs) { > if (copy_from_user(addrs, uaddrs, size)) { > err = -EFAULT; > - goto error; > + goto error_addrs; > } > } else { > struct user_syms us; > > err = copy_user_syms(&us, usyms, cnt); > if (err) > - goto error; > + goto error_addrs; > > sort(us.syms, cnt, sizeof(*us.syms), symbols_cmp, NULL); > err = ftrace_lookup_symbols(us.syms, cnt, addrs); > free_user_syms(&us); > if (err) > - goto error; > + goto error_addrs; > } > > ucookies = u64_to_user_ptr(attr->link_create.kprobe_multi.cookies); > @@ -2488,18 +2488,18 @@ int bpf_kprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *pr > cookies = kvmalloc(size, GFP_KERNEL); > if (!cookies) { > err = -ENOMEM; > - goto error; > + goto error_addrs; > } > if (copy_from_user(cookies, ucookies, size)) { > err = -EFAULT; > - goto error; > + goto error_cookies; > } > } > > link = kzalloc(sizeof(*link), GFP_KERNEL); > if (!link) { > err = -ENOMEM; > - goto error; > + goto error_cookies; > } > > bpf_link_init(&link->link, BPF_LINK_TYPE_KPROBE_MULTI, > @@ -2507,7 +2507,7 @@ int bpf_kprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *pr > > err = bpf_link_prime(&link->link, &link_primer); > if (err) > - goto error; > + goto error_link; > > if (flags & BPF_F_KPROBE_MULTI_RETURN) > link->fp.exit_handler = kprobe_multi_link_handler; > @@ -2539,10 +2539,12 @@ int bpf_kprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *pr > > return bpf_link_settle(&link_primer); > > -error: > +error_link: > kfree(link); > - kvfree(addrs); > +error_cookies: > kvfree(cookies); > +error_addrs: > + kvfree(addrs); > return err; > } > #else /* !CONFIG_FPROBE */ > -- > 2.35.1 > Could you clarify what performance gains you observed from doing this? I wouldn't have expected avoiding a couple of calls and NULL checks to have a measurable impact on performance, and I'm wondering whether the complexity from having multiple goto labels is really worth any supposed performance gains. Thanks, David ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 2/3] bpf: simplify if-if to if in bpf_kprobe_multi_link_attach 2022-05-12 14:17 [PATCH 0/3] bpf: optimize the bpf_kprobe_multi_link_attach function Wan Jiabing 2022-05-12 14:17 ` [PATCH 1/3] bpf: use 'error_xxx' tags in bpf_kprobe_multi_link_attach Wan Jiabing @ 2022-05-12 14:17 ` Wan Jiabing 2022-05-12 16:44 ` Song Liu 2022-05-12 14:17 ` [PATCH 3/3] bpf: use vmemdup_user instead of kvmalloc and copy_from_user Wan Jiabing 2 siblings, 1 reply; 8+ messages in thread From: Wan Jiabing @ 2022-05-12 14:17 UTC (permalink / raw) To: Steven Rostedt, Ingo Molnar, Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko, Martin KaFai Lau, Song Liu, Yonghong Song, John Fastabend, KP Singh, netdev, bpf, linux-kernel Cc: Wan Jiabing Simplify double 'if' statements to one 'if' statement. Signed-off-by: Wan Jiabing <[email protected]> --- kernel/trace/bpf_trace.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index 3a8b69ef9a0d..1b0db8f78dc8 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -2464,11 +2464,9 @@ int bpf_kprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *pr if (!addrs) return -ENOMEM; - if (uaddrs) { - if (copy_from_user(addrs, uaddrs, size)) { - err = -EFAULT; - goto error_addrs; - } + if (uaddrs && copy_from_user(addrs, uaddrs, size)) { + err = -EFAULT; + goto error_addrs; } else { struct user_syms us; -- 2.35.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] bpf: simplify if-if to if in bpf_kprobe_multi_link_attach 2022-05-12 14:17 ` [PATCH 2/3] bpf: simplify if-if to if " Wan Jiabing @ 2022-05-12 16:44 ` Song Liu 0 siblings, 0 replies; 8+ messages in thread From: Song Liu @ 2022-05-12 16:44 UTC (permalink / raw) To: Wan Jiabing Cc: Steven Rostedt, Ingo Molnar, Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko, Martin Lau, Yonghong Song, John Fastabend, KP Singh, Networking, bpf, Linux Kernel Mailing List > On May 12, 2022, at 7:17 AM, Wan Jiabing <[email protected]> wrote: > > Simplify double 'if' statements to one 'if' statement. > > Signed-off-by: Wan Jiabing <[email protected]> > --- > kernel/trace/bpf_trace.c | 8 +++----- > 1 file changed, 3 insertions(+), 5 deletions(-) > > diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c > index 3a8b69ef9a0d..1b0db8f78dc8 100644 > --- a/kernel/trace/bpf_trace.c > +++ b/kernel/trace/bpf_trace.c > @@ -2464,11 +2464,9 @@ int bpf_kprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *pr > if (!addrs) > return -ENOMEM; > > - if (uaddrs) { > - if (copy_from_user(addrs, uaddrs, size)) { > - err = -EFAULT; > - goto error_addrs; > - } > + if (uaddrs && copy_from_user(addrs, uaddrs, size)) { > + err = -EFAULT; > + goto error_addrs; > } else { > struct user_syms us; This changed the behavior, no? For uaddrs != NULL and copy_from_user() == 0 case, we now going into else clause. Did I misread anything? Song ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 3/3] bpf: use vmemdup_user instead of kvmalloc and copy_from_user 2022-05-12 14:17 [PATCH 0/3] bpf: optimize the bpf_kprobe_multi_link_attach function Wan Jiabing 2022-05-12 14:17 ` [PATCH 1/3] bpf: use 'error_xxx' tags in bpf_kprobe_multi_link_attach Wan Jiabing 2022-05-12 14:17 ` [PATCH 2/3] bpf: simplify if-if to if " Wan Jiabing @ 2022-05-12 14:17 ` Wan Jiabing 2022-05-12 16:45 ` Song Liu 2 siblings, 1 reply; 8+ messages in thread From: Wan Jiabing @ 2022-05-12 14:17 UTC (permalink / raw) To: Steven Rostedt, Ingo Molnar, Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko, Martin KaFai Lau, Song Liu, Yonghong Song, John Fastabend, KP Singh, netdev, bpf, linux-kernel Cc: Wan Jiabing Fix following coccicheck warning: ./kernel/trace/bpf_trace.c:2488:12-20: WARNING opportunity for vmemdup_user Use vmemdup_user instead of kvmalloc and copy_from_user. Signed-off-by: Wan Jiabing <[email protected]> --- kernel/trace/bpf_trace.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index 1b0db8f78dc8..48fc97a6db50 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -2483,15 +2483,11 @@ int bpf_kprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *pr ucookies = u64_to_user_ptr(attr->link_create.kprobe_multi.cookies); if (ucookies) { - cookies = kvmalloc(size, GFP_KERNEL); - if (!cookies) { - err = -ENOMEM; + cookies = vmemdup_user(ucookies, size); + if (IS_ERR(cookies)) { + err = PTR_ERR(cookies); goto error_addrs; } - if (copy_from_user(cookies, ucookies, size)) { - err = -EFAULT; - goto error_cookies; - } } link = kzalloc(sizeof(*link), GFP_KERNEL); -- 2.35.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 3/3] bpf: use vmemdup_user instead of kvmalloc and copy_from_user 2022-05-12 14:17 ` [PATCH 3/3] bpf: use vmemdup_user instead of kvmalloc and copy_from_user Wan Jiabing @ 2022-05-12 16:45 ` Song Liu 0 siblings, 0 replies; 8+ messages in thread From: Song Liu @ 2022-05-12 16:45 UTC (permalink / raw) To: Wan Jiabing Cc: Steven Rostedt, Ingo Molnar, Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko, Martin Lau, Yonghong Song, John Fastabend, KP Singh, Networking, bpf, Linux Kernel Mailing List > On May 12, 2022, at 7:17 AM, Wan Jiabing <[email protected]> wrote: > > Fix following coccicheck warning: > ./kernel/trace/bpf_trace.c:2488:12-20: WARNING opportunity for vmemdup_user > > Use vmemdup_user instead of kvmalloc and copy_from_user. > > Signed-off-by: Wan Jiabing <[email protected]> > --- > kernel/trace/bpf_trace.c | 10 +++------- > 1 file changed, 3 insertions(+), 7 deletions(-) > > diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c > index 1b0db8f78dc8..48fc97a6db50 100644 > --- a/kernel/trace/bpf_trace.c > +++ b/kernel/trace/bpf_trace.c > @@ -2483,15 +2483,11 @@ int bpf_kprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *pr > > ucookies = u64_to_user_ptr(attr->link_create.kprobe_multi.cookies); > if (ucookies) { > - cookies = kvmalloc(size, GFP_KERNEL); > - if (!cookies) { > - err = -ENOMEM; > + cookies = vmemdup_user(ucookies, size); vmemdup_user() uses GFP_USER, so this is a behavior change. Song > + if (IS_ERR(cookies)) { > + err = PTR_ERR(cookies); > goto error_addrs; > } > - if (copy_from_user(cookies, ucookies, size)) { > - err = -EFAULT; > - goto error_cookies; > - } > } > > link = kzalloc(sizeof(*link), GFP_KERNEL); > -- > 2.35.1 > ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2022-05-12 17:05 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-05-12 14:17 [PATCH 0/3] bpf: optimize the bpf_kprobe_multi_link_attach function Wan Jiabing 2022-05-12 14:17 ` [PATCH 1/3] bpf: use 'error_xxx' tags in bpf_kprobe_multi_link_attach Wan Jiabing 2022-05-12 16:40 ` Song Liu 2022-05-12 17:05 ` David Vernet 2022-05-12 14:17 ` [PATCH 2/3] bpf: simplify if-if to if " Wan Jiabing 2022-05-12 16:44 ` Song Liu 2022-05-12 14:17 ` [PATCH 3/3] bpf: use vmemdup_user instead of kvmalloc and copy_from_user Wan Jiabing 2022-05-12 16:45 ` Song Liu
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox