From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jakub Kicinski Subject: Re: [PATCH bpf-next v4 1/2] trace_helpers.c: Add helpers to poll multiple perf FDs for events Date: Tue, 5 Jun 2018 15:16:36 -0700 Message-ID: <20180605151539.2fb16370@cakuba.netronome.com> References: <152821020087.23694.8231039605257373797.stgit@alrua-kau> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Cc: netdev@vger.kernel.org To: Toke =?UTF-8?B?SMO4aWxhbmQtSsO4cmdlbnNlbg==?= Return-path: Received: from mail-pf0-f195.google.com ([209.85.192.195]:47019 "EHLO mail-pf0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752362AbeFEWQj (ORCPT ); Tue, 5 Jun 2018 18:16:39 -0400 Received: by mail-pf0-f195.google.com with SMTP id q1-v6so2050443pff.13 for ; Tue, 05 Jun 2018 15:16:39 -0700 (PDT) In-Reply-To: <152821020087.23694.8231039605257373797.stgit@alrua-kau> Sender: netdev-owner@vger.kernel.org List-ID: On Tue, 05 Jun 2018 16:50:00 +0200, Toke H=C3=B8iland-J=C3=B8rgensen wrote: > Add two new helper functions to trace_helpers that supports polling > multiple perf file descriptors for events. These are used to the XDP > perf_event_output example, which needs to work with one perf fd per CPU. >=20 > Signed-off-by: Toke H=C3=B8iland-J=C3=B8rgensen > --- > tools/testing/selftests/bpf/trace_helpers.c | 47 +++++++++++++++++++++= +++++- > tools/testing/selftests/bpf/trace_helpers.h | 4 ++ > 2 files changed, 49 insertions(+), 2 deletions(-) >=20 > diff --git a/tools/testing/selftests/bpf/trace_helpers.c b/tools/testing/= selftests/bpf/trace_helpers.c > index 3868dcb63420..1e62d89f34cf 100644 > --- a/tools/testing/selftests/bpf/trace_helpers.c > +++ b/tools/testing/selftests/bpf/trace_helpers.c > @@ -88,7 +88,7 @@ static int page_size; > static int page_cnt =3D 8; > static struct perf_event_mmap_page *header; > =20 > -int perf_event_mmap(int fd) > +int perf_event_mmap_header(int fd, struct perf_event_mmap_page **header) > { > void *base; > int mmap_size; > @@ -102,10 +102,15 @@ int perf_event_mmap(int fd) > return -1; > } > =20 > - header =3D base; > + *header =3D base; > return 0; > } > =20 > +int perf_event_mmap(int fd) > +{ > + return perf_event_mmap_header(fd, &header); > +} > + > static int perf_event_poll(int fd) > { > struct pollfd pfd =3D { .fd =3D fd, .events =3D POLLIN }; > @@ -163,3 +168,41 @@ int perf_event_poller(int fd, perf_event_print_fn ou= tput_fn) > =20 > return ret; > } > + > +int perf_event_poller_multi(int *fds, struct perf_event_mmap_page **head= ers, > + int num_fds, perf_event_print_fn output_fn) > +{ > + enum bpf_perf_event_ret ret; > + struct pollfd *pfds; > + void *buf =3D NULL; > + size_t len =3D 0; > + int i; > + > + pfds =3D malloc(sizeof(*pfds) * num_fds); > + if (!pfds) > + return -1; nit: this is correct, but better use LIBBPF_PERF_EVENT_ERROR? This function is supposed to return enum bpf_perf_event_ret values I assume? In case someone moves this code to libbpf later on... > + memset(pfds, 0, sizeof(*pfds) * num_fds); > + for (i =3D 0; i < num_fds; i++) { > + pfds[i].fd =3D fds[i]; > + pfds[i].events =3D POLLIN; > + } > + > + for (;;) { > + poll(pfds, num_fds, 1000); > + for (i =3D 0; i < num_fds; i++) { > + if (pfds[i].revents) { nit: save yourself a lever of indentation by doing: if (!pfds[i].revents) continue; and you won't have to go over 80 chars. > + ret =3D bpf_perf_event_read_simple(headers[i], page_cnt * page_size, > + page_size, &buf, &len, > + bpf_perf_event_print, > + output_fn); > + if (ret !=3D LIBBPF_PERF_EVENT_CONT) > + break; > + } > + } > + } > + free(buf); > + free(pfds); > + > + return ret; > +}