Peter Zijlstra <[email protected]> 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; >> +} -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

