From: Yonghong Song <yonghong.song@linux.dev>
To: Hao Peng <flyingpenghao@gmail.com>,
Alexei Starovoitov <alexei.starovoitov@gmail.com>
Cc: Alexei Starovoitov <ast@kernel.org>, bpf <bpf@vger.kernel.org>,
Peng Hao <flyingpeng@tencent.com>
Subject: Re: [PATCH v2] bpf: make function do_misc_fixups as noinline_for_stack
Date: Thu, 25 Jul 2024 08:34:54 -0700 [thread overview]
Message-ID: <36c0e452-a7fd-4abd-bc53-5c879492180f@linux.dev> (raw)
In-Reply-To: <CAPm50aLhVegFY=H=PTGD3+Ny_KFszWn5bNiCzwyV39z_j2QnQA@mail.gmail.com>
On 7/24/24 11:18 PM, Hao Peng wrote:
> On Sat, Jul 13, 2024 at 12:43 AM Alexei Starovoitov
> <alexei.starovoitov@gmail.com> wrote:
>> On Wed, Jul 10, 2024 at 10:45 PM <flyingpenghao@gmail.com> wrote:
>>>
>>> By tracing the call chain, we found that do_misc_fixups consumed a lot
>>> of stack space. mark it as noinline_for_stack to prevent it from spreading
>>> to bpf_check's stack size.
>> ...
>>> -static int do_misc_fixups(struct bpf_verifier_env *env)
>>> +static noinline_for_stack int do_misc_fixups(struct bpf_verifier_env *env)
>> Now we're getting somewhere, but this is not a fix.
>> It may shut up the warn, but it will only increase the total stack usage.
>> Looking at C code do_misc_fixups() needs ~200 bytes worth of stack
>> space for insn_buf[16] and spill/fill.
>> That's far from the artificial 2k limit.
>>
>> Please figure out what exact variable is causing kasan to consume
>> so much stack. You may need to analyze compiler internals and
>> do more homework.
>> What is before/after stack usage ? with and without kasan?
>> With gcc try
>> +CFLAGS_verifier.o += -fstack-usage
>>
>> I see:
>> sort -k2 -n kernel/bpf/verifier.su |tail -10
>> ../kernel/bpf/verifier.c:13087:12:adjust_ptr_min_max_vals 240
>> dynamic,bounded
>> ../kernel/bpf/verifier.c:20804:12:do_check_common 248 dynamic,bounded
>> ../kernel/bpf/verifier.c:19151:12:convert_ctx_accesses 256 static
>> ../kernel/bpf/verifier.c:7450:12:check_mem_reg 256 static
>> ../kernel/bpf/verifier.c:7482:12:check_kfunc_mem_size_reg 256 static
>> ../kernel/bpf/verifier.c:10268:12:check_helper_call.isra 272
>> dynamic,bounded
>> ../kernel/bpf/verifier.c:21562:5:bpf_check 296 dynamic,bounded
>> ../kernel/bpf/verifier.c:19860:12:do_misc_fixups 320 static
>> ../kernel/bpf/verifier.c:13991:12:adjust_reg_min_max_vals 392 static
>> ../kernel/bpf/verifier.c:12280:12:check_kfunc_call.isra 408
>> dynamic,bounded
>>
>> do_misc_fixups() is not the smallest, but not that large either.
>>
> If I use gcc, I get the same result as you, but if I use llvm to build
> the kernel, the result is like this:
> # sort -k2 -n kernel/bpf/verifier.su | tail -10
> kernel/bpf/verifier.c:14026:adjust_reg_min_max_vals 440 static
> kernel/bpf/verifier.c:7432:check_mem_reg 440 static
> kernel/bpf/verifier.c:15955:check_cfg 472 static
> kernel/bpf/verifier.c:7464:check_kfunc_mem_size_reg 472 static
> kernel/bpf/verifier.c:15104:check_cond_jmp_op 504 static
> kernel/bpf/verifier.c:4166:__mark_chain_precision 504 static
> kernel/bpf/verifier.c:10239:check_helper_call 536 static
> kernel/bpf/verifier.c:17744:do_check 792 static
> kernel/bpf/verifier.c:12248:check_kfunc_call 984 static
> kernel/bpf/verifier.c:21486:bpf_check 2456 static
>
> Obviously, do_misc_fixups is automatically inlined into bpf_check.
> So adding noinline_for_stack to the do_misc_fixups function is a solution.
Looks like you are building your own kernel with KASAN.
You can change config CONFIG_FRAME_WARN value. In your config file you
have CONFIG_FRAME_WARN=2048. You can change it to
CONFIG_FRAME_WARN=4096 which should fix the issue.
>
> Thanks.
>
>> Do in-depth analysis instead of silencing the warn.
>>
>> pw-bot: cr
prev parent reply other threads:[~2024-07-25 15:35 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-11 5:45 [PATCH v2] bpf: make function do_misc_fixups as noinline_for_stack flyingpenghao
2024-07-12 16:43 ` Alexei Starovoitov
2024-07-25 6:18 ` Hao Peng
2024-07-25 15:34 ` Yonghong Song [this message]
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=36c0e452-a7fd-4abd-bc53-5c879492180f@linux.dev \
--to=yonghong.song@linux.dev \
--cc=alexei.starovoitov@gmail.com \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=flyingpeng@tencent.com \
--cc=flyingpenghao@gmail.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox