Re: [PATCH bpf-next v1 1/3] bpf: Show more useful info in stack depth stats

Eduard Zingerman <[email protected]> Sun, 02 Aug 2026 15:03:09 -0700
Newsgroups org.kernel.vger.bpf
Message-ID <[email protected]>
On Sun, 2026-08-02 at 23:59 +0200, Kumar Kartikeya Dwivedi wrote:
> On Sun Aug 2, 2026 at 11:02 PM CEST, Eduard Zingerman wrote:
> > On Sun, 2026-08-02 at 01:03 +0200, Kumar Kartikeya Dwivedi wrote:
> > > Currently, the output of stack depth statistics is two crude, with a
> > > list of captured stack depths ordered by the subprog numbers. The actual
> > > subprog numbers are determined by libbpf, hence it is hard to associate
> > > the stack depth statistic back to the subprog by name.
> > > 
> > > Change the format to:
> > > stack depth <subprog>=<depth> ... max=<depth>
> > > 
> > > In case the subprog name is not specified, use subprog[N] as the string.
> > > 
> > > Suggested-by: Andrii Nakryiko <[email protected]>
> > > Signed-off-by: Kumar Kartikeya Dwivedi <[email protected]>
> > > ---
> > >  kernel/bpf/verifier.c                         | 16 ++++++++++++----
> > >  .../bpf/progs/verifier_basic_stack.c          |  4 ++--
> > >  .../bpf/progs/verifier_bpf_fastcall.c         | 19 +++++++++++--------
> > >  .../bpf/progs/verifier_private_stack.c        |  9 ++++++---
> > >  .../selftests/bpf/progs/verifier_var_off.c    |  4 ++--
> > >  5 files changed, 33 insertions(+), 19 deletions(-)
> > > 
> > > diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
> > > index 8d0635ee48c7..51ac0a9ae339 100644
> > > --- a/kernel/bpf/verifier.c
> > > +++ b/kernel/bpf/verifier.c
> > > @@ -18703,10 +18703,18 @@ static void print_verification_stats(struct bpf_verifier_env *env)
> > >  	if (env->log.level & BPF_LOG_STATS) {
> > >  		verbose(env, "verification time %lld usec\n",
> > >  			div_u64(env->verification_time, 1000));
> > > -		verbose(env, "stack depth %d", env->subprog_info[0].stack_depth);
> > > -		for (i = 1; i < subprog_cnt; i++)
> > > -			verbose(env, "+%d", env->subprog_info[i].stack_depth);
> > > -		verbose(env, " max %d\n", env->max_stack_depth);
> > > +		verbose(env, "stack depth");
> > > +		for (i = 0; i < subprog_cnt; i++) {
> > > +			const char *name = env->subprog_info[i].name;
> > > +
> > > +			if (name && name[0])
> > > +				verbose(env, " %s=%d", name,
> > > +					env->subprog_info[i].stack_depth);
> > > +			else
> > > +				verbose(env, " subprog[%d]=%d", i,
> > > +					env->subprog_info[i].stack_depth);
> > 
> > That would be not very convenient to parse by veristat,
> > but I'd print every subprogram on it's own line.
> > 
> 
> I can do that, but let's agree on the format before I get to it.
> How should it look like? Prefix with stack depth every line, and print stack
> depth max ... as the very first line? Like so:
> 
> stack depth max N
> stack depth subprog 0 <name> N
> ...
> stack depth subprog N <name> N
> 
> ?

Ideally I'd drop the "stack depth " prefix after the first one and
just add an indentation instead. But that would be hard for veristat
to parse. So let's settle on your suggested version.

> > > +		}
> > > +		verbose(env, " max=%d\n", env->max_stack_depth);
> > 
> > I think check_max_stack_depth_subprog() needs a similar update,
> > at the moment it reports a not very helpful error like this:
> > 
> >   combined stack size of 34 calls is 528. Too large
> > 
> > Printing the offending spine would be helpful.
> > 
> 
> I'll do that in verifier errors patch set. This is just for the verification
> stats, that are outside its scope.

Fine by me