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

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

From: Toke Høiland-Jørgensen <toke@toke.dk>
Date: 2018-05-31 09:44:20

Song Liu [off-list ref] writes:
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:
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. I would love for someone more knowledgeable about
perf internals to confirm this, though.

And, well, the polling function in trace_helpers.c doesn't support
currently this, and I didn't have the time to fix that while writing
this example :)

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