Thread (9 messages) 9 messages, 4 authors, 2006-09-27

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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help