From: Yonghong Song <yonghong.song@linux.dev>
To: Leon Hwang <hffilwlqm@gmail.com>, Zheao Li <me@manjusaka.me>,
Alexei Starovoitov <ast@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
John Fastabend <john.fastabend@gmail.com>,
Andrii Nakryiko <andrii@kernel.org>,
Martin KaFai Lau <martin.lau@linux.dev>,
Eduard Zingerman <eddyz87@gmail.com>, Song Liu <song@kernel.org>,
KP Singh <kpsingh@kernel.org>,
Stanislav Fomichev <sdf@fomichev.me>, Hao Luo <haoluo@google.com>,
Jiri Olsa <jolsa@kernel.org>
Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH bpf-next v2] bpf: Add bpf_check_attach_target_with_klog method to output failure logs to kernel
Date: Wed, 24 Jul 2024 23:09:53 -0700 [thread overview]
Message-ID: <6511ce2a-1c7d-497c-aeb6-d4f0b17271ed@linux.dev> (raw)
In-Reply-To: <c7952df9-5830-45d3-89bb-b45f2b030e24@gmail.com>
On 7/24/24 11:05 PM, Leon Hwang wrote:
>
> On 25/7/24 13:54, Yonghong Song wrote:
>> On 7/24/24 10:15 PM, Zheao Li wrote:
>>> This is a v2 patch, previous Link:
>>> https://lore.kernel.org/bpf/20240724152521.20546-1-me@manjusaka.me/T/#u
>>>
>>> Compare with v1:
>>>
>>> 1. Format the code style and signed-off field
>>> 2. Use a shorter name bpf_check_attach_target_with_klog instead of
>>> original name bpf_check_attach_target_with_kernel_log
>>>
>>> When attaching a freplace hook, failures can occur,
>>> but currently, no output is provided to help developers diagnose the
>>> root cause.
>>>
>>> This commit adds a new method, bpf_check_attach_target_with_klog,
>>> which outputs the verifier log to the kernel.
>>> Developers can then use dmesg to obtain more detailed information
>>> about the failure.
>>>
>>> For an example of eBPF code,
>>> Link:
>>> https://github.com/Asphaltt/learn-by-example/blob/main/ebpf/freplace/main.go
>>>
>>> Co-developed-by: Leon Hwang <hffilwlqm@gmail.com>
>>> Signed-off-by: Leon Hwang <hffilwlqm@gmail.com>
>>> Signed-off-by: Zheao Li <me@manjusaka.me>
>>> ---
>>> include/linux/bpf_verifier.h | 5 +++++
>>> kernel/bpf/syscall.c | 5 +++--
>>> kernel/bpf/trampoline.c | 6 +++---
>>> kernel/bpf/verifier.c | 19 +++++++++++++++++++
>>> 4 files changed, 30 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h
>>> index 5cea15c81b8a..8eddba62c194 100644
>>> --- a/include/linux/bpf_verifier.h
>>> +++ b/include/linux/bpf_verifier.h
>>> @@ -848,6 +848,11 @@ static inline void bpf_trampoline_unpack_key(u64
>>> key, u32 *obj_id, u32 *btf_id)
>>> *btf_id = key & 0x7FFFFFFF;
>>> }
>>> +int bpf_check_attach_target_with_klog(const struct bpf_prog *prog,
>>> + const struct bpf_prog *tgt_prog,
>>> + u32 btf_id,
>>> + struct bpf_attach_target_info *tgt_info);
>> format issue in the above. Same code alignment is needed for arguments
>> in different lines.
>>
>>> +
>>> int bpf_check_attach_target(struct bpf_verifier_log *log,
>>> const struct bpf_prog *prog,
>>> const struct bpf_prog *tgt_prog,
>>> diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
>>> index 869265852d51..bf826fcc8cf4 100644
>>> --- a/kernel/bpf/syscall.c
>>> +++ b/kernel/bpf/syscall.c
>>> @@ -3464,8 +3464,9 @@ static int bpf_tracing_prog_attach(struct
>>> bpf_prog *prog,
>>> */
>>> struct bpf_attach_target_info tgt_info = {};
>>> - err = bpf_check_attach_target(NULL, prog, tgt_prog, btf_id,
>>> - &tgt_info);
>>> + err = bpf_check_attach_target_with_klog(prog, NULL,
>>> + prog->aux->attach_btf_id,
>>> + &tgt_info);
>> code alignment issue here as well.
>> Also, the argument should be 'prog, tgt_prog, btf_id, &tgt_info', right?
>>
>>> if (err)
>>> goto out_unlock;
>>> diff --git a/kernel/bpf/trampoline.c b/kernel/bpf/trampoline.c
>>> index f8302a5ca400..8862adaa7302 100644
>>> --- a/kernel/bpf/trampoline.c
>>> +++ b/kernel/bpf/trampoline.c
>>> @@ -699,9 +699,9 @@ int bpf_trampoline_link_cgroup_shim(struct
>>> bpf_prog *prog,
>>> u64 key;
>>> int err;
>>> - err = bpf_check_attach_target(NULL, prog, NULL,
>>> - prog->aux->attach_btf_id,
>>> - &tgt_info);
>>> + err = bpf_check_attach_target_with_klog(prog, NULL,
>>> + prog->aux->attach_btf_id,
>>> + &tgt_info);
>> code alignment issue here
>>
>>> if (err)
>>> return err;
>>> diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
>>> index 1f5302fb0957..4873b72f5a9a 100644
>>> --- a/kernel/bpf/verifier.c
>>> +++ b/kernel/bpf/verifier.c
>>> @@ -21643,6 +21643,25 @@ static int
>>> check_non_sleepable_error_inject(u32 btf_id)
>>> return btf_id_set_contains(&btf_non_sleepable_error_inject,
>>> btf_id);
>>> }
>>> +int bpf_check_attach_target_with_klog(const struct bpf_prog *prog,
>>> + const struct bpf_prog *tgt_prog,
>>> + u32 btf_id,
>>> + struct bpf_attach_target_info *tgt_info);
>> code alignment issue here.
>>
>>> +{
>>> + struct bpf_verifier_log *log;
>>> + int err;
>>> +
>>> + log = kzalloc(sizeof(*log), GFP_KERNEL | __GFP_NOWARN);
>> __GFP_NOWARN is unnecessary here.
>>
>>> + if (!log) {
>>> + err = -ENOMEM;
>>> + return err;
>>> + }
>>> + log->level = BPF_LOG_KERNEL;
>>> + err = bpf_check_attach_target(log, prog, tgt_prog, btf_id,
>>> tgt_info);
>>> + kfree(log);
>>> + return err;
>>> +}
>>> +
>>> int bpf_check_attach_target(struct bpf_verifier_log *log,
>>> const struct bpf_prog *prog,
>>> const struct bpf_prog *tgt_prog,
>> More importantly, Andrii has implemented retsnoop, which intends to locate
>> precise location in the kernel where err happens. The link is
>> https://github.com/anakryiko/retsnoop
>>
>> Maybe you want to take a look and see whether it can resolve your issue.
>> We should really avoid putting more stuff in dmesg whenever possible.
>>
> retsnoop is really cool.
>
> However, when something wrong in bpf_check_attach_target(), retsnoop
> only gets its return value -EINVAL, without any bpf_log() in it. It's
> hard to figure out the reason why bpf_check_attach_target() returns -EINVAL.
It should have line number like below in https://github.com/anakryiko/retsnoop
|$ sudo ./retsnoop -e '*sys_bpf' -a ':kernel/bpf/*.c' Receiving data...
20:19:36.372607 -> 20:19:36.372682 TID/PID 8346/8346 (simfail/simfail):
entry_SYSCALL_64_after_hwframe+0x63 (arch/x86/entry/entry_64.S:120:0)
do_syscall_64+0x35 (arch/x86/entry/common.c:80:7) . do_syscall_x64
(arch/x86/entry/common.c:50:12) 73us [-ENOMEM] __x64_sys_bpf+0x1a
(kernel/bpf/syscall.c:5067:1) 70us [-ENOMEM] __sys_bpf+0x38b
(kernel/bpf/syscall.c:4947:9) . map_create (kernel/bpf/syscall.c:1106:8)
. find_and_alloc_map (kernel/bpf/syscall.c:132:5) ! 50us [-ENOMEM]
array_map_alloc !* 2us [NULL] bpf_map_alloc_percpu Could you double
check? It does need corresponding kernel source though. |
>
> How about adding a tracepoint in bpf_check_attach_target_with_klog()?
> It's to avoid putting stuff in dmesg.
>
> Thanks,
> Leon
>
>
next prev parent reply other threads:[~2024-07-25 6:10 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-25 5:15 [PATCH bpf-next v2] bpf: Add bpf_check_attach_target_with_klog method to output failure logs to kernel Zheao Li
2024-07-25 5:54 ` Yonghong Song
2024-07-25 6:05 ` Leon Hwang
2024-07-25 6:09 ` Yonghong Song [this message]
2024-07-25 6:32 ` Manjusaka
2024-07-25 16:51 ` Alexei Starovoitov
2024-07-25 7:32 ` Leon Hwang
2024-07-25 21:27 ` Andrii Nakryiko
2024-07-26 2:57 ` Leon Hwang
2024-07-27 0:12 ` Andrii Nakryiko
2024-07-27 4:04 ` Leon Hwang
2024-07-29 21:01 ` Andrii Nakryiko
2024-07-30 3:32 ` Leon Hwang
2024-07-30 17:28 ` Andrii Nakryiko
2024-07-31 3:31 ` Leon Hwang
2024-08-01 16:59 ` Andrii Nakryiko
2024-08-02 5:35 ` Leon Hwang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=6511ce2a-1c7d-497c-aeb6-d4f0b17271ed@linux.dev \
--to=yonghong.song@linux.dev \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=haoluo@google.com \
--cc=hffilwlqm@gmail.com \
--cc=john.fastabend@gmail.com \
--cc=jolsa@kernel.org \
--cc=kpsingh@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=martin.lau@linux.dev \
--cc=me@manjusaka.me \
--cc=sdf@fomichev.me \
--cc=song@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.