| 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/entry/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 |
| @@ -638,6 +638,7 @@ void irq_ctx_init(void) |
| } |
| } |
| |
| +#ifndef CONFIG_PREEMPT_RT_FULL |
| void do_softirq_own_stack(void) |
| { |
| struct thread_info *curtp, *irqtp; |
| @@ -655,6 +656,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 |
| @@ -41,6 +41,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) |
| @@ -57,6 +58,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 |
| @@ -31,6 +31,7 @@ |
| |
| .text |
| |
| +#ifndef CONFIG_PREEMPT_RT_FULL |
| _GLOBAL(call_do_softirq) |
| mflr r0 |
| std r0,16(r1) |
| @@ -41,6 +42,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 |
| @@ -854,6 +854,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()]; |
| @@ -868,6 +869,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/entry/entry_64.S |
| +++ b/arch/x86/entry/entry_64.S |
| @@ -889,6 +889,7 @@ EXPORT_SYMBOL(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) |
| pushq %rbp |
| @@ -901,6 +902,7 @@ ENTRY(do_softirq_own_stack) |
| decl PER_CPU_VAR(irq_count) |
| ret |
| 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 |
| @@ -127,6 +127,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 irq_stack *irqstk; |
| @@ -143,6 +144,7 @@ void do_softirq_own_stack(void) |
| |
| call_on_stack(__do_softirq, isp); |
| } |
| +#endif |
| |
| bool handle_irq(struct irq_desc *desc, struct pt_regs *regs) |
| { |
| --- a/include/linux/interrupt.h |
| +++ b/include/linux/interrupt.h |
| @@ -484,7 +484,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) |