[PATCH 1/3] irq: Consolidate do_softirq() arch overriden implementations

2013-09-19 Thread Frederic Weisbecker
All arch overriden implementations of do_softirq() share the following
common code: disable irqs, check if there are softirqs pending, then
execute __do_softirq() on a specific stack.

Consolidate the common parts such that archs only worry about the
stack switch.

Reported-by: Benjamin Herrenschmidt 
Signed-off-by: Frederic Weisbecker 
Tested-by: Paul Mackerras 
Cc: Benjamin Herrenschmidt 
Cc: Paul Mackerras 
Cc: Ingo Molnar 
Cc: Thomas Gleixner 
Cc: Peter Zijlstra 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Paul Mackerras 
Cc: James Hogan 
Cc: James E.J. Bottomley 
Cc: Helge Deller 
Cc: Martin Schwidefsky 
Cc: Heiko Carstens 
Cc: David S. Miller 
Cc: Andrew Morton 
---
 arch/metag/kernel/irq.c| 56 ++-
 arch/parisc/kernel/irq.c   | 17 ++---
 arch/powerpc/kernel/irq.c  | 17 +
 arch/s390/kernel/irq.c | 52 
 arch/sh/kernel/irq.c   | 60 +++---
 arch/sparc/kernel/irq_64.c | 31 
 arch/x86/kernel/irq_32.c   | 34 ++
 arch/x86/kernel/irq_64.c   | 18 +++---
 include/linux/interrupt.h  | 11 +
 kernel/softirq.c   |  7 ++
 10 files changed, 110 insertions(+), 193 deletions(-)

diff --git a/arch/metag/kernel/irq.c b/arch/metag/kernel/irq.c
index 2a2c9d5..12a12b4 100644
--- a/arch/metag/kernel/irq.c
+++ b/arch/metag/kernel/irq.c
@@ -159,44 +159,34 @@ void irq_ctx_exit(int cpu)
 
 extern asmlinkage void __do_softirq(void);
 
-asmlinkage void do_softirq(void)
+void do_softirq_own_stack(void)
 {
-   unsigned long flags;
struct thread_info *curctx;
union irq_ctx *irqctx;
u32 *isp;
 
-   if (in_interrupt())
-   return;
-
-   local_irq_save(flags);
-
-   if (local_softirq_pending()) {
-   curctx = current_thread_info();
-   irqctx = softirq_ctx[smp_processor_id()];
-   irqctx->tinfo.task = curctx->task;
-
-   /* build the stack frame on the softirq stack */
-   isp = (u32 *) ((char *)irqctx + sizeof(struct thread_info));
-
-   asm volatile (
-   "MOV   D0.5,%0\n"
-   "SWAP  A0StP,D0.5\n"
-   "CALLR D1RtP,___do_softirq\n"
-   "MOV   A0StP,D0.5\n"
-   :
-   : "r" (isp)
-   : "memory", "cc", "D1Ar1", "D0Ar2", "D1Ar3", "D0Ar4",
- "D1Ar5", "D0Ar6", "D0Re0", "D1Re0", "D0.4", "D1RtP",
- "D0.5"
-   );
-   /*
-* Shouldn't happen, we returned above if in_interrupt():
-*/
-   WARN_ON_ONCE(softirq_count());
-   }
-
-   local_irq_restore(flags);
+   curctx = current_thread_info();
+   irqctx = softirq_ctx[smp_processor_id()];
+   irqctx->tinfo.task = curctx->task;
+
+   /* build the stack frame on the softirq stack */
+   isp = (u32 *) ((char *)irqctx + sizeof(struct thread_info));
+
+   asm volatile (
+   "MOV   D0.5,%0\n"
+   "SWAP  A0StP,D0.5\n"
+   "CALLR D1RtP,___do_softirq\n"
+   "MOV   A0StP,D0.5\n"
+   :
+   : "r" (isp)
+   : "memory", "cc", "D1Ar1", "D0Ar2", "D1Ar3", "D0Ar4",
+ "D1Ar5", "D0Ar6", "D0Re0", "D1Re0", "D0.4", "D1RtP",
+ "D0.5"
+   );
+   /*
+* Shouldn't happen, we returned above if in_interrupt():
+*/
+   WARN_ON_ONCE(softirq_count());
 }
 #endif
 
diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c
index 2e6443b..ef59276 100644
--- a/arch/parisc/kernel/irq.c
+++ b/arch/parisc/kernel/irq.c
@@ -499,22 +499,9 @@ static void execute_on_irq_stack(void *func, unsigned long 
param1)
*irq_stack_in_use = 1;
 }
 
-asmlinkage void do_softirq(void)
+void do_softirq_own_stack(void)
 {
-   __u32 pending;
-   unsigned long flags;
-
-   if (in_interrupt())
-   return;
-
-   local_irq_save(flags);
-
-   pending = local_softirq_pending();
-
-   if (pending)
-   execute_on_irq_stack(__do_softirq, 0);
-
-   local_irq_restore(flags);
+   execute_on_irq_stack(__do_softirq, 0);
 }
 #endif /* CONFIG_IRQSTACKS */
 
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
index c69440c..7d0da88 100644
--- a/arch/powerpc/kernel/irq.c
+++ b/arch/powerpc/kernel/irq.c
@@ -601,7 +601,7 @@ void irq_ctx_init(void)
}
 }
 
-static inline void do_softirq_onstack(void)
+void do_softirq_own_stack(void)
 {
struct thread_info *curtp, *irqtp;
unsigned long saved_sp_limit = current->thread.ksp_limit;
@@ -623,21 +623,6 @@ static inline void do_softirq_onstack(void)
set_bits(irqtp->flags, &curtp->flags);
 }
 
-void do_softirq(void)
-{
-   unsigne

[PATCH 1/3] irq: Consolidate do_softirq() arch overriden implementations

2013-09-05 Thread Frederic Weisbecker
All arch's overriden implementation of do_softirq() do the same:
disabled irqs, check if there are softirqs pending, then execute
__do_softirq() it a specific stack.

Consolidate the common parts such that arch only worry about the
stack switch.

Reported-by: Benjamin Herrenschmidt 
Signed-off-by: Frederic Weisbecker 
Cc: Benjamin Herrenschmidt 
Cc: Paul Mackerras 
Cc: Ingo Molnar 
Cc: Thomas Gleixner 
Cc: Peter Zijlstra 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Paul Mackerras 
Cc: James Hogan 
Cc: James E.J. Bottomley 
Cc: Helge Deller 
Cc: Martin Schwidefsky 
Cc: Heiko Carstens 
Cc: David S. Miller 
Cc: Andrew Morton 
---
 arch/metag/kernel/irq.c|   56 +
 arch/parisc/kernel/irq.c   |   17 +---
 arch/powerpc/kernel/irq.c  |   17 +---
 arch/s390/kernel/irq.c |   52 +++--
 arch/sh/kernel/irq.c   |   60 ++-
 arch/sparc/kernel/irq_64.c |   31 +++---
 arch/x86/kernel/irq_32.c   |   34 +
 arch/x86/kernel/irq_64.c   |   18 ++---
 include/linux/interrupt.h  |   11 
 kernel/softirq.c   |7 +---
 10 files changed, 110 insertions(+), 193 deletions(-)

diff --git a/arch/metag/kernel/irq.c b/arch/metag/kernel/irq.c
index 2a2c9d5..12a12b4 100644
--- a/arch/metag/kernel/irq.c
+++ b/arch/metag/kernel/irq.c
@@ -159,44 +159,34 @@ void irq_ctx_exit(int cpu)
 
 extern asmlinkage void __do_softirq(void);
 
-asmlinkage void do_softirq(void)
+void do_softirq_own_stack(void)
 {
-   unsigned long flags;
struct thread_info *curctx;
union irq_ctx *irqctx;
u32 *isp;
 
-   if (in_interrupt())
-   return;
-
-   local_irq_save(flags);
-
-   if (local_softirq_pending()) {
-   curctx = current_thread_info();
-   irqctx = softirq_ctx[smp_processor_id()];
-   irqctx->tinfo.task = curctx->task;
-
-   /* build the stack frame on the softirq stack */
-   isp = (u32 *) ((char *)irqctx + sizeof(struct thread_info));
-
-   asm volatile (
-   "MOV   D0.5,%0\n"
-   "SWAP  A0StP,D0.5\n"
-   "CALLR D1RtP,___do_softirq\n"
-   "MOV   A0StP,D0.5\n"
-   :
-   : "r" (isp)
-   : "memory", "cc", "D1Ar1", "D0Ar2", "D1Ar3", "D0Ar4",
- "D1Ar5", "D0Ar6", "D0Re0", "D1Re0", "D0.4", "D1RtP",
- "D0.5"
-   );
-   /*
-* Shouldn't happen, we returned above if in_interrupt():
-*/
-   WARN_ON_ONCE(softirq_count());
-   }
-
-   local_irq_restore(flags);
+   curctx = current_thread_info();
+   irqctx = softirq_ctx[smp_processor_id()];
+   irqctx->tinfo.task = curctx->task;
+
+   /* build the stack frame on the softirq stack */
+   isp = (u32 *) ((char *)irqctx + sizeof(struct thread_info));
+
+   asm volatile (
+   "MOV   D0.5,%0\n"
+   "SWAP  A0StP,D0.5\n"
+   "CALLR D1RtP,___do_softirq\n"
+   "MOV   A0StP,D0.5\n"
+   :
+   : "r" (isp)
+   : "memory", "cc", "D1Ar1", "D0Ar2", "D1Ar3", "D0Ar4",
+ "D1Ar5", "D0Ar6", "D0Re0", "D1Re0", "D0.4", "D1RtP",
+ "D0.5"
+   );
+   /*
+* Shouldn't happen, we returned above if in_interrupt():
+*/
+   WARN_ON_ONCE(softirq_count());
 }
 #endif
 
diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c
index 2e6443b..ef59276 100644
--- a/arch/parisc/kernel/irq.c
+++ b/arch/parisc/kernel/irq.c
@@ -499,22 +499,9 @@ static void execute_on_irq_stack(void *func, unsigned long 
param1)
*irq_stack_in_use = 1;
 }
 
-asmlinkage void do_softirq(void)
+void do_softirq_own_stack(void)
 {
-   __u32 pending;
-   unsigned long flags;
-
-   if (in_interrupt())
-   return;
-
-   local_irq_save(flags);
-
-   pending = local_softirq_pending();
-
-   if (pending)
-   execute_on_irq_stack(__do_softirq, 0);
-
-   local_irq_restore(flags);
+   execute_on_irq_stack(__do_softirq, 0);
 }
 #endif /* CONFIG_IRQSTACKS */
 
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
index c69440c..7d0da88 100644
--- a/arch/powerpc/kernel/irq.c
+++ b/arch/powerpc/kernel/irq.c
@@ -601,7 +601,7 @@ void irq_ctx_init(void)
}
 }
 
-static inline void do_softirq_onstack(void)
+void do_softirq_own_stack(void)
 {
struct thread_info *curtp, *irqtp;
unsigned long saved_sp_limit = current->thread.ksp_limit;
@@ -623,21 +623,6 @@ static inline void do_softirq_onstack(void)
set_bits(irqtp->flags, &curtp->flags);
 }
 
-void do_softirq(void)
-{
-   unsigned long flags;
-
-   if (in_interrupt())