On Tue, Oct 22, 2019 at 09:01:11AM +0300, Alexey Budankov wrote:

>                       swap(ctx->task_ctx_data, next_ctx->task_ctx_data);
>  
> +                     /*
> +                      * PMU specific parts of task perf context can require
> +                      * additional synchronization which makes sense only if
> +                      * both next_ctx->task_ctx_data and ctx->task_ctx_data
> +                      * pointers are allocated. As an example of such
> +                      * synchronization see implementation details of Intel
> +                      * LBR call stack data profiling;
> +                      */
> +                     if (ctx->task_ctx_data && next_ctx->task_ctx_data)
> +                             pmu->sync_task_ctx(next_ctx->task_ctx_data,
> +                                                ctx->task_ctx_data);

This still does not check if pmu->sync_task_ctx is set. If any other
arch ever uses task_ctx_data without then also supplying this method
things will go *bang*.

Also, I think I prefer the variant I gave you yesterday:

  
https://lkml.kernel.org/r/20191021103745.gf1...@hirez.programming.kicks-ass.net

        if (pmu->swap_task_ctx)
                pmu->swap_task_ctx(ctx, next_ctx);
        else
                swap(ctx->task_ctx_data, next_ctx->task_ctx_data);

That also unconfuses the argument order in your above patch (where you
have to undo thw swap).

Alternatively, since there currently is no other arch using
task_ctx_data, we can make the pmu::swap_task_ctx() thing mandatory when
having it and completely replace the swap(), write it like so:


-       swap(ctx->task_ctx_data, next_ctx->task_ctx_data);
+       if (pmu->swap_task_ctx)
+               pmu->swap_task_ctx(ctx, next_ctx);

Hmm?

Reply via email to