Use the new C code helpers to move do_softirq_own_stack() out of ASM
code. Mark the switching function noinstr as this is really not a good
place for being instrumented.

Signed-off-by: Thomas Gleixner <t...@linutronix.de>
---
 arch/x86/entry/entry_64.S |   13 -------------
 arch/x86/kernel/irq_64.c  |   12 ++++++++++++
 2 files changed, 12 insertions(+), 13 deletions(-)

--- a/arch/x86/entry/entry_64.S
+++ b/arch/x86/entry/entry_64.S
@@ -1107,19 +1107,6 @@ SYM_CODE_START_LOCAL_NOALIGN(.Lbad_gs)
 SYM_CODE_END(.Lbad_gs)
        .previous
 
-/* Call softirq on interrupt stack. Interrupts are off. */
-.pushsection .text, "ax"
-SYM_FUNC_START(do_softirq_own_stack)
-       pushq   %rbp
-       mov     %rsp, %rbp
-       ENTER_IRQ_STACK regs=0 old_rsp=%r11
-       call    __do_softirq
-       LEAVE_IRQ_STACK regs=0
-       leaveq
-       ret
-SYM_FUNC_END(do_softirq_own_stack)
-.popsection
-
 #ifdef CONFIG_XEN_PV
 /*
  * A note on the "critical region" in our callback handler.
--- a/arch/x86/kernel/irq_64.c
+++ b/arch/x86/kernel/irq_64.c
@@ -20,6 +20,7 @@
 #include <linux/sched/task_stack.h>
 
 #include <asm/cpu_entry_area.h>
+#include <asm/irq_stack.h>
 #include <asm/io_apic.h>
 #include <asm/apic.h>
 
@@ -70,3 +71,14 @@ int irq_init_percpu_irqstack(unsigned in
                return 0;
        return map_irq_stack(cpu);
 }
+
+noinstr void do_softirq_own_stack(void)
+{
+       if (irqstack_active()) {
+               instr_begin();
+               __do_softirq();
+               instr_end();
+       } else {
+               RUN_ON_IRQSTACK(__do_softirq);
+       }
+}

Reply via email to