Re: local_irq_save not masking interrupts
From: Esben Nielsen <hidden>
Date: 2006-09-27 16:52:37
On Tue, 26 Sep 2006, Alex Zeffertt wrote:
Hi list,
I'm having a strange problem with interrupts. My platform is the
MPC832xEMDS and the BSP I'm using (from Freescale) uses Linux-2.6.11.
In the code below I enter a critical section with local_irq_save(),
call request_irq() (from mpc832xemds_phy_interrupt_enable) 4 times,
then exit the critical section using local_irq_restore.
/* Enable interrupts from PHYs */
local_irq_save(flags);
for (i = 0; i < driver_data->num_phys; i++) {
struct atm_dev *dev = driver_data->dev_data[i]->dev;
printk("%s/%d\n",__FUNCTION__,__LINE__);
RETURN_ON_ERROR(mpc832xemds_phy_interrupt_enable(dev));
}
local_irq_restore(flags);This is a pure side-comment: Please, don't use local_irq_save() for a critical region. Use spin_lock_irqsave(), for 3 reasons: 1) SMP. 2) Preempt-realtime is like SMP not happy about using local_irq_save(). 3) Read-ability: It is more clear what data is protected when there is a named lock object in the code. You might not care about 1) and 2) but 3) should matter for you. And remember: When CONFIG_SMP is not set spin_lock_irqsave() will just become a local_irq_save(). Esben