Messages in this thread | | | From | Alexander Shishkin <> | Subject | Re: [PATCH v0 3/5] perf: Introduce instruction trace filtering | Date | Fri, 11 Dec 2015 17:27:22 +0200 |
| |
Peter Zijlstra <peterz@infradead.org> writes:
> On Fri, Dec 11, 2015 at 03:36:36PM +0200, Alexander Shishkin wrote: >> +static int perf_event_itrace_filters_setup(struct perf_event *event) >> +{ >> + int ret; >> + >> + /* >> + * We can't use event_function_call() here, because that would >> + * require ctx::mutex, but one of our callers is called with >> + * mm::mmap_sem down, which would cause an inversion, see bullet >> + * (2) in put_event(). >> + */ >> + do { >> + if (READ_ONCE(event->state) != PERF_EVENT_STATE_ACTIVE) { >> + ret = event->pmu->itrace_filter_setup(event); >> + break; > > So this is tricky, if its not active it can be any moment, there is > nothing serializing against that.
Indeed. But we should be able to call pmu::itrace_filter_setup() multiple times, so if after this we re-check that the event is still inactive, we can return, otherwise proceed with the cross-call. Does this make sense?
> >> + } >> + >> + /* matches smp_wmb() in event_sched_in() */ >> + smp_rmb(); >> + >> + ret = cpu_function_call(READ_ONCE(event->oncpu), >> + __perf_event_itrace_filters_setup, event); > > This otoh, running with IRQs disabled on the CPU the thing is active on > guarantees it will not become inactive -- nothing can come in and switch > it off. > >> + } while (ret == -EAGAIN); >> + >> + return ret; >> +}
| |