* [patch 2.6.29-rc8] dm9000 locking bugfix
@ 2009-03-22 23:12 David Brownell
2009-03-23 4:28 ` David Miller
0 siblings, 1 reply; 2+ messages in thread
From: David Brownell @ 2009-03-22 23:12 UTC (permalink / raw)
To: netdev
From: David Brownell <dbrownell@users.sourceforge.net>
This fixes a locking bug in the dm9000 driver. It calls
request_irq() without setting IRQF_DISABLED ... which is
correct for handlers that support IRQ sharing, since that
behavior is not guaranteed for shared IRQs. However, its
IRQ handler then wrongly assumes that IRQs are blocked.
So the fix just uses the right spinlock primitives in the
IRQ handler.
NOTE: this is a classic example of the type of bug which
lockdep currently masks by forcibly setting IRQF_DISABLED
on IRQ handlers that did not request that flag.
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
---
The annoying "watchdog timeouts" seem unrelated to this.
But on at least one problem, enabling lockdep makes them
go away ... good fun, eh?
drivers/net/dm9000.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
--- a/drivers/net/dm9000.c
+++ b/drivers/net/dm9000.c
@@ -930,13 +930,15 @@ static irqreturn_t dm9000_interrupt(int
struct net_device *dev = dev_id;
board_info_t *db = netdev_priv(dev);
int int_status;
+ unsigned long flags;
u8 reg_save;
dm9000_dbg(db, 3, "entering %s\n", __func__);
/* A real interrupt coming */
- spin_lock(&db->lock);
+ /* holders of db->lock must always block IRQs */
+ spin_lock_irqsave(&db->lock, flags);
/* Save previous register address */
reg_save = readb(db->io_addr);
@@ -972,7 +974,7 @@ static irqreturn_t dm9000_interrupt(int
/* Restore previous register address */
writeb(reg_save, db->io_addr);
- spin_unlock(&db->lock);
+ spin_unlock_irqrestore(&db->lock, flags);
return IRQ_HANDLED;
}
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [patch 2.6.29-rc8] dm9000 locking bugfix
2009-03-22 23:12 [patch 2.6.29-rc8] dm9000 locking bugfix David Brownell
@ 2009-03-23 4:28 ` David Miller
0 siblings, 0 replies; 2+ messages in thread
From: David Miller @ 2009-03-23 4:28 UTC (permalink / raw)
To: david-b; +Cc: netdev
From: David Brownell <david-b@pacbell.net>
Date: Sun, 22 Mar 2009 16:12:12 -0700
> This fixes a locking bug in the dm9000 driver. It calls
> request_irq() without setting IRQF_DISABLED ... which is
> correct for handlers that support IRQ sharing, since that
> behavior is not guaranteed for shared IRQs. However, its
> IRQ handler then wrongly assumes that IRQs are blocked.
> So the fix just uses the right spinlock primitives in the
> IRQ handler.
>
> NOTE: this is a classic example of the type of bug which
> lockdep currently masks by forcibly setting IRQF_DISABLED
> on IRQ handlers that did not request that flag.
>
> Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Applied, thanks.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2009-03-23 4:29 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-03-22 23:12 [patch 2.6.29-rc8] dm9000 locking bugfix David Brownell
2009-03-23 4:28 ` David Miller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).