On Fri, 25 Aug 2017 12:31:17 +0200
Thomas Gleixner <[email protected]> wrote:


> -__visible void __irq_entry smp_trace_reschedule_interrupt(struct pt_regs 
> *regs)
> -{
> -     /*
> -      * Need to call irq_enter() before calling the trace point.
> -      * __smp_reschedule_interrupt() calls irq_enter/exit() too (in
> -      * scheduler_ipi(). This is OK, since those functions are allowed
> -      * to nest.
> -      */
> -     ipi_entering_ack_irq();
> -     trace_reschedule_entry(RESCHEDULE_VECTOR);
> +     if (trace_irqvectors_enabled()) {
> +             /*
> +              * scheduler_ipi() might call irq_enter() as well, but
> +              * nested calls are fine.
> +              */
> +             irq_enter();
> +             trace_reschedule_entry(RESCHEDULE_VECTOR);
> +     }
> +
>       inc_irq_stat(irq_resched_count);
>       scheduler_ipi();
> -     trace_reschedule_exit(RESCHEDULE_VECTOR);
> -     exiting_irq();
> +
> +     if (trace_irqvectors_enabled()) {
> +             trace_reschedule_exit(RESCHEDULE_VECTOR);
> +             irq_exit();

This is racy. If the static key gets changed on one and not the other,
we lose the irq_enter/irq_exit match.

-- Steve


> +     }
>  }
>  
>  __visible void __irq_entry smp_call_function_interrupt(struct pt_regs *regs)
> 

Reply via email to