Thread (7 messages) 7 messages, 3 authors, 2018-06-04

Re: [PATCH] samples/bpf: Add xdp_sample_pkts example

From: Daniel Borkmann <daniel@iogearbox.net>
Date: 2018-06-04 13:12:18

On 06/04/2018 03:02 PM, Toke Høiland-Jørgensen wrote:
Daniel Borkmann [off-list ref] writes:
quoted
On 06/02/2018 06:22 AM, Daniel Borkmann wrote:
quoted
On 05/31/2018 11:44 AM, Toke Høiland-Jørgensen wrote:
quoted
Song Liu [off-list ref] writes:
quoted
On Wed, May 30, 2018 at 9:45 AM, Toke Høiland-Jørgensen [off-list ref] wrote:
quoted
This adds an example program showing how to sample packets from XDP using
the perf event buffer. The example userspace program just prints the
ethernet header for every packet sampled.

Most of the userspace code is borrowed from other examples, most notably
trace_output.

Note that the example only works when everything runs on CPU0; so
suitable smp_affinity needs to be set on the device. Some drivers seem
to reset smp_affinity when loading an XDP program, so it may be
necessary to change it after starting the example userspace program.
Why does this only works when everything runs on CPU0? Is this
something we can improve?
Yeah, good question. Basically, the call from XDP to
bpf_perf_event_output() will fail with -EOPNOTSUPP. I tracked this down
to this if statement in __bpf_perf_event_output() in bpf_trace.c:
quoted
	if (unlikely(event->oncpu != cpu))
		return -EOPNOTSUPP;
I *think* that the way to fix this is for the userspace program to open
a perf file descriptor for each CPU in the system and poll all of them,
in which case the XDP program can pass the BPF_F_CURRENT_CPU flag to
access the right one.
That is correct, you need one perf fd per cpu, and map them accordingly
into the map slots when you use BPF_F_CURRENT_CPU.
Given this is a sample that users are likely to copy from, I think it would
be great if you could fix this up so you can just pass in BPF_F_CURRENT_CPU
eventually. Thanks for working on this, Toke!
You're welcome! And yup, I was planning to. I'll need to add a new
function to the trace helpers that can poll more than one fd; just
haven't gotten around to it yet. :)
Ok, great, looking forward!

Cheers,
Daniel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help