linux-mips
[Top] [All Lists]

How to chip->startup() with IRQs disabled

To: <linux-mips@linux-mips.org>
Subject: How to chip->startup() with IRQs disabled
From: "Om Narasimhan" <onarasimhan@netlogicmicro.com>
Date: Fri, 26 Aug 2011 18:39:17 -0700
Sender: linux-mips-bounce@linux-mips.org
Thread-index: AcxkWiI2j/+0JnnlT7KeKap/xgfTRQ==
Thread-topic: How to chip->startup() with IRQs disabled
Hi,
I am working on a chip with multiple cores. I have defined 
static struct irq_chip new_plat_chip = {
...
        .startup = n_irq_startup,
        .mask = n_irq_shutdown,
...
};

In n_irq_startup(), I have to make sure that all cores have set RVEC bit and 
corresponding EIMR bit. So, I try using on_each_cpu() (because EIMR can be set 
only by running code on that particular cpu) to run a function to set EIMR.

n_irq_startup() is called as chip->startup() from __setup_irq() (from 
request_threaded_irq, in turn from request_irq() ) with a spin lock held 
(desc->lock, in kernel/irq/manage.c).  This causes a stack dump from 
on_each_cpu(). Since it is wrong to call on_each_cpu with interrupts disabled, 
I want to change this piece of code.

I am wondering how other SMP mips system implement this. Any comments or 
pointers will be helpful.

I am not in the mailing list, please CC me in replies.

Om.

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