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-02 04:22:55

On 05/31/2018 11:44 AM, Toke Høiland-Jørgensen wrote:
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.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help