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.