x86/entry: Convert SMP system vectors to IDTENTRY_SYSVEC
authorThomas Gleixner <tglx@linutronix.de>
Thu, 21 May 2020 20:05:40 +0000 (22:05 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 11 Jun 2020 13:15:14 +0000 (15:15 +0200)
Convert SMP system vectors to IDTENTRY_SYSVEC:

  - Implement the C entry point with DEFINE_IDTENTRY_SYSVEC
  - Emit the ASM stub with DECLARE_IDTENTRY_SYSVEC
  - Remove the ASM idtentries in 64-bit
  - Remove the BUILD_INTERRUPT entries in 32-bit
  - Remove the old prototypes

No functional change.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Acked-by: Andy Lutomirski <luto@kernel.org>
Link: https://lore.kernel.org/r/20200521202119.372234635@linutronix.de
arch/x86/entry/entry_64.S
arch/x86/include/asm/entry_arch.h
arch/x86/include/asm/hw_irq.h
arch/x86/include/asm/idtentry.h
arch/x86/include/asm/traps.h
arch/x86/kernel/apic/vector.c
arch/x86/kernel/idt.c
arch/x86/kernel/smp.c

index 25f71a0c9d3e44dd30d92e9756af68fc2a9e90d0..f3ccb27c028ea1f744921f0997e57f66e4dbde3e 100644 (file)
@@ -956,11 +956,6 @@ apicinterrupt3 \num \sym \do_sym
 POP_SECTION_IRQENTRY
 .endm
 
-#ifdef CONFIG_SMP
-apicinterrupt3 IRQ_MOVE_CLEANUP_VECTOR         irq_move_cleanup_interrupt      smp_irq_move_cleanup_interrupt
-apicinterrupt3 REBOOT_VECTOR                   reboot_interrupt                smp_reboot_interrupt
-#endif
-
 #ifdef CONFIG_X86_UV
 apicinterrupt3 UV_BAU_MESSAGE                  uv_bau_message_intr1            uv_bau_message_interrupt
 #endif
@@ -984,8 +979,6 @@ apicinterrupt THERMAL_APIC_VECTOR           thermal_interrupt               smp_thermal_interrupt
 #endif
 
 #ifdef CONFIG_SMP
-apicinterrupt CALL_FUNCTION_SINGLE_VECTOR      call_function_single_interrupt  smp_call_function_single_interrupt
-apicinterrupt CALL_FUNCTION_VECTOR             call_function_interrupt         smp_call_function_interrupt
 apicinterrupt RESCHEDULE_VECTOR                        reschedule_interrupt            smp_reschedule_interrupt
 #endif
 
index d10d6d807e7362a2a9c82f3d5481d7628225f723..2e2055bcfeb2e04eefe79373bf940d2a50b9df40 100644 (file)
  */
 #ifdef CONFIG_SMP
 BUILD_INTERRUPT(reschedule_interrupt,RESCHEDULE_VECTOR)
-BUILD_INTERRUPT(call_function_interrupt,CALL_FUNCTION_VECTOR)
-BUILD_INTERRUPT(call_function_single_interrupt,CALL_FUNCTION_SINGLE_VECTOR)
-BUILD_INTERRUPT(irq_move_cleanup_interrupt, IRQ_MOVE_CLEANUP_VECTOR)
-BUILD_INTERRUPT(reboot_interrupt, REBOOT_VECTOR)
 #endif
 
 #ifdef CONFIG_HAVE_KVM
index 1765993360e77ca47e3300ec62c8abd49895d302..36a38695f27f2a06309cc8aaf53a68628fd87322 100644 (file)
@@ -38,14 +38,9 @@ extern asmlinkage void uv_bau_message_intr1(void);
 extern asmlinkage void thermal_interrupt(void);
 extern asmlinkage void reschedule_interrupt(void);
 
-extern asmlinkage void irq_move_cleanup_interrupt(void);
-extern asmlinkage void reboot_interrupt(void);
 extern asmlinkage void threshold_interrupt(void);
 extern asmlinkage void deferred_error_interrupt(void);
 
-extern asmlinkage void call_function_interrupt(void);
-extern asmlinkage void call_function_single_interrupt(void);
-
 #ifdef CONFIG_X86_LOCAL_APIC
 struct irq_data;
 struct pci_dev;
index b95f36276c6c537d5dee2bfad54812af1f727853..b44f4ac22af6ffa4e1ee59ed06a57cb4f0ba8206 100644 (file)
@@ -599,6 +599,13 @@ DECLARE_IDTENTRY_SYSVEC(LOCAL_TIMER_VECTOR,                sysvec_apic_timer_interrupt);
 DECLARE_IDTENTRY_SYSVEC(X86_PLATFORM_IPI_VECTOR,       sysvec_x86_platform_ipi);
 #endif
 
+#ifdef CONFIG_SMP
+DECLARE_IDTENTRY_SYSVEC(IRQ_MOVE_CLEANUP_VECTOR,       sysvec_irq_move_cleanup);
+DECLARE_IDTENTRY_SYSVEC(REBOOT_VECTOR,                 sysvec_reboot);
+DECLARE_IDTENTRY_SYSVEC(CALL_FUNCTION_SINGLE_VECTOR,   sysvec_call_function_single);
+DECLARE_IDTENTRY_SYSVEC(CALL_FUNCTION_VECTOR,          sysvec_call_function);
+#endif
+
 #undef X86_TRAP_OTHER
 
 #endif
index 933934c3e1735185b617625d8ea0d09c3b4cac7e..0c40f37f8cb7df7cc10743686e6193b4185e5b6a 100644 (file)
@@ -40,8 +40,6 @@ asmlinkage void smp_threshold_interrupt(struct pt_regs *regs);
 asmlinkage void smp_deferred_error_interrupt(struct pt_regs *regs);
 #endif
 
-asmlinkage void smp_irq_move_cleanup_interrupt(void);
-
 #ifdef CONFIG_VMAP_STACK
 void __noreturn handle_stack_overflow(const char *message,
                                      struct pt_regs *regs,
index 67768e54438bde765e4280fa141cb1a2819ab94b..c48be6e1f6764ca8488f42a112c9ce58ed2c043a 100644 (file)
@@ -861,13 +861,13 @@ static void free_moved_vector(struct apic_chip_data *apicd)
        apicd->move_in_progress = 0;
 }
 
-asmlinkage __visible void __irq_entry smp_irq_move_cleanup_interrupt(void)
+DEFINE_IDTENTRY_SYSVEC(sysvec_irq_move_cleanup)
 {
        struct hlist_head *clhead = this_cpu_ptr(&cleanup_list);
        struct apic_chip_data *apicd;
        struct hlist_node *tmp;
 
-       entering_ack_irq();
+       ack_APIC_irq();
        /* Prevent vectors vanishing under us */
        raw_spin_lock(&vector_lock);
 
@@ -892,7 +892,6 @@ asmlinkage __visible void __irq_entry smp_irq_move_cleanup_interrupt(void)
        }
 
        raw_spin_unlock(&vector_lock);
-       exiting_irq();
 }
 
 static void __send_cleanup_vector(struct apic_chip_data *apicd)
index 93c1b27f40f41f9d0a13132856ae8efa14ac6503..018a5424b57450965d0666f9c427eecee00ffd99 100644 (file)
@@ -112,11 +112,11 @@ static const __initconst struct idt_data def_idts[] = {
  */
 static const __initconst struct idt_data apic_idts[] = {
 #ifdef CONFIG_SMP
-       INTG(RESCHEDULE_VECTOR,         reschedule_interrupt),
-       INTG(CALL_FUNCTION_VECTOR,      call_function_interrupt),
-       INTG(CALL_FUNCTION_SINGLE_VECTOR, call_function_single_interrupt),
-       INTG(IRQ_MOVE_CLEANUP_VECTOR,   irq_move_cleanup_interrupt),
-       INTG(REBOOT_VECTOR,             reboot_interrupt),
+       INTG(RESCHEDULE_VECTOR,                 reschedule_interrupt),
+       INTG(CALL_FUNCTION_VECTOR,              asm_sysvec_call_function),
+       INTG(CALL_FUNCTION_SINGLE_VECTOR,       asm_sysvec_call_function_single),
+       INTG(IRQ_MOVE_CLEANUP_VECTOR,           asm_sysvec_irq_move_cleanup),
+       INTG(REBOOT_VECTOR,                     asm_sysvec_reboot),
 #endif
 
 #ifdef CONFIG_X86_THERMAL_VECTOR
index b8d4e9c3c070c07dc94f429dc21df25787a49a75..e5647daa7e9687e08c192b5a2998332de03d041f 100644 (file)
@@ -27,6 +27,7 @@
 #include <asm/mmu_context.h>
 #include <asm/proto.h>
 #include <asm/apic.h>
+#include <asm/idtentry.h>
 #include <asm/nmi.h>
 #include <asm/mce.h>
 #include <asm/trace/irq_vectors.h>
@@ -130,13 +131,11 @@ static int smp_stop_nmi_callback(unsigned int val, struct pt_regs *regs)
 /*
  * this function calls the 'stop' function on all other CPUs in the system.
  */
-
-asmlinkage __visible void smp_reboot_interrupt(void)
+DEFINE_IDTENTRY_SYSVEC(sysvec_reboot)
 {
-       ipi_entering_ack_irq();
+       ack_APIC_irq();
        cpu_emergency_vmxoff();
        stop_this_cpu(NULL);
-       irq_exit();
 }
 
 static int register_stop_handler(void)
@@ -227,7 +226,6 @@ __visible void __irq_entry smp_reschedule_interrupt(struct pt_regs *regs)
 {
        ack_APIC_irq();
        inc_irq_stat(irq_resched_count);
-       kvm_set_cpu_l1tf_flush_l1d();
 
        if (trace_resched_ipi_enabled()) {
                /*
@@ -244,24 +242,22 @@ __visible void __irq_entry smp_reschedule_interrupt(struct pt_regs *regs)
        scheduler_ipi();
 }
 
-__visible void __irq_entry smp_call_function_interrupt(struct pt_regs *regs)
+DEFINE_IDTENTRY_SYSVEC(sysvec_call_function)
 {
-       ipi_entering_ack_irq();
+       ack_APIC_irq();
        trace_call_function_entry(CALL_FUNCTION_VECTOR);
        inc_irq_stat(irq_call_count);
        generic_smp_call_function_interrupt();
        trace_call_function_exit(CALL_FUNCTION_VECTOR);
-       exiting_irq();
 }
 
-__visible void __irq_entry smp_call_function_single_interrupt(struct pt_regs *r)
+DEFINE_IDTENTRY_SYSVEC(sysvec_call_function_single)
 {
-       ipi_entering_ack_irq();
+       ack_APIC_irq();
        trace_call_function_single_entry(CALL_FUNCTION_SINGLE_VECTOR);
        inc_irq_stat(irq_call_count);
        generic_smp_call_function_single_interrupt();
        trace_call_function_single_exit(CALL_FUNCTION_SINGLE_VECTOR);
-       exiting_irq();
 }
 
 static int __init nonmi_ipi_setup(char *str)