All of lore.kernel.org
 help / color / mirror / Atom feed
* libxdp with bpf_stats_enabled question
@ 2020-12-16 22:29 Brian G. Merrell
  2020-12-17 12:59 ` Toke Høiland-Jørgensen
  0 siblings, 1 reply; 2+ messages in thread
From: Brian G. Merrell @ 2020-12-16 22:29 UTC (permalink / raw)
  To: xdp-newbies

Hi,

I've been playing around with the new xdp-loader to chain xdp programs
with kernel.bpf_stats_enabled set. This is what I see (from bpftool
prog):

22: xdp  name xdp_dispatcher  tag d51e469e988d81da  gpl run_time_ns 105086 run_cnt 24
        loaded_at 2020-12-15T07:52:27+0000  uid 0
        xlated 720B  jited 535B  memlock 4096B  map_ids 5
        btf_id 8
24: ext  name xdp_pass  tag 3b185187f1855c4c  gpl
        loaded_at 2020-12-15T07:52:27+0000  uid 0
        xlated 16B  jited 18B  memlock 4096B
        btf_id 9
26: ext  name xdp_drop  tag 57cd311f2e27366b  gpl
        loaded_at 2020-12-15T07:52:27+0000  uid 0
        xlated 16B  jited 18B  memlock 4096B
        btf_id 10

You'll notice that the run_time_ns and run_cnt stats are only populated
for the xdp_dispatcher. This is basically the same behavior we see today
with bpf_tail_call chaining, so it's not a regression or anything. It
would be really nice, though, if we could see those stats for each
individual xdp program in the chain. Does anyone know what it would take
for that to happen? Would it be more feasible for xdplib to optionally
report separate runtime stats itself for chained programs?

Thanks,
Brian

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: libxdp with bpf_stats_enabled question
  2020-12-16 22:29 libxdp with bpf_stats_enabled question Brian G. Merrell
@ 2020-12-17 12:59 ` Toke Høiland-Jørgensen
  0 siblings, 0 replies; 2+ messages in thread
From: Toke Høiland-Jørgensen @ 2020-12-17 12:59 UTC (permalink / raw)
  To: Brian G. Merrell, xdp-newbies

"Brian G. Merrell" <brian.g.merrell@gmail.com> writes:

> Hi,
>
> I've been playing around with the new xdp-loader to chain xdp programs
> with kernel.bpf_stats_enabled set. This is what I see (from bpftool
> prog):
>
> 22: xdp  name xdp_dispatcher  tag d51e469e988d81da  gpl run_time_ns 105086 run_cnt 24
>         loaded_at 2020-12-15T07:52:27+0000  uid 0
>         xlated 720B  jited 535B  memlock 4096B  map_ids 5
>         btf_id 8
> 24: ext  name xdp_pass  tag 3b185187f1855c4c  gpl
>         loaded_at 2020-12-15T07:52:27+0000  uid 0
>         xlated 16B  jited 18B  memlock 4096B
>         btf_id 9
> 26: ext  name xdp_drop  tag 57cd311f2e27366b  gpl
>         loaded_at 2020-12-15T07:52:27+0000  uid 0
>         xlated 16B  jited 18B  memlock 4096B
>         btf_id 10
>
> You'll notice that the run_time_ns and run_cnt stats are only populated
> for the xdp_dispatcher. This is basically the same behavior we see today
> with bpf_tail_call chaining, so it's not a regression or anything. It
> would be really nice, though, if we could see those stats for each
> individual xdp program in the chain. Does anyone know what it would take
> for that to happen?

The stats are computed by the bits behind the static_branch_unlikely()
calls here:

https://elixir.bootlin.com/linux/latest/source/kernel/bpf/trampoline.c#L391

The calls to __bpf_prog_enter() and __bpf_prog_exit() is emitted in the
top-level dispatcher code that invokes a BPF program from whatever
kernel hook it runs at. Which is why it only shows up for the
dispatcher: From the kernel PoV that's the top-level BPF program being
run, the other programs are patched in as substitutions for function
calls inside the top-level BPF program.

That being said, the trampoline code that does the function-level
patching could conceivably add the same conditional stats update code
before and after each jump. Not sure how complicated it would be to add
this, but it would mean that stats would automatically appear for each
freplace program.

> Would it be more feasible for xdplib to optionally report separate
> runtime stats itself for chained programs?

The dispatcher program could certainly track this by just calling
bpf_ktime_get_ns() before and after each sub-program and sticking the
results in a map. It wouldn't be reported by the kernel and bpftool, but
libxdp and xdp-tools could expose it. The drawback with this approach is
that it would be tied to a particular dispatcher instance, so either
they would be reset whenever you load an additional program, or the
library has to copy over the old stats, which would probably not be
doable atomically. For stats that may not matter too much, but it's
something to consider.

-Toke


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2020-12-17 13:01 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-12-16 22:29 libxdp with bpf_stats_enabled question Brian G. Merrell
2020-12-17 12:59 ` Toke Høiland-Jørgensen

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.