[PATCH] ARM: formalize an IPI for CPU wake-ups
Nicolas Pitre
nico at fluxnic.net
Sat Sep 8 10:47:12 EDT 2012
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 at 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.
>
More information about the linux-arm-kernel
mailing list