lkml.org 
[lkml]   [2020]   [May]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip: x86/entry] x86/entry: Convert KVM vectors to IDTENTRY_SYSVEC*
    The following commit has been merged into the x86/entry branch of tip:

    Commit-ID: 79e5785846099b7f48c92ffa299a4ddc1e4a98f6
    Gitweb: https://git.kernel.org/tip/79e5785846099b7f48c92ffa299a4ddc1e4a98f6
    Author: Thomas Gleixner <tglx@linutronix.de>
    AuthorDate: Thu, 21 May 2020 22:05:42 +02:00
    Committer: Ingo Molnar <mingo@kernel.org>
    CommitterDate: Tue, 26 May 2020 19:06:28 +02:00

    x86/entry: Convert KVM vectors to IDTENTRY_SYSVEC*

    Convert KVM specific system vectors to IDTENTRY_SYSVEC*:

    The two empty stub handlers which only increment the stats counter do no
    need to run on the interrupt stack. Use IDTENTRY_SYSVEC_SIMPLE for them.

    The wakeup handler does more work and runs on the interrupt stack.

    None of these handlers need to save and restore the irq_regs pointer.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Acked-by: Paolo Bonzini <pbonzini@redhat.com>
    Acked-by: Andy Lutomirski <luto@kernel.org>
    Link: https://lore.kernel.org/r/20200521202119.555715519@linutronix.de
    ---
    arch/x86/entry/entry_64.S | 7 -------
    arch/x86/include/asm/entry_arch.h | 7 -------
    arch/x86/include/asm/hw_irq.h | 4 ----
    arch/x86/include/asm/idtentry.h | 6 ++++++
    arch/x86/include/asm/irq.h | 3 ---
    arch/x86/kernel/idt.c | 6 +++---
    arch/x86/kernel/irq.c | 24 ++++++------------------
    7 files changed, 15 insertions(+), 42 deletions(-)

    diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S
    index 2301f62..ea1f293 100644
    --- a/arch/x86/entry/entry_64.S
    +++ b/arch/x86/entry/entry_64.S
    @@ -956,13 +956,6 @@ apicinterrupt3 \num \sym \do_sym
    POP_SECTION_IRQENTRY
    .endm

    -
    -#ifdef CONFIG_HAVE_KVM
    -apicinterrupt3 POSTED_INTR_VECTOR kvm_posted_intr_ipi smp_kvm_posted_intr_ipi
    -apicinterrupt3 POSTED_INTR_WAKEUP_VECTOR kvm_posted_intr_wakeup_ipi smp_kvm_posted_intr_wakeup_ipi
    -apicinterrupt3 POSTED_INTR_NESTED_VECTOR kvm_posted_intr_nested_ipi smp_kvm_posted_intr_nested_ipi
    -#endif
    -
    #ifdef CONFIG_SMP
    apicinterrupt RESCHEDULE_VECTOR reschedule_interrupt smp_reschedule_interrupt
    #endif
    diff --git a/arch/x86/include/asm/entry_arch.h b/arch/x86/include/asm/entry_arch.h
    index 69a5320..a01bb74 100644
    --- a/arch/x86/include/asm/entry_arch.h
    +++ b/arch/x86/include/asm/entry_arch.h
    @@ -13,10 +13,3 @@
    #ifdef CONFIG_SMP
    BUILD_INTERRUPT(reschedule_interrupt,RESCHEDULE_VECTOR)
    #endif
    -
    -#ifdef CONFIG_HAVE_KVM
    -BUILD_INTERRUPT(kvm_posted_intr_ipi, POSTED_INTR_VECTOR)
    -BUILD_INTERRUPT(kvm_posted_intr_wakeup_ipi, POSTED_INTR_WAKEUP_VECTOR)
    -BUILD_INTERRUPT(kvm_posted_intr_nested_ipi, POSTED_INTR_NESTED_VECTOR)
    -#endif
    -
    diff --git a/arch/x86/include/asm/hw_irq.h b/arch/x86/include/asm/hw_irq.h
    index 7281c7e..fd5e7c8 100644
    --- a/arch/x86/include/asm/hw_irq.h
    +++ b/arch/x86/include/asm/hw_irq.h
    @@ -29,10 +29,6 @@
    #include <asm/sections.h>

    /* Interrupt handlers registered during init_IRQ */
    -extern asmlinkage void kvm_posted_intr_ipi(void);
    -extern asmlinkage void kvm_posted_intr_wakeup_ipi(void);
    -extern asmlinkage void kvm_posted_intr_nested_ipi(void);
    -
    extern asmlinkage void reschedule_interrupt(void);

    #ifdef CONFIG_X86_LOCAL_APIC
    diff --git a/arch/x86/include/asm/idtentry.h b/arch/x86/include/asm/idtentry.h
    index 0eedfca..7212eaf 100644
    --- a/arch/x86/include/asm/idtentry.h
    +++ b/arch/x86/include/asm/idtentry.h
    @@ -606,6 +606,12 @@ DECLARE_IDTENTRY_SYSVEC(IRQ_WORK_VECTOR, sysvec_irq_work);
    # endif
    #endif

    +#ifdef CONFIG_HAVE_KVM
    +DECLARE_IDTENTRY_SYSVEC(POSTED_INTR_VECTOR, sysvec_kvm_posted_intr_ipi);
    +DECLARE_IDTENTRY_SYSVEC(POSTED_INTR_WAKEUP_VECTOR, sysvec_kvm_posted_intr_wakeup_ipi);
    +DECLARE_IDTENTRY_SYSVEC(POSTED_INTR_NESTED_VECTOR, sysvec_kvm_posted_intr_nested_ipi);
    +#endif
    +
    #undef X86_TRAP_OTHER

    #endif
    diff --git a/arch/x86/include/asm/irq.h b/arch/x86/include/asm/irq.h
    index c7c43e8..f73dd3f 100644
    --- a/arch/x86/include/asm/irq.h
    +++ b/arch/x86/include/asm/irq.h
    @@ -26,9 +26,6 @@ extern void fixup_irqs(void);

    #ifdef CONFIG_HAVE_KVM
    extern void kvm_set_posted_intr_wakeup_handler(void (*handler)(void));
    -extern __visible void smp_kvm_posted_intr_ipi(struct pt_regs *regs);
    -extern __visible void smp_kvm_posted_intr_wakeup_ipi(struct pt_regs *regs);
    -extern __visible void smp_kvm_posted_intr_nested_ipi(struct pt_regs *regs);
    #endif

    extern void (*x86_platform_ipi_callback)(void);
    diff --git a/arch/x86/kernel/idt.c b/arch/x86/kernel/idt.c
    index 3d811d0..faaadd4 100644
    --- a/arch/x86/kernel/idt.c
    +++ b/arch/x86/kernel/idt.c
    @@ -135,9 +135,9 @@ static const __initconst struct idt_data apic_idts[] = {
    INTG(LOCAL_TIMER_VECTOR, asm_sysvec_apic_timer_interrupt),
    INTG(X86_PLATFORM_IPI_VECTOR, asm_sysvec_x86_platform_ipi),
    # ifdef CONFIG_HAVE_KVM
    - INTG(POSTED_INTR_VECTOR, kvm_posted_intr_ipi),
    - INTG(POSTED_INTR_WAKEUP_VECTOR, kvm_posted_intr_wakeup_ipi),
    - INTG(POSTED_INTR_NESTED_VECTOR, kvm_posted_intr_nested_ipi),
    + INTG(POSTED_INTR_VECTOR, asm_sysvec_kvm_posted_intr_ipi),
    + INTG(POSTED_INTR_WAKEUP_VECTOR, asm_sysvec_kvm_posted_intr_wakeup_ipi),
    + INTG(POSTED_INTR_NESTED_VECTOR, asm_sysvec_kvm_posted_intr_nested_ipi),
    # endif
    # ifdef CONFIG_IRQ_WORK
    INTG(IRQ_WORK_VECTOR, asm_sysvec_irq_work),
    diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c
    index 7e30052..1810602 100644
    --- a/arch/x86/kernel/irq.c
    +++ b/arch/x86/kernel/irq.c
    @@ -298,41 +298,29 @@ EXPORT_SYMBOL_GPL(kvm_set_posted_intr_wakeup_handler);
    /*
    * Handler for POSTED_INTERRUPT_VECTOR.
    */
    -__visible void smp_kvm_posted_intr_ipi(struct pt_regs *regs)
    +DEFINE_IDTENTRY_SYSVEC_SIMPLE(sysvec_kvm_posted_intr_ipi)
    {
    - struct pt_regs *old_regs = set_irq_regs(regs);
    -
    - entering_ack_irq();
    + ack_APIC_irq();
    inc_irq_stat(kvm_posted_intr_ipis);
    - exiting_irq();
    - set_irq_regs(old_regs);
    }

    /*
    * Handler for POSTED_INTERRUPT_WAKEUP_VECTOR.
    */
    -__visible void smp_kvm_posted_intr_wakeup_ipi(struct pt_regs *regs)
    +DEFINE_IDTENTRY_SYSVEC(sysvec_kvm_posted_intr_wakeup_ipi)
    {
    - struct pt_regs *old_regs = set_irq_regs(regs);
    -
    - entering_ack_irq();
    + ack_APIC_irq();
    inc_irq_stat(kvm_posted_intr_wakeup_ipis);
    kvm_posted_intr_wakeup_handler();
    - exiting_irq();
    - set_irq_regs(old_regs);
    }

    /*
    * Handler for POSTED_INTERRUPT_NESTED_VECTOR.
    */
    -__visible void smp_kvm_posted_intr_nested_ipi(struct pt_regs *regs)
    +DEFINE_IDTENTRY_SYSVEC_SIMPLE(sysvec_kvm_posted_intr_nested_ipi)
    {
    - struct pt_regs *old_regs = set_irq_regs(regs);
    -
    - entering_ack_irq();
    + ack_APIC_irq();
    inc_irq_stat(kvm_posted_intr_nested_ipis);
    - exiting_irq();
    - set_irq_regs(old_regs);
    }
    #endif

    \
     
     \ /
      Last update: 2020-05-27 10:14    [W:4.854 / U:0.080 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site