| Subject: softirq: Disable softirq stacks for RT |
| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Mon, 18 Jul 2011 13:59:17 +0200 |
| |
| Disable extra stacks for softirqs. We want to preempt softirqs and |
| having them on special IRQ-stack does not make this easier. |
| |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| --- |
| arch/powerpc/kernel/irq.c | 2 ++ |
| arch/powerpc/kernel/misc_32.S | 2 ++ |
| arch/powerpc/kernel/misc_64.S | 2 ++ |
| arch/sh/kernel/irq.c | 2 ++ |
| arch/sparc/kernel/irq_64.c | 2 ++ |
| arch/x86/kernel/entry_64.S | 2 ++ |
| arch/x86/kernel/irq_32.c | 2 ++ |
| include/linux/interrupt.h | 2 +- |
| 8 files changed, 15 insertions(+), 1 deletion(-) |
| |
| --- a/arch/powerpc/kernel/irq.c |
| +++ b/arch/powerpc/kernel/irq.c |
| @@ -614,6 +614,7 @@ void irq_ctx_init(void) |
| } |
| } |
| |
| +#ifndef CONFIG_PREEMPT_RT_FULL |
| void do_softirq_own_stack(void) |
| { |
| struct thread_info *curtp, *irqtp; |
| @@ -631,6 +632,7 @@ void do_softirq_own_stack(void) |
| if (irqtp->flags) |
| set_bits(irqtp->flags, &curtp->flags); |
| } |
| +#endif |
| |
| irq_hw_number_t virq_to_hw(unsigned int virq) |
| { |
| --- a/arch/powerpc/kernel/misc_32.S |
| +++ b/arch/powerpc/kernel/misc_32.S |
| @@ -40,6 +40,7 @@ |
| * We store the saved ksp_limit in the unused part |
| * of the STACK_FRAME_OVERHEAD |
| */ |
| +#ifndef CONFIG_PREEMPT_RT_FULL |
| _GLOBAL(call_do_softirq) |
| mflr r0 |
| stw r0,4(r1) |
| @@ -56,6 +57,7 @@ |
| stw r10,THREAD+KSP_LIMIT(r2) |
| mtlr r0 |
| blr |
| +#endif |
| |
| /* |
| * void call_do_irq(struct pt_regs *regs, struct thread_info *irqtp); |
| --- a/arch/powerpc/kernel/misc_64.S |
| +++ b/arch/powerpc/kernel/misc_64.S |
| @@ -29,6 +29,7 @@ |
| |
| .text |
| |
| +#ifndef CONFIG_PREEMPT_RT_FULL |
| _GLOBAL(call_do_softirq) |
| mflr r0 |
| std r0,16(r1) |
| @@ -39,6 +40,7 @@ |
| ld r0,16(r1) |
| mtlr r0 |
| blr |
| +#endif |
| |
| _GLOBAL(call_do_irq) |
| mflr r0 |
| --- a/arch/sh/kernel/irq.c |
| +++ b/arch/sh/kernel/irq.c |
| @@ -147,6 +147,7 @@ void irq_ctx_exit(int cpu) |
| hardirq_ctx[cpu] = NULL; |
| } |
| |
| +#ifndef CONFIG_PREEMPT_RT_FULL |
| void do_softirq_own_stack(void) |
| { |
| struct thread_info *curctx; |
| @@ -174,6 +175,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) |
| { |
| --- a/arch/sparc/kernel/irq_64.c |
| +++ b/arch/sparc/kernel/irq_64.c |
| @@ -849,6 +849,7 @@ void __irq_entry handler_irq(int pil, st |
| set_irq_regs(old_regs); |
| } |
| |
| +#ifndef CONFIG_PREEMPT_RT_FULL |
| void do_softirq_own_stack(void) |
| { |
| void *orig_sp, *sp = softirq_stack[smp_processor_id()]; |
| @@ -863,6 +864,7 @@ void do_softirq_own_stack(void) |
| __asm__ __volatile__("mov %0, %%sp" |
| : : "r" (orig_sp)); |
| } |
| +#endif |
| |
| #ifdef CONFIG_HOTPLUG_CPU |
| void fixup_irqs(void) |
| --- a/arch/x86/kernel/entry_64.S |
| +++ b/arch/x86/kernel/entry_64.S |
| @@ -1120,6 +1120,7 @@ END(native_load_gs_index) |
| jmp 2b |
| .previous |
| |
| +#ifndef CONFIG_PREEMPT_RT_FULL |
| /* Call softirq on interrupt stack. Interrupts are off. */ |
| ENTRY(do_softirq_own_stack) |
| CFI_STARTPROC |
| @@ -1139,6 +1140,7 @@ ENTRY(do_softirq_own_stack) |
| ret |
| CFI_ENDPROC |
| END(do_softirq_own_stack) |
| +#endif |
| |
| #ifdef CONFIG_XEN |
| idtentry xen_hypervisor_callback xen_do_hypervisor_callback has_error_code=0 |
| --- a/arch/x86/kernel/irq_32.c |
| +++ b/arch/x86/kernel/irq_32.c |
| @@ -135,6 +135,7 @@ void irq_ctx_init(int cpu) |
| cpu, per_cpu(hardirq_stack, cpu), per_cpu(softirq_stack, cpu)); |
| } |
| |
| +#ifndef CONFIG_PREEMPT_RT_FULL |
| void do_softirq_own_stack(void) |
| { |
| struct thread_info *curstk; |
| @@ -153,6 +154,7 @@ void do_softirq_own_stack(void) |
| |
| call_on_stack(__do_softirq, isp); |
| } |
| +#endif |
| |
| bool handle_irq(unsigned irq, struct pt_regs *regs) |
| { |
| --- a/include/linux/interrupt.h |
| +++ b/include/linux/interrupt.h |
| @@ -443,7 +443,7 @@ struct softirq_action |
| asmlinkage void do_softirq(void); |
| asmlinkage void __do_softirq(void); |
| |
| -#ifdef __ARCH_HAS_DO_SOFTIRQ |
| +#if defined(__ARCH_HAS_DO_SOFTIRQ) && !defined(CONFIG_PREEMPT_RT_FULL) |
| void do_softirq_own_stack(void); |
| #else |
| static inline void do_softirq_own_stack(void) |