>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. > >>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. There is a problem with that approach. At initialization time one has no idea about the interrupts that should be set. E.g, in our system, PCIe interrupts need be enabled only if there is a device attached to one of the pcie bus. Moreover, whether the device requests Intx, MSI or MSI-X is determinable only at the event of request_irq(). That means, it is imperative that we defer setting EIMR till request_irq() Om.