Messages in this thread | | | Subject | Re: Using perf_event_open() to sample multiple events of a process | From | Nadav Amit <> | Date | Fri, 5 Nov 2021 17:59:26 -0700 |
| |
> On Nov 5, 2021, at 5:45 PM, Peter Zijlstra <peterz@infradead.org> wrote: > > On Thu, Nov 04, 2021 at 10:57:50PM -0700, Nadav Amit wrote: >> Hello Ken, Peter, >> >> I would appreciate some help regarding the use of perf_event_open() >> to have multiple samples getting into the same mmap’d memory when they >> are both attached to the same process. >> >> I am doing so (using both PERF_FLAG_FD_NO_GROUP and PERF_FLAG_FD_OUTPUT), >> but it results in -EINVAL. Debugging the code shows that >> perf_event_set_output() fails due to the following check: >> >> /* >> * If its not a per-cpu rb, it must be the same task. >> */ >> if (output_event->cpu == -1 && output_event->ctx != event->ctx) >> goto out; >> >> However, it appears that at this point, event->ctx is not initialized >> (it is null) so the test fails and the whole perf_event_open() syscall >> fails. >> >> Am I missing something? If not, I am unsure, unfortunately, what the >> proper way to fix it is… >> >> I include a small test that fails on my system. The second >> perf_event_open fails due to the check in perf_event_set_output(): >> > > Works when you use the SET_OUTPUT ioctl()... > > I think something went sideways in the syscall path and things went out > of order :/ I'll try and have a look.
Highly appreciated.
While at it, I would note that there is a mistake in Intel SDM 31.4.2.27, Table 31-47 “Block Item Packet Definition”. The ID[5:0] takes 6 bits, when in fact I presume it is only 5 bits (according to the table).
Perhaps you can forward it to the relevant people.
Thanks again, Nadav
| |