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); + } +}