diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-11-11 20:02:59 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-11-11 20:02:59 -0500 |
commit | 1006fae359cc810c16354805c0cffbb6ffee602e (patch) | |
tree | bd69f7a235f679a8336b237ed9722bb7f64db39a /arch/sparc/kernel | |
parent | 70fdcb83db15c85a0495b07dc55d9347a4c2efd9 (diff) | |
parent | 5702941eec32cfd7b8cf9e36a0936e48170011a4 (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.c | 31 |
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 | ||
701 | void do_softirq(void) | 701 | void 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 |