x86: irq: Define a global vector for nested posted interrupts
We are using the same vector for nested/non-nested posted interrupts delivery, this may cause interrupts latency in L1 since we can't kick the L2 vcpu out of vmx-nonroot mode. This patch introduces a new vector which is only for nested posted interrupts to solve the problems above. Signed-off-by: Wincy Van <fanwenyi0529@gmail.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
@@ -705,6 +705,7 @@ apicinterrupt X86_PLATFORM_IPI_VECTOR x86_platform_ipi smp_x86_platform_ipi
|
|||||||
#ifdef CONFIG_HAVE_KVM
|
#ifdef CONFIG_HAVE_KVM
|
||||||
apicinterrupt3 POSTED_INTR_VECTOR kvm_posted_intr_ipi smp_kvm_posted_intr_ipi
|
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_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
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_X86_MCE_THRESHOLD
|
#ifdef CONFIG_X86_MCE_THRESHOLD
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ BUILD_INTERRUPT3(kvm_posted_intr_ipi, POSTED_INTR_VECTOR,
|
|||||||
smp_kvm_posted_intr_ipi)
|
smp_kvm_posted_intr_ipi)
|
||||||
BUILD_INTERRUPT3(kvm_posted_intr_wakeup_ipi, POSTED_INTR_WAKEUP_VECTOR,
|
BUILD_INTERRUPT3(kvm_posted_intr_wakeup_ipi, POSTED_INTR_WAKEUP_VECTOR,
|
||||||
smp_kvm_posted_intr_wakeup_ipi)
|
smp_kvm_posted_intr_wakeup_ipi)
|
||||||
|
BUILD_INTERRUPT3(kvm_posted_intr_nested_ipi, POSTED_INTR_NESTED_VECTOR,
|
||||||
|
smp_kvm_posted_intr_nested_ipi)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ typedef struct {
|
|||||||
#ifdef CONFIG_HAVE_KVM
|
#ifdef CONFIG_HAVE_KVM
|
||||||
unsigned int kvm_posted_intr_ipis;
|
unsigned int kvm_posted_intr_ipis;
|
||||||
unsigned int kvm_posted_intr_wakeup_ipis;
|
unsigned int kvm_posted_intr_wakeup_ipis;
|
||||||
|
unsigned int kvm_posted_intr_nested_ipis;
|
||||||
#endif
|
#endif
|
||||||
unsigned int x86_platform_ipis; /* arch dependent */
|
unsigned int x86_platform_ipis; /* arch dependent */
|
||||||
unsigned int apic_perf_irqs;
|
unsigned int apic_perf_irqs;
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ extern asmlinkage void apic_timer_interrupt(void);
|
|||||||
extern asmlinkage void x86_platform_ipi(void);
|
extern asmlinkage void x86_platform_ipi(void);
|
||||||
extern asmlinkage void kvm_posted_intr_ipi(void);
|
extern asmlinkage void kvm_posted_intr_ipi(void);
|
||||||
extern asmlinkage void kvm_posted_intr_wakeup_ipi(void);
|
extern asmlinkage void kvm_posted_intr_wakeup_ipi(void);
|
||||||
|
extern asmlinkage void kvm_posted_intr_nested_ipi(void);
|
||||||
extern asmlinkage void error_interrupt(void);
|
extern asmlinkage void error_interrupt(void);
|
||||||
extern asmlinkage void irq_work_interrupt(void);
|
extern asmlinkage void irq_work_interrupt(void);
|
||||||
|
|
||||||
@@ -62,6 +63,7 @@ extern void trace_call_function_single_interrupt(void);
|
|||||||
#define trace_reboot_interrupt reboot_interrupt
|
#define trace_reboot_interrupt reboot_interrupt
|
||||||
#define trace_kvm_posted_intr_ipi kvm_posted_intr_ipi
|
#define trace_kvm_posted_intr_ipi kvm_posted_intr_ipi
|
||||||
#define trace_kvm_posted_intr_wakeup_ipi kvm_posted_intr_wakeup_ipi
|
#define trace_kvm_posted_intr_wakeup_ipi kvm_posted_intr_wakeup_ipi
|
||||||
|
#define trace_kvm_posted_intr_nested_ipi kvm_posted_intr_nested_ipi
|
||||||
#endif /* CONFIG_TRACING */
|
#endif /* CONFIG_TRACING */
|
||||||
|
|
||||||
#ifdef CONFIG_X86_LOCAL_APIC
|
#ifdef CONFIG_X86_LOCAL_APIC
|
||||||
|
|||||||
@@ -83,7 +83,6 @@
|
|||||||
*/
|
*/
|
||||||
#define X86_PLATFORM_IPI_VECTOR 0xf7
|
#define X86_PLATFORM_IPI_VECTOR 0xf7
|
||||||
|
|
||||||
#define POSTED_INTR_WAKEUP_VECTOR 0xf1
|
|
||||||
/*
|
/*
|
||||||
* IRQ work vector:
|
* IRQ work vector:
|
||||||
*/
|
*/
|
||||||
@@ -98,6 +97,8 @@
|
|||||||
/* Vector for KVM to deliver posted interrupt IPI */
|
/* Vector for KVM to deliver posted interrupt IPI */
|
||||||
#ifdef CONFIG_HAVE_KVM
|
#ifdef CONFIG_HAVE_KVM
|
||||||
#define POSTED_INTR_VECTOR 0xf2
|
#define POSTED_INTR_VECTOR 0xf2
|
||||||
|
#define POSTED_INTR_WAKEUP_VECTOR 0xf1
|
||||||
|
#define POSTED_INTR_NESTED_VECTOR 0xf0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -155,6 +155,12 @@ int arch_show_interrupts(struct seq_file *p, int prec)
|
|||||||
seq_printf(p, "%10u ", irq_stats(j)->kvm_posted_intr_ipis);
|
seq_printf(p, "%10u ", irq_stats(j)->kvm_posted_intr_ipis);
|
||||||
seq_puts(p, " Posted-interrupt notification event\n");
|
seq_puts(p, " Posted-interrupt notification event\n");
|
||||||
|
|
||||||
|
seq_printf(p, "%*s: ", prec, "NPI");
|
||||||
|
for_each_online_cpu(j)
|
||||||
|
seq_printf(p, "%10u ",
|
||||||
|
irq_stats(j)->kvm_posted_intr_nested_ipis);
|
||||||
|
seq_puts(p, " Nested posted-interrupt event\n");
|
||||||
|
|
||||||
seq_printf(p, "%*s: ", prec, "PIW");
|
seq_printf(p, "%*s: ", prec, "PIW");
|
||||||
for_each_online_cpu(j)
|
for_each_online_cpu(j)
|
||||||
seq_printf(p, "%10u ",
|
seq_printf(p, "%10u ",
|
||||||
@@ -313,6 +319,19 @@ __visible void smp_kvm_posted_intr_wakeup_ipi(struct pt_regs *regs)
|
|||||||
exiting_irq();
|
exiting_irq();
|
||||||
set_irq_regs(old_regs);
|
set_irq_regs(old_regs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Handler for POSTED_INTERRUPT_NESTED_VECTOR.
|
||||||
|
*/
|
||||||
|
__visible void smp_kvm_posted_intr_nested_ipi(struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
struct pt_regs *old_regs = set_irq_regs(regs);
|
||||||
|
|
||||||
|
entering_ack_irq();
|
||||||
|
inc_irq_stat(kvm_posted_intr_nested_ipis);
|
||||||
|
exiting_irq();
|
||||||
|
set_irq_regs(old_regs);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
__visible void __irq_entry smp_trace_x86_platform_ipi(struct pt_regs *regs)
|
__visible void __irq_entry smp_trace_x86_platform_ipi(struct pt_regs *regs)
|
||||||
|
|||||||
@@ -150,6 +150,8 @@ static void __init apic_intr_init(void)
|
|||||||
alloc_intr_gate(POSTED_INTR_VECTOR, kvm_posted_intr_ipi);
|
alloc_intr_gate(POSTED_INTR_VECTOR, kvm_posted_intr_ipi);
|
||||||
/* IPI for KVM to deliver interrupt to wake up tasks */
|
/* IPI for KVM to deliver interrupt to wake up tasks */
|
||||||
alloc_intr_gate(POSTED_INTR_WAKEUP_VECTOR, kvm_posted_intr_wakeup_ipi);
|
alloc_intr_gate(POSTED_INTR_WAKEUP_VECTOR, kvm_posted_intr_wakeup_ipi);
|
||||||
|
/* IPI for KVM to deliver nested posted interrupt */
|
||||||
|
alloc_intr_gate(POSTED_INTR_NESTED_VECTOR, kvm_posted_intr_nested_ipi);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* IPI vectors for APIC spurious and error interrupts */
|
/* IPI vectors for APIC spurious and error interrupts */
|
||||||
|
|||||||
Reference in New Issue
Block a user