Skip to content

Commit

Permalink
[PATCH] skge: irq lock race
Browse files Browse the repository at this point in the history
The driver needs to access the IRQ status inside of lock to avoid
races with other places changing IRQ mask etc. This may be related
to some of the SMP bugs reported against skge in kernel bugzilla.

Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
  • Loading branch information
Stephen Hemminger authored and Jeff Garzik committed Sep 6, 2006
1 parent c54f976 commit 29365c9
Showing 1 changed file with 6 additions and 3 deletions.
9 changes: 6 additions & 3 deletions drivers/net/skge.c
Original file line number Diff line number Diff line change
Expand Up @@ -2891,13 +2891,15 @@ static irqreturn_t skge_intr(int irq, void *dev_id, struct pt_regs *regs)
{
struct skge_hw *hw = dev_id;
u32 status;
int handled = 0;

spin_lock(&hw->hw_lock);
/* Reading this register masks IRQ */
status = skge_read32(hw, B0_SP_ISRC);
if (status == 0)
return IRQ_NONE;
goto out;

spin_lock(&hw->hw_lock);
handled = 1;
status &= hw->intr_mask;
if (status & IS_EXT_REG) {
hw->intr_mask &= ~IS_EXT_REG;
Expand Down Expand Up @@ -2959,9 +2961,10 @@ static irqreturn_t skge_intr(int irq, void *dev_id, struct pt_regs *regs)

skge_write32(hw, B0_IMSK, hw->intr_mask);
skge_read32(hw, B0_IMSK);
out:
spin_unlock(&hw->hw_lock);

return IRQ_HANDLED;
return IRQ_RETVAL(handled);
}

#ifdef CONFIG_NET_POLL_CONTROLLER
Expand Down

0 comments on commit 29365c9

Please sign in to comment.