Commit f2c50921 authored by Sebastian Andrzej Siewior's avatar Sebastian Andrzej Siewior Committed by Arnd Bergmann
Browse files

arch/*: Disable softirq stacks on PREEMPT_RT.



PREEMPT_RT preempts softirqs and the current implementation avoids
do_softirq_own_stack() and only uses __do_softirq().

Disable the unused softirqs stacks on PREEMPT_RT to save some memory and
ensure that do_softirq_own_stack() is not used bwcause it is not expected.

Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parent b13baccc
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ static void __init init_irq_stacks(void)
	}
}

#ifndef CONFIG_PREEMPT_RT
static void ____do_softirq(void *arg)
{
	__do_softirq();
@@ -80,7 +81,7 @@ void do_softirq_own_stack(void)
	call_with_stack(____do_softirq, NULL,
			__this_cpu_read(irq_stack_ptr));
}

#endif
#endif

int arch_show_interrupts(struct seq_file *p, int prec)
+2 −0
Original line number Diff line number Diff line
@@ -480,10 +480,12 @@ static void execute_on_irq_stack(void *func, unsigned long param1)
	*irq_stack_in_use = 1;
}

#ifndef CONFIG_PREEMPT_RT
void do_softirq_own_stack(void)
{
	execute_on_irq_stack(__do_softirq, 0);
}
#endif
#endif /* CONFIG_IRQSTACKS */

/* ONLY called from entry.S:intr_extint() */
+4 −0
Original line number Diff line number Diff line
@@ -611,6 +611,7 @@ static inline void check_stack_overflow(void)
	}
}

#ifndef CONFIG_PREEMPT_RT
static __always_inline void call_do_softirq(const void *sp)
{
	/* Temporarily switch r1 to sp, call __do_softirq() then restore r1. */
@@ -629,6 +630,7 @@ static __always_inline void call_do_softirq(const void *sp)
		   "r11", "r12"
	);
}
#endif

static __always_inline void call_do_irq(struct pt_regs *regs, void *sp)
{
@@ -747,10 +749,12 @@ void *mcheckirq_ctx[NR_CPUS] __read_mostly;
void *softirq_ctx[NR_CPUS] __read_mostly;
void *hardirq_ctx[NR_CPUS] __read_mostly;

#ifndef CONFIG_PREEMPT_RT
void do_softirq_own_stack(void)
{
	call_do_softirq(softirq_ctx[smp_processor_id()]);
}
#endif

irq_hw_number_t virq_to_hw(unsigned int virq)
{
+2 −1
Original line number Diff line number Diff line
@@ -5,9 +5,10 @@
#include <asm/lowcore.h>
#include <asm/stacktrace.h>

#ifndef CONFIG_PREEMPT_RT
static inline void do_softirq_own_stack(void)
{
	call_on_stack(0, S390_lowcore.async_stack, void, __do_softirq);
}

#endif
#endif /* __ASM_S390_SOFTIRQ_STACK_H */
+2 −0
Original line number Diff line number Diff line
@@ -149,6 +149,7 @@ void irq_ctx_exit(int cpu)
	hardirq_ctx[cpu] = NULL;
}

#ifndef CONFIG_PREEMPT_RT
void do_softirq_own_stack(void)
{
	struct thread_info *curctx;
@@ -176,6 +177,7 @@ void do_softirq_own_stack(void)
		  "r5", "r6", "r7", "r8", "r9", "r15", "t", "pr"
	);
}
#endif
#else
static inline void handle_one_irq(unsigned int irq)
{
Loading