All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alex Smith <alex.smith@imgtec.com>
To: Paul Burton <paul.burton@imgtec.com>
Cc: <linux-mips@linux-mips.org>
Subject: Re: [PATCH] MIPS: SMP: Don't increment irq_count multiple times for call function IPIs
Date: Fri, 24 Jul 2015 16:56:00 +0100	[thread overview]
Message-ID: <55B26010.2060002@imgtec.com> (raw)
In-Reply-To: <20150724154956.GU25683@NP-P-BURTON>

On 24/07/2015 16:49, Paul Burton wrote:
> On Fri, Jul 24, 2015 at 04:14:22PM +0100, Alex Smith wrote:
>> The majority of SMP platforms handle their IPIs through do_IRQ()
>> which calls irq_{enter/exit}(). When a call function IPI is received,
>> smp_call_function_interrupt() is called which also calls
>> irq_{enter,exit}(), meaning irq_count is raised twice.
>>
>> When tick broadcasting is used (which is implemented via a call
>> function IPI), this incorrectly causes all CPU idle time on the core
>> receiving broadcast ticks to be accounted as time spent servicing
>> IRQs, as account_process_tick() will account as such if irq_count is
>> greater than 1. This results in 100% CPU usage being reported on a
>> core which receives its ticks via broadcast.
>>
>> This patch removes the SMP smp_call_function_interrupt() wrapper which
>> calls irq_{enter,exit}(). Platforms which handle their IPIs through
>> do_IRQ() now call generic_smp_call_function_interrupt() directly to
>> avoid incrementing irq_count a second time. Platforms which don't
>> (loongson, sgi-ip27, sibyte) call generic_smp_call_function_interrupt()
>> wrapped in irq_{enter,exit}().
>>
>> Signed-off-by: Alex Smith <alex.smith@imgtec.com>
>> ---
>>   arch/mips/cavium-octeon/smp.c         |  2 +-
>>   arch/mips/include/asm/smp.h           |  2 --
>>   arch/mips/kernel/smp-bmips.c          |  4 ++--
>>   arch/mips/kernel/smp.c                | 10 ----------
>>   arch/mips/lantiq/irq.c                |  2 +-
>>   arch/mips/loongson64/loongson-3/smp.c |  7 +++++--
>>   arch/mips/mti-malta/malta-int.c       |  2 +-
>>   arch/mips/netlogic/common/smp.c       |  2 +-
>>   arch/mips/paravirt/paravirt-smp.c     |  2 +-
>>   arch/mips/pmcs-msp71xx/msp_smp.c      |  2 +-
>>   arch/mips/sgi-ip27/ip27-irq.c         |  8 ++++++--
>>   arch/mips/sibyte/bcm1480/smp.c        |  9 +++++----
>>   arch/mips/sibyte/sb1250/smp.c         |  7 +++++--
>>   13 files changed, 29 insertions(+), 30 deletions(-)
>
> Hi Alex,
>
> I think you'll need to catch the case in drivers/irqchip/irq-mips-gic.c
> too.
>
> Thanks,
>      Paul

You're right, I do, thanks.

I'll send v2.

Alex

>
>> diff --git a/arch/mips/cavium-octeon/smp.c b/arch/mips/cavium-octeon/smp.c
>> index 56f5d080ef9d..b7fa9ae28c36 100644
>> --- a/arch/mips/cavium-octeon/smp.c
>> +++ b/arch/mips/cavium-octeon/smp.c
>> @@ -42,7 +42,7 @@ static irqreturn_t mailbox_interrupt(int irq, void *dev_id)
>>   	cvmx_write_csr(CVMX_CIU_MBOX_CLRX(coreid), action);
>>
>>   	if (action & SMP_CALL_FUNCTION)
>> -		smp_call_function_interrupt();
>> +		generic_smp_call_function_interrupt();
>>   	if (action & SMP_RESCHEDULE_YOURSELF)
>>   		scheduler_ipi();
>>
>> diff --git a/arch/mips/include/asm/smp.h b/arch/mips/include/asm/smp.h
>> index 16f1ea9ab191..03722d4326a1 100644
>> --- a/arch/mips/include/asm/smp.h
>> +++ b/arch/mips/include/asm/smp.h
>> @@ -83,8 +83,6 @@ static inline void __cpu_die(unsigned int cpu)
>>   extern void play_dead(void);
>>   #endif
>>
>> -extern asmlinkage void smp_call_function_interrupt(void);
>> -
>>   static inline void arch_send_call_function_single_ipi(int cpu)
>>   {
>>   	extern struct plat_smp_ops *mp_ops;	/* private */
>> diff --git a/arch/mips/kernel/smp-bmips.c b/arch/mips/kernel/smp-bmips.c
>> index 336708ae5c5b..78cf8c2f1de0 100644
>> --- a/arch/mips/kernel/smp-bmips.c
>> +++ b/arch/mips/kernel/smp-bmips.c
>> @@ -284,7 +284,7 @@ static irqreturn_t bmips5000_ipi_interrupt(int irq, void *dev_id)
>>   	if (action == 0)
>>   		scheduler_ipi();
>>   	else
>> -		smp_call_function_interrupt();
>> +		generic_smp_call_function_interrupt();
>>
>>   	return IRQ_HANDLED;
>>   }
>> @@ -336,7 +336,7 @@ static irqreturn_t bmips43xx_ipi_interrupt(int irq, void *dev_id)
>>   	if (action & SMP_RESCHEDULE_YOURSELF)
>>   		scheduler_ipi();
>>   	if (action & SMP_CALL_FUNCTION)
>> -		smp_call_function_interrupt();
>> +		generic_smp_call_function_interrupt();
>>
>>   	return IRQ_HANDLED;
>>   }
>> diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c
>> index d0744cc77ea7..a31896c33716 100644
>> --- a/arch/mips/kernel/smp.c
>> +++ b/arch/mips/kernel/smp.c
>> @@ -192,16 +192,6 @@ asmlinkage void start_secondary(void)
>>   	cpu_startup_entry(CPUHP_ONLINE);
>>   }
>>
>> -/*
>> - * Call into both interrupt handlers, as we share the IPI for them
>> - */
>> -void __irq_entry smp_call_function_interrupt(void)
>> -{
>> -	irq_enter();
>> -	generic_smp_call_function_interrupt();
>> -	irq_exit();
>> -}
>> -
>>   static void stop_this_cpu(void *dummy)
>>   {
>>   	/*
>> diff --git a/arch/mips/lantiq/irq.c b/arch/mips/lantiq/irq.c
>> index 6ab10573490d..be18648cb8c8 100644
>> --- a/arch/mips/lantiq/irq.c
>> +++ b/arch/mips/lantiq/irq.c
>> @@ -293,7 +293,7 @@ static irqreturn_t ipi_resched_interrupt(int irq, void *dev_id)
>>
>>   static irqreturn_t ipi_call_interrupt(int irq, void *dev_id)
>>   {
>> -	smp_call_function_interrupt();
>> +	generic_smp_call_function_interrupt();
>>   	return IRQ_HANDLED;
>>   }
>>
>> diff --git a/arch/mips/loongson64/loongson-3/smp.c b/arch/mips/loongson64/loongson-3/smp.c
>> index 509877c6e9d9..1a4738a8f2d3 100644
>> --- a/arch/mips/loongson64/loongson-3/smp.c
>> +++ b/arch/mips/loongson64/loongson-3/smp.c
>> @@ -266,8 +266,11 @@ void loongson3_ipi_interrupt(struct pt_regs *regs)
>>   	if (action & SMP_RESCHEDULE_YOURSELF)
>>   		scheduler_ipi();
>>
>> -	if (action & SMP_CALL_FUNCTION)
>> -		smp_call_function_interrupt();
>> +	if (action & SMP_CALL_FUNCTION) {
>> +		irq_enter();
>> +		generic_smp_call_function_interrupt();
>> +		irq_exit();
>> +	}
>>
>>   	if (action & SMP_ASK_C0COUNT) {
>>   		BUG_ON(cpu != 0);
>> diff --git a/arch/mips/mti-malta/malta-int.c b/arch/mips/mti-malta/malta-int.c
>> index d1392f8f5811..fa8f591f3713 100644
>> --- a/arch/mips/mti-malta/malta-int.c
>> +++ b/arch/mips/mti-malta/malta-int.c
>> @@ -222,7 +222,7 @@ static irqreturn_t ipi_resched_interrupt(int irq, void *dev_id)
>>
>>   static irqreturn_t ipi_call_interrupt(int irq, void *dev_id)
>>   {
>> -	smp_call_function_interrupt();
>> +	generic_smp_call_function_interrupt();
>>
>>   	return IRQ_HANDLED;
>>   }
>> diff --git a/arch/mips/netlogic/common/smp.c b/arch/mips/netlogic/common/smp.c
>> index dc3e327fbbac..f5fff228b347 100644
>> --- a/arch/mips/netlogic/common/smp.c
>> +++ b/arch/mips/netlogic/common/smp.c
>> @@ -86,7 +86,7 @@ void nlm_smp_function_ipi_handler(unsigned int irq, struct irq_desc *desc)
>>   {
>>   	clear_c0_eimr(irq);
>>   	ack_c0_eirr(irq);
>> -	smp_call_function_interrupt();
>> +	generic_smp_call_function_interrupt();
>>   	set_c0_eimr(irq);
>>   }
>>
>> diff --git a/arch/mips/paravirt/paravirt-smp.c b/arch/mips/paravirt/paravirt-smp.c
>> index 42181c7105df..f8d3e081b2eb 100644
>> --- a/arch/mips/paravirt/paravirt-smp.c
>> +++ b/arch/mips/paravirt/paravirt-smp.c
>> @@ -114,7 +114,7 @@ static irqreturn_t paravirt_reched_interrupt(int irq, void *dev_id)
>>
>>   static irqreturn_t paravirt_function_interrupt(int irq, void *dev_id)
>>   {
>> -	smp_call_function_interrupt();
>> +	generic_smp_call_function_interrupt();
>>   	return IRQ_HANDLED;
>>   }
>>
>> diff --git a/arch/mips/pmcs-msp71xx/msp_smp.c b/arch/mips/pmcs-msp71xx/msp_smp.c
>> index 10170580a2de..ffa0f7101a97 100644
>> --- a/arch/mips/pmcs-msp71xx/msp_smp.c
>> +++ b/arch/mips/pmcs-msp71xx/msp_smp.c
>> @@ -44,7 +44,7 @@ static irqreturn_t ipi_resched_interrupt(int irq, void *dev_id)
>>
>>   static irqreturn_t ipi_call_interrupt(int irq, void *dev_id)
>>   {
>> -	smp_call_function_interrupt();
>> +	generic_smp_call_function_interrupt();
>>
>>   	return IRQ_HANDLED;
>>   }
>> diff --git a/arch/mips/sgi-ip27/ip27-irq.c b/arch/mips/sgi-ip27/ip27-irq.c
>> index 3fbaef97a1b8..16ec4e12daa3 100644
>> --- a/arch/mips/sgi-ip27/ip27-irq.c
>> +++ b/arch/mips/sgi-ip27/ip27-irq.c
>> @@ -107,10 +107,14 @@ static void ip27_do_irq_mask0(void)
>>   		scheduler_ipi();
>>   	} else if (pend0 & (1UL << CPU_CALL_A_IRQ)) {
>>   		LOCAL_HUB_CLR_INTR(CPU_CALL_A_IRQ);
>> -		smp_call_function_interrupt();
>> +		irq_enter();
>> +		generic_smp_call_function_interrupt();
>> +		irq_exit();
>>   	} else if (pend0 & (1UL << CPU_CALL_B_IRQ)) {
>>   		LOCAL_HUB_CLR_INTR(CPU_CALL_B_IRQ);
>> -		smp_call_function_interrupt();
>> +		irq_enter();
>> +		generic_smp_call_function_interrupt();
>> +		irq_exit();
>>   	} else
>>   #endif
>>   	{
>> diff --git a/arch/mips/sibyte/bcm1480/smp.c b/arch/mips/sibyte/bcm1480/smp.c
>> index af7d44edd9a8..4c71aea25663 100644
>> --- a/arch/mips/sibyte/bcm1480/smp.c
>> +++ b/arch/mips/sibyte/bcm1480/smp.c
>> @@ -29,8 +29,6 @@
>>   #include <asm/sibyte/bcm1480_regs.h>
>>   #include <asm/sibyte/bcm1480_int.h>
>>
>> -extern void smp_call_function_interrupt(void);
>> -
>>   /*
>>    * These are routines for dealing with the bcm1480 smp capabilities
>>    * independent of board/firmware
>> @@ -184,6 +182,9 @@ void bcm1480_mailbox_interrupt(void)
>>   	if (action & SMP_RESCHEDULE_YOURSELF)
>>   		scheduler_ipi();
>>
>> -	if (action & SMP_CALL_FUNCTION)
>> -		smp_call_function_interrupt();
>> +	if (action & SMP_CALL_FUNCTION) {
>> +		irq_enter();
>> +		generic_smp_call_function_interrupt();
>> +		irq_exit();
>> +	}
>>   }
>> diff --git a/arch/mips/sibyte/sb1250/smp.c b/arch/mips/sibyte/sb1250/smp.c
>> index c0c4b3f88a08..1cf66f5ff23d 100644
>> --- a/arch/mips/sibyte/sb1250/smp.c
>> +++ b/arch/mips/sibyte/sb1250/smp.c
>> @@ -172,6 +172,9 @@ void sb1250_mailbox_interrupt(void)
>>   	if (action & SMP_RESCHEDULE_YOURSELF)
>>   		scheduler_ipi();
>>
>> -	if (action & SMP_CALL_FUNCTION)
>> -		smp_call_function_interrupt();
>> +	if (action & SMP_CALL_FUNCTION) {
>> +		irq_enter();
>> +		generic_smp_call_function_interrupt();
>> +		irq_exit();
>> +	}
>>   }
>> --
>> 2.4.6
>>
>>

WARNING: multiple messages have this Message-ID (diff)
From: Alex Smith <alex.smith@imgtec.com>
To: Paul Burton <paul.burton@imgtec.com>
Cc: linux-mips@linux-mips.org
Subject: Re: [PATCH] MIPS: SMP: Don't increment irq_count multiple times for call function IPIs
Date: Fri, 24 Jul 2015 16:56:00 +0100	[thread overview]
Message-ID: <55B26010.2060002@imgtec.com> (raw)
Message-ID: <20150724155600.i2nR9oy7bdgHO-zq7TpAH-daFSeOECVwBPdukvCRcDQ@z> (raw)
In-Reply-To: <20150724154956.GU25683@NP-P-BURTON>

On 24/07/2015 16:49, Paul Burton wrote:
> On Fri, Jul 24, 2015 at 04:14:22PM +0100, Alex Smith wrote:
>> The majority of SMP platforms handle their IPIs through do_IRQ()
>> which calls irq_{enter/exit}(). When a call function IPI is received,
>> smp_call_function_interrupt() is called which also calls
>> irq_{enter,exit}(), meaning irq_count is raised twice.
>>
>> When tick broadcasting is used (which is implemented via a call
>> function IPI), this incorrectly causes all CPU idle time on the core
>> receiving broadcast ticks to be accounted as time spent servicing
>> IRQs, as account_process_tick() will account as such if irq_count is
>> greater than 1. This results in 100% CPU usage being reported on a
>> core which receives its ticks via broadcast.
>>
>> This patch removes the SMP smp_call_function_interrupt() wrapper which
>> calls irq_{enter,exit}(). Platforms which handle their IPIs through
>> do_IRQ() now call generic_smp_call_function_interrupt() directly to
>> avoid incrementing irq_count a second time. Platforms which don't
>> (loongson, sgi-ip27, sibyte) call generic_smp_call_function_interrupt()
>> wrapped in irq_{enter,exit}().
>>
>> Signed-off-by: Alex Smith <alex.smith@imgtec.com>
>> ---
>>   arch/mips/cavium-octeon/smp.c         |  2 +-
>>   arch/mips/include/asm/smp.h           |  2 --
>>   arch/mips/kernel/smp-bmips.c          |  4 ++--
>>   arch/mips/kernel/smp.c                | 10 ----------
>>   arch/mips/lantiq/irq.c                |  2 +-
>>   arch/mips/loongson64/loongson-3/smp.c |  7 +++++--
>>   arch/mips/mti-malta/malta-int.c       |  2 +-
>>   arch/mips/netlogic/common/smp.c       |  2 +-
>>   arch/mips/paravirt/paravirt-smp.c     |  2 +-
>>   arch/mips/pmcs-msp71xx/msp_smp.c      |  2 +-
>>   arch/mips/sgi-ip27/ip27-irq.c         |  8 ++++++--
>>   arch/mips/sibyte/bcm1480/smp.c        |  9 +++++----
>>   arch/mips/sibyte/sb1250/smp.c         |  7 +++++--
>>   13 files changed, 29 insertions(+), 30 deletions(-)
>
> Hi Alex,
>
> I think you'll need to catch the case in drivers/irqchip/irq-mips-gic.c
> too.
>
> Thanks,
>      Paul

You're right, I do, thanks.

I'll send v2.

Alex

>
>> diff --git a/arch/mips/cavium-octeon/smp.c b/arch/mips/cavium-octeon/smp.c
>> index 56f5d080ef9d..b7fa9ae28c36 100644
>> --- a/arch/mips/cavium-octeon/smp.c
>> +++ b/arch/mips/cavium-octeon/smp.c
>> @@ -42,7 +42,7 @@ static irqreturn_t mailbox_interrupt(int irq, void *dev_id)
>>   	cvmx_write_csr(CVMX_CIU_MBOX_CLRX(coreid), action);
>>
>>   	if (action & SMP_CALL_FUNCTION)
>> -		smp_call_function_interrupt();
>> +		generic_smp_call_function_interrupt();
>>   	if (action & SMP_RESCHEDULE_YOURSELF)
>>   		scheduler_ipi();
>>
>> diff --git a/arch/mips/include/asm/smp.h b/arch/mips/include/asm/smp.h
>> index 16f1ea9ab191..03722d4326a1 100644
>> --- a/arch/mips/include/asm/smp.h
>> +++ b/arch/mips/include/asm/smp.h
>> @@ -83,8 +83,6 @@ static inline void __cpu_die(unsigned int cpu)
>>   extern void play_dead(void);
>>   #endif
>>
>> -extern asmlinkage void smp_call_function_interrupt(void);
>> -
>>   static inline void arch_send_call_function_single_ipi(int cpu)
>>   {
>>   	extern struct plat_smp_ops *mp_ops;	/* private */
>> diff --git a/arch/mips/kernel/smp-bmips.c b/arch/mips/kernel/smp-bmips.c
>> index 336708ae5c5b..78cf8c2f1de0 100644
>> --- a/arch/mips/kernel/smp-bmips.c
>> +++ b/arch/mips/kernel/smp-bmips.c
>> @@ -284,7 +284,7 @@ static irqreturn_t bmips5000_ipi_interrupt(int irq, void *dev_id)
>>   	if (action == 0)
>>   		scheduler_ipi();
>>   	else
>> -		smp_call_function_interrupt();
>> +		generic_smp_call_function_interrupt();
>>
>>   	return IRQ_HANDLED;
>>   }
>> @@ -336,7 +336,7 @@ static irqreturn_t bmips43xx_ipi_interrupt(int irq, void *dev_id)
>>   	if (action & SMP_RESCHEDULE_YOURSELF)
>>   		scheduler_ipi();
>>   	if (action & SMP_CALL_FUNCTION)
>> -		smp_call_function_interrupt();
>> +		generic_smp_call_function_interrupt();
>>
>>   	return IRQ_HANDLED;
>>   }
>> diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c
>> index d0744cc77ea7..a31896c33716 100644
>> --- a/arch/mips/kernel/smp.c
>> +++ b/arch/mips/kernel/smp.c
>> @@ -192,16 +192,6 @@ asmlinkage void start_secondary(void)
>>   	cpu_startup_entry(CPUHP_ONLINE);
>>   }
>>
>> -/*
>> - * Call into both interrupt handlers, as we share the IPI for them
>> - */
>> -void __irq_entry smp_call_function_interrupt(void)
>> -{
>> -	irq_enter();
>> -	generic_smp_call_function_interrupt();
>> -	irq_exit();
>> -}
>> -
>>   static void stop_this_cpu(void *dummy)
>>   {
>>   	/*
>> diff --git a/arch/mips/lantiq/irq.c b/arch/mips/lantiq/irq.c
>> index 6ab10573490d..be18648cb8c8 100644
>> --- a/arch/mips/lantiq/irq.c
>> +++ b/arch/mips/lantiq/irq.c
>> @@ -293,7 +293,7 @@ static irqreturn_t ipi_resched_interrupt(int irq, void *dev_id)
>>
>>   static irqreturn_t ipi_call_interrupt(int irq, void *dev_id)
>>   {
>> -	smp_call_function_interrupt();
>> +	generic_smp_call_function_interrupt();
>>   	return IRQ_HANDLED;
>>   }
>>
>> diff --git a/arch/mips/loongson64/loongson-3/smp.c b/arch/mips/loongson64/loongson-3/smp.c
>> index 509877c6e9d9..1a4738a8f2d3 100644
>> --- a/arch/mips/loongson64/loongson-3/smp.c
>> +++ b/arch/mips/loongson64/loongson-3/smp.c
>> @@ -266,8 +266,11 @@ void loongson3_ipi_interrupt(struct pt_regs *regs)
>>   	if (action & SMP_RESCHEDULE_YOURSELF)
>>   		scheduler_ipi();
>>
>> -	if (action & SMP_CALL_FUNCTION)
>> -		smp_call_function_interrupt();
>> +	if (action & SMP_CALL_FUNCTION) {
>> +		irq_enter();
>> +		generic_smp_call_function_interrupt();
>> +		irq_exit();
>> +	}
>>
>>   	if (action & SMP_ASK_C0COUNT) {
>>   		BUG_ON(cpu != 0);
>> diff --git a/arch/mips/mti-malta/malta-int.c b/arch/mips/mti-malta/malta-int.c
>> index d1392f8f5811..fa8f591f3713 100644
>> --- a/arch/mips/mti-malta/malta-int.c
>> +++ b/arch/mips/mti-malta/malta-int.c
>> @@ -222,7 +222,7 @@ static irqreturn_t ipi_resched_interrupt(int irq, void *dev_id)
>>
>>   static irqreturn_t ipi_call_interrupt(int irq, void *dev_id)
>>   {
>> -	smp_call_function_interrupt();
>> +	generic_smp_call_function_interrupt();
>>
>>   	return IRQ_HANDLED;
>>   }
>> diff --git a/arch/mips/netlogic/common/smp.c b/arch/mips/netlogic/common/smp.c
>> index dc3e327fbbac..f5fff228b347 100644
>> --- a/arch/mips/netlogic/common/smp.c
>> +++ b/arch/mips/netlogic/common/smp.c
>> @@ -86,7 +86,7 @@ void nlm_smp_function_ipi_handler(unsigned int irq, struct irq_desc *desc)
>>   {
>>   	clear_c0_eimr(irq);
>>   	ack_c0_eirr(irq);
>> -	smp_call_function_interrupt();
>> +	generic_smp_call_function_interrupt();
>>   	set_c0_eimr(irq);
>>   }
>>
>> diff --git a/arch/mips/paravirt/paravirt-smp.c b/arch/mips/paravirt/paravirt-smp.c
>> index 42181c7105df..f8d3e081b2eb 100644
>> --- a/arch/mips/paravirt/paravirt-smp.c
>> +++ b/arch/mips/paravirt/paravirt-smp.c
>> @@ -114,7 +114,7 @@ static irqreturn_t paravirt_reched_interrupt(int irq, void *dev_id)
>>
>>   static irqreturn_t paravirt_function_interrupt(int irq, void *dev_id)
>>   {
>> -	smp_call_function_interrupt();
>> +	generic_smp_call_function_interrupt();
>>   	return IRQ_HANDLED;
>>   }
>>
>> diff --git a/arch/mips/pmcs-msp71xx/msp_smp.c b/arch/mips/pmcs-msp71xx/msp_smp.c
>> index 10170580a2de..ffa0f7101a97 100644
>> --- a/arch/mips/pmcs-msp71xx/msp_smp.c
>> +++ b/arch/mips/pmcs-msp71xx/msp_smp.c
>> @@ -44,7 +44,7 @@ static irqreturn_t ipi_resched_interrupt(int irq, void *dev_id)
>>
>>   static irqreturn_t ipi_call_interrupt(int irq, void *dev_id)
>>   {
>> -	smp_call_function_interrupt();
>> +	generic_smp_call_function_interrupt();
>>
>>   	return IRQ_HANDLED;
>>   }
>> diff --git a/arch/mips/sgi-ip27/ip27-irq.c b/arch/mips/sgi-ip27/ip27-irq.c
>> index 3fbaef97a1b8..16ec4e12daa3 100644
>> --- a/arch/mips/sgi-ip27/ip27-irq.c
>> +++ b/arch/mips/sgi-ip27/ip27-irq.c
>> @@ -107,10 +107,14 @@ static void ip27_do_irq_mask0(void)
>>   		scheduler_ipi();
>>   	} else if (pend0 & (1UL << CPU_CALL_A_IRQ)) {
>>   		LOCAL_HUB_CLR_INTR(CPU_CALL_A_IRQ);
>> -		smp_call_function_interrupt();
>> +		irq_enter();
>> +		generic_smp_call_function_interrupt();
>> +		irq_exit();
>>   	} else if (pend0 & (1UL << CPU_CALL_B_IRQ)) {
>>   		LOCAL_HUB_CLR_INTR(CPU_CALL_B_IRQ);
>> -		smp_call_function_interrupt();
>> +		irq_enter();
>> +		generic_smp_call_function_interrupt();
>> +		irq_exit();
>>   	} else
>>   #endif
>>   	{
>> diff --git a/arch/mips/sibyte/bcm1480/smp.c b/arch/mips/sibyte/bcm1480/smp.c
>> index af7d44edd9a8..4c71aea25663 100644
>> --- a/arch/mips/sibyte/bcm1480/smp.c
>> +++ b/arch/mips/sibyte/bcm1480/smp.c
>> @@ -29,8 +29,6 @@
>>   #include <asm/sibyte/bcm1480_regs.h>
>>   #include <asm/sibyte/bcm1480_int.h>
>>
>> -extern void smp_call_function_interrupt(void);
>> -
>>   /*
>>    * These are routines for dealing with the bcm1480 smp capabilities
>>    * independent of board/firmware
>> @@ -184,6 +182,9 @@ void bcm1480_mailbox_interrupt(void)
>>   	if (action & SMP_RESCHEDULE_YOURSELF)
>>   		scheduler_ipi();
>>
>> -	if (action & SMP_CALL_FUNCTION)
>> -		smp_call_function_interrupt();
>> +	if (action & SMP_CALL_FUNCTION) {
>> +		irq_enter();
>> +		generic_smp_call_function_interrupt();
>> +		irq_exit();
>> +	}
>>   }
>> diff --git a/arch/mips/sibyte/sb1250/smp.c b/arch/mips/sibyte/sb1250/smp.c
>> index c0c4b3f88a08..1cf66f5ff23d 100644
>> --- a/arch/mips/sibyte/sb1250/smp.c
>> +++ b/arch/mips/sibyte/sb1250/smp.c
>> @@ -172,6 +172,9 @@ void sb1250_mailbox_interrupt(void)
>>   	if (action & SMP_RESCHEDULE_YOURSELF)
>>   		scheduler_ipi();
>>
>> -	if (action & SMP_CALL_FUNCTION)
>> -		smp_call_function_interrupt();
>> +	if (action & SMP_CALL_FUNCTION) {
>> +		irq_enter();
>> +		generic_smp_call_function_interrupt();
>> +		irq_exit();
>> +	}
>>   }
>> --
>> 2.4.6
>>
>>

  reply	other threads:[~2015-07-24 15:56 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-24 15:14 [PATCH] MIPS: SMP: Don't increment irq_count multiple times for call function IPIs Alex Smith
2015-07-24 15:14 ` Alex Smith
2015-07-24 15:49 ` Paul Burton
2015-07-24 15:49   ` Paul Burton
2015-07-24 15:56   ` Alex Smith [this message]
2015-07-24 15:56     ` Alex Smith

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=55B26010.2060002@imgtec.com \
    --to=alex.smith@imgtec.com \
    --cc=linux-mips@linux-mips.org \
    --cc=paul.burton@imgtec.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.