From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Borkmann Subject: Re: [PATCH] samples/bpf: Add xdp_sample_pkts example Date: Sat, 2 Jun 2018 06:22:50 +0200 Message-ID: References: <20180530164524.21760-1-toke@toke.dk> <87a7sgcg7i.fsf@toke.dk> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Cc: Networking To: =?UTF-8?Q?Toke_H=c3=b8iland-J=c3=b8rgensen?= , Song Liu Return-path: Received: from www62.your-server.de ([213.133.104.62]:40236 "EHLO www62.your-server.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750748AbeFBEWz (ORCPT ); Sat, 2 Jun 2018 00:22:55 -0400 In-Reply-To: <87a7sgcg7i.fsf@toke.dk> Content-Language: en-US Sender: netdev-owner@vger.kernel.org List-ID: On 05/31/2018 11:44 AM, Toke Høiland-Jørgensen wrote: > Song Liu writes: > >> On Wed, May 30, 2018 at 9:45 AM, Toke Høiland-Jørgensen wrote: >>> 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. 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.