diff mbox

ARM: formalize an IPI for CPU wake-ups

Message ID 503DC301.3010705@codeaurora.org (mailing list archive)
State New, archived
Headers show

Commit Message

Stephen Boyd Aug. 29, 2012, 7:21 a.m. UTC
On 8/22/2012 12:05 PM, Stephen Boyd wrote:
> Ok, I've put it in the patch tracker.
>

Russell, what's involved in getting rid of the printk now? Can we just
shift everything down by 1 and then formalize 0 as the wakeup ipi? Or do
you want to completely remove that ipi from the stats? It's not clear to
me what we should do. Something like the following untested patch would
be a possibility.

----8<------->8------

Comments

Nicolas Pitre Sept. 8, 2012, 2:47 p.m. UTC | #1
On Wed, 29 Aug 2012, Stephen Boyd wrote:

> 
> On 8/22/2012 12:05 PM, Stephen Boyd wrote:
> > Ok, I've put it in the patch tracker.
> >
> 
> Russell, what's involved in getting rid of the printk now? Can we just
> shift everything down by 1 and then formalize 0 as the wakeup ipi? Or do
> you want to completely remove that ipi from the stats? It's not clear to
> me what we should do. Something like the following untested patch would
> be a possibility.

Please make this into a proper patch and send it to the patch system 
with...

Reviewed-by: Nicolas Pitre <nico@linaro.org>

I do need this and would prefer to use a version likely to hit mainline 
rather than a local version.  And I don't think we should remove IPI 0 
from the stats.

> ----8<------->8------
> 
> diff --git a/arch/arm/include/asm/hardirq.h b/arch/arm/include/asm/hardirq.h
> index 436e60b..2740c2a2 100644
> --- a/arch/arm/include/asm/hardirq.h
> +++ b/arch/arm/include/asm/hardirq.h
> @@ -5,7 +5,7 @@
>  #include <linux/threads.h>
>  #include <asm/irq.h>
> 
> -#define NR_IPI 5
> +#define NR_IPI 6
> 
>  typedef struct {
>         unsigned int __softirq_pending;
> diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
> index ebd8ad2..d98c37e 100644
> --- a/arch/arm/kernel/smp.c
> +++ b/arch/arm/kernel/smp.c
> @@ -51,7 +51,8 @@
>  struct secondary_data secondary_data;
> 
>  enum ipi_msg_type {
> -       IPI_TIMER = 2,
> +       IPI_WAKEUP,
> +       IPI_TIMER,
>         IPI_RESCHEDULE,
>         IPI_CALL_FUNC,
>         IPI_CALL_FUNC_SINGLE,
> @@ -347,7 +348,8 @@ void arch_send_call_function_single_ipi(int cpu)
>  }
> 
>  static const char *ipi_types[NR_IPI] = {
> -#define S(x,s) [x - IPI_TIMER] = s
> +#define S(x,s) [x] = s
> +       S(IPI_WAKEUP, "CPU wakeup interrupts"),
>         S(IPI_TIMER, "Timer broadcast interrupts"),
>         S(IPI_RESCHEDULE, "Rescheduling interrupts"),
>         S(IPI_CALL_FUNC, "Function call interrupts"),
> @@ -500,10 +502,13 @@ void handle_IPI(int ipinr, struct pt_regs *regs)
>         unsigned int cpu = smp_processor_id();
>         struct pt_regs *old_regs = set_irq_regs(regs);
> 
> -       if (ipinr >= IPI_TIMER && ipinr < IPI_TIMER + NR_IPI)
> -               __inc_irq_stat(cpu, ipi_irqs[ipinr - IPI_TIMER]);
> +       if (ipinr < NR_IPI)
> +               __inc_irq_stat(cpu, ipi_irqs[ipinr]);
> 
>         switch (ipinr) {
> +       case IPI_WAKEUP:
> +               break;
> +
>         case IPI_TIMER:
>                 irq_enter();
>                 ipi_timer();
> 
> -- 
> Sent by an employee of the Qualcomm Innovation Center, Inc.
> The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
>
diff mbox

Patch

diff --git a/arch/arm/include/asm/hardirq.h b/arch/arm/include/asm/hardirq.h
index 436e60b..2740c2a2 100644
--- a/arch/arm/include/asm/hardirq.h
+++ b/arch/arm/include/asm/hardirq.h
@@ -5,7 +5,7 @@ 
 #include <linux/threads.h>
 #include <asm/irq.h>

-#define NR_IPI 5
+#define NR_IPI 6

 typedef struct {
        unsigned int __softirq_pending;
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
index ebd8ad2..d98c37e 100644
--- a/arch/arm/kernel/smp.c
+++ b/arch/arm/kernel/smp.c
@@ -51,7 +51,8 @@ 
 struct secondary_data secondary_data;

 enum ipi_msg_type {
-       IPI_TIMER = 2,
+       IPI_WAKEUP,
+       IPI_TIMER,
        IPI_RESCHEDULE,
        IPI_CALL_FUNC,
        IPI_CALL_FUNC_SINGLE,
@@ -347,7 +348,8 @@  void arch_send_call_function_single_ipi(int cpu)
 }

 static const char *ipi_types[NR_IPI] = {
-#define S(x,s) [x - IPI_TIMER] = s
+#define S(x,s) [x] = s
+       S(IPI_WAKEUP, "CPU wakeup interrupts"),
        S(IPI_TIMER, "Timer broadcast interrupts"),
        S(IPI_RESCHEDULE, "Rescheduling interrupts"),
        S(IPI_CALL_FUNC, "Function call interrupts"),
@@ -500,10 +502,13 @@  void handle_IPI(int ipinr, struct pt_regs *regs)
        unsigned int cpu = smp_processor_id();
        struct pt_regs *old_regs = set_irq_regs(regs);

-       if (ipinr >= IPI_TIMER && ipinr < IPI_TIMER + NR_IPI)
-               __inc_irq_stat(cpu, ipi_irqs[ipinr - IPI_TIMER]);
+       if (ipinr < NR_IPI)
+               __inc_irq_stat(cpu, ipi_irqs[ipinr]);

        switch (ipinr) {
+       case IPI_WAKEUP:
+               break;
+
        case IPI_TIMER:
                irq_enter();
                ipi_timer();