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);
> +     }
> +}

Reply via email to