linux-mips
[Top] [All Lists]

Re: Question on SMP warning in irq_cpu.c

To: Raj Palani <Rajesh_Palani@pmc-sierra.com>
Subject: Re: Question on SMP warning in irq_cpu.c
From: Ralf Baechle <ralf@linux-mips.org>
Date: Mon, 24 Apr 2006 11:08:03 +0100
Cc: linux-mips@linux-mips.org
In-reply-to: <12E9F4D6141E504DA2F115E577252AC7C09451@sjc1exm04.pmc-sierra.bc.ca>
Original-recipient: rfc822;linux-mips@linux-mips.org
References: <12E9F4D6141E504DA2F115E577252AC7C09451@sjc1exm04.pmc-sierra.bc.ca>
Sender: linux-mips-bounce@linux-mips.org
User-agent: Mutt/1.4.2.1i
On Tue, Apr 18, 2006 at 10:50:28AM -0700, Raj Palani wrote:

>    I have a question regarding the following warning in the 
> arch/mips/kernel/irq_cpu.c.
>    What is the reason for this comment and in case it is not SMP safe, what 
> are the changes needed to make it SMP safe?
> /*
>  * Almost all MIPS CPUs define 8 interrupt sources.  They are typically
>  * level triggered (i.e., cannot be cleared from CPU; must be cleared from
>  * device).  The first two are software interrupts which we don't really
>  * use or support.  The last one is usually the CPU timer interrupt if
>  * counter register is present or, for CPUs with an external FPU, by
>  * convention it's the FPU exception interrupt.
>  *
>  * Don't even think about using this on SMP.  You have been warned.
>  *
>  * This file exports one global function:
>  *    void mips_cpu_irq_init(int irq_base);
>  */

The interrupt controller is part of the processor itself, so any
manipulation of it's control registers needs to be done on the processor
itself.  On an SMP system however calling enable_irq, disable_irq etc.
is legal on any CPU, so the wrong processor's interrupts might be
changed.  Also there is no provision for interrupts that are handled the
same on all processor.  The count / compare interrupt is a typical
example for this.

The answer is a little more complicated if considering multithreading a la
34K due to the more complicated priviledged resource architecture but the
underlying problem is the same.

  Ralf

<Prev in Thread] Current Thread [Next in Thread>