lkml.org 
[lkml]   [2017]   [Aug]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch V3 14/44] x86/smp: Remove pointless duplicated interrupt code
    Two NOP5 are really a good tradeoff vs. the unholy IDT switching mess,
    which duplicates code all over the place. The rescheduling interrupt gets
    optimized in a later step.

    Make the ordering of function call and statistics increment the same as in
    other places. stats first, then function call.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    ---
    arch/x86/include/asm/hw_irq.h | 4 +--
    arch/x86/kernel/smp.c | 43 ++++++------------------------------------
    2 files changed, 9 insertions(+), 38 deletions(-)

    --- a/arch/x86/include/asm/hw_irq.h
    +++ b/arch/x86/include/asm/hw_irq.h
    @@ -49,8 +49,8 @@ extern asmlinkage void call_function_sin
    #ifdef CONFIG_TRACING
    /* Interrupt handlers registered during init_IRQ */
    extern void trace_reschedule_interrupt(void);
    -extern void trace_call_function_interrupt(void);
    -extern void trace_call_function_single_interrupt(void);
    +#define trace_call_function_interrupt call_function_interrupt
    +#define trace_call_function_single_interrupt call_function_single_interrupt
    #define trace_thermal_interrupt thermal_interrupt
    #define trace_threshold_interrupt threshold_interrupt
    #define trace_deferred_error_interrupt deferred_error_interrupt
    --- a/arch/x86/kernel/smp.c
    +++ b/arch/x86/kernel/smp.c
    @@ -281,57 +281,28 @@ static inline void __smp_reschedule_inte
    */
    ipi_entering_ack_irq();
    trace_reschedule_entry(RESCHEDULE_VECTOR);
    - __smp_reschedule_interrupt();
    + inc_irq_stat(irq_resched_count);
    + scheduler_ipi();
    trace_reschedule_exit(RESCHEDULE_VECTOR);
    exiting_irq();
    - /*
    - * KVM uses this interrupt to force a cpu out of guest mode
    - */
    -}
    -
    -static inline void __smp_call_function_interrupt(void)
    -{
    - generic_smp_call_function_interrupt();
    - inc_irq_stat(irq_call_count);
    }

    __visible void __irq_entry smp_call_function_interrupt(struct pt_regs *regs)
    {
    ipi_entering_ack_irq();
    - __smp_call_function_interrupt();
    - exiting_irq();
    -}
    -
    -__visible void __irq_entry
    -smp_trace_call_function_interrupt(struct pt_regs *regs)
    -{
    - ipi_entering_ack_irq();
    trace_call_function_entry(CALL_FUNCTION_VECTOR);
    - __smp_call_function_interrupt();
    - trace_call_function_exit(CALL_FUNCTION_VECTOR);
    - exiting_irq();
    -}
    -
    -static inline void __smp_call_function_single_interrupt(void)
    -{
    - generic_smp_call_function_single_interrupt();
    inc_irq_stat(irq_call_count);
    -}
    -
    -__visible void __irq_entry
    -smp_call_function_single_interrupt(struct pt_regs *regs)
    -{
    - ipi_entering_ack_irq();
    - __smp_call_function_single_interrupt();
    + generic_smp_call_function_interrupt();
    + trace_call_function_exit(CALL_FUNCTION_VECTOR);
    exiting_irq();
    }

    -__visible void __irq_entry
    -smp_trace_call_function_single_interrupt(struct pt_regs *regs)
    +__visible void __irq_entry smp_call_function_single_interrupt(struct pt_regs *r)
    {
    ipi_entering_ack_irq();
    trace_call_function_single_entry(CALL_FUNCTION_SINGLE_VECTOR);
    - __smp_call_function_single_interrupt();
    + inc_irq_stat(irq_call_count);
    + generic_smp_call_function_single_interrupt();
    trace_call_function_single_exit(CALL_FUNCTION_SINGLE_VECTOR);
    exiting_irq();
    }

    \
     
     \ /
      Last update: 2017-08-28 09:02    [W:4.222 / U:0.312 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site