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
This commit is contained in:
		
							parent
							
								
									720909a7ab
								
							
						
					
					
						commit
						9c3b1f4975
					
				| @ -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 | ||||
|  | ||||
| @ -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 | ||||
| 
 | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -628,6 +628,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 | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
| @ -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), | ||||
|  | ||||
| @ -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 | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user