aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc/kernel
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-11-11 20:02:59 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2013-11-11 20:02:59 -0500
commit1006fae359cc810c16354805c0cffbb6ffee602e (patch)
treebd69f7a235f679a8336b237ed9722bb7f64db39a /arch/sparc/kernel
parent70fdcb83db15c85a0495b07dc55d9347a4c2efd9 (diff)
parent5702941eec32cfd7b8cf9e36a0936e48170011a4 (diff)
Merge branch 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull IRQ changes from Ingo Molnar: "The biggest change this cycle are the softirq/hardirq stack interaction and nesting fixes, cleanups and reorganizations from Frederic. This is the longer followup story to the softirq nesting fix that is already upstream (commit ded797547548: "irq: Force hardirq exit's softirq processing on its own stack")" * 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: irqchip: bcm2835: Convert to use IRQCHIP_DECLARE macro powerpc: Tell about irq stack coverage x86: Tell about irq stack coverage irq: Optimize softirq stack selection in irq exit irq: Justify the various softirq stack choices irq: Improve a bit softirq debugging irq: Optimize call to softirq on hardirq exit irq: Consolidate do_softirq() arch overriden implementations x86/irq: Correct comment about i8259 initialization
Diffstat (limited to 'arch/sparc/kernel')
-rw-r--r--arch/sparc/kernel/irq_64.c31
1 files changed, 10 insertions, 21 deletions
diff --git a/arch/sparc/kernel/irq_64.c b/arch/sparc/kernel/irq_64.c
index d4840cec2c55..666193f4e8bb 100644
--- a/arch/sparc/kernel/irq_64.c
+++ b/arch/sparc/kernel/irq_64.c
@@ -698,30 +698,19 @@ void __irq_entry handler_irq(int pil, struct pt_regs *regs)
698 set_irq_regs(old_regs); 698 set_irq_regs(old_regs);
699} 699}
700 700
701void do_softirq(void) 701void do_softirq_own_stack(void)
702{ 702{
703 unsigned long flags; 703 void *orig_sp, *sp = softirq_stack[smp_processor_id()];
704
705 if (in_interrupt())
706 return;
707
708 local_irq_save(flags);
709 704
710 if (local_softirq_pending()) { 705 sp += THREAD_SIZE - 192 - STACK_BIAS;
711 void *orig_sp, *sp = softirq_stack[smp_processor_id()];
712
713 sp += THREAD_SIZE - 192 - STACK_BIAS;
714
715 __asm__ __volatile__("mov %%sp, %0\n\t"
716 "mov %1, %%sp"
717 : "=&r" (orig_sp)
718 : "r" (sp));
719 __do_softirq();
720 __asm__ __volatile__("mov %0, %%sp"
721 : : "r" (orig_sp));
722 }
723 706
724 local_irq_restore(flags); 707 __asm__ __volatile__("mov %%sp, %0\n\t"
708 "mov %1, %%sp"
709 : "=&r" (orig_sp)
710 : "r" (sp));
711 __do_softirq();
712 __asm__ __volatile__("mov %0, %%sp"
713 : : "r" (orig_sp));
725} 714}
726 715
727#ifdef CONFIG_HOTPLUG_CPU 716#ifdef CONFIG_HOTPLUG_CPU