Re: How to chip->startup() with IRQs disabled

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat, Aug 27, 2011 at 7:09 AM, Om Narasimhan
<onarasimhan@xxxxxxxxxxxxxxxxx> wrote:
> 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.

In XLR code (http://git.linux-mips.org/?p=linux.git;a=blob;f=arch/mips/netlogic/xlr/smp.c)
we do the initialization of EIMR in nlm_init_secondary() which is
registered as .init_secondary method in smp_ops.  on_each_cpu() may
not be the right way to do this.

JC.



[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux