On Wed, Jul 31, 2019 at 05:30:35PM +0300, Alexander Shishkin wrote: > +static void perf_put_aux_event(struct perf_event *event) > +{ > + struct perf_event_context *ctx = event->ctx; > + struct perf_cpu_context *cpuctx = __get_cpu_context(ctx); > + struct perf_event *iter = NULL; > + > + /* > + * If event uses aux_event tear down the link > + */ > + if (event->aux_event) { > + put_event(event->aux_event); > + event->aux_event = NULL;
Those lines should probably be reversed; put_event() should be done after clearing the link. It probably doesn't matter, but it is confusing. > + return; > + } > + > + /* > + * If the event is an aux_event, tear down all links to > + * it from other events. > + */ > + for_each_sibling_event(iter, event->group_leader) { > + if (iter->aux_event != event) > + continue; > + > + iter->aux_event = NULL; > + put_event(event); > + > + /* > + * If it's ACTIVE, schedule it out. It won't schedule > + * again because !aux_event. > + */ > + event_sched_out(iter, cpuctx, ctx); > + } > +}