Skip to content

Commit

Permalink
[PATCH] mv643xx_eth: Fix spinlock recursion bug
Browse files Browse the repository at this point in the history
This patch eliminates a spinlock recursion bug introduced recently.
Since eth_port_send() is always called with the lock held, we simply
remove the locking inside the function itself.

Signed-off-by: Dale Farnsworth <dale@farnsworth.org>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
  • Loading branch information
Dale Farnsworth authored and Jeff Garzik committed Jan 27, 2006
1 parent efd51b5 commit c7cd901
Showing 1 changed file with 0 additions and 13 deletions.
13 changes: 0 additions & 13 deletions drivers/net/mv643xx_eth.c
Original file line number Diff line number Diff line change
Expand Up @@ -2617,7 +2617,6 @@ static ETH_FUNC_RET_STATUS eth_port_send(struct mv643xx_private *mp,
struct eth_tx_desc *current_descriptor;
struct eth_tx_desc *first_descriptor;
u32 command;
unsigned long flags;

/* Do not process Tx ring in case of Tx ring resource error */
if (mp->tx_resource_err)
Expand All @@ -2634,8 +2633,6 @@ static ETH_FUNC_RET_STATUS eth_port_send(struct mv643xx_private *mp,
return ETH_ERROR;
}

spin_lock_irqsave(&mp->lock, flags);

mp->tx_ring_skbs++;
BUG_ON(mp->tx_ring_skbs > mp->tx_ring_size);

Expand Down Expand Up @@ -2685,15 +2682,11 @@ static ETH_FUNC_RET_STATUS eth_port_send(struct mv643xx_private *mp,
mp->tx_resource_err = 1;
mp->tx_curr_desc_q = tx_first_desc;

spin_unlock_irqrestore(&mp->lock, flags);

return ETH_QUEUE_LAST_RESOURCE;
}

mp->tx_curr_desc_q = tx_next_desc;

spin_unlock_irqrestore(&mp->lock, flags);

return ETH_OK;
}
#else
Expand All @@ -2704,14 +2697,11 @@ static ETH_FUNC_RET_STATUS eth_port_send(struct mv643xx_private *mp,
int tx_desc_used;
struct eth_tx_desc *current_descriptor;
unsigned int command_status;
unsigned long flags;

/* Do not process Tx ring in case of Tx ring resource error */
if (mp->tx_resource_err)
return ETH_QUEUE_FULL;

spin_lock_irqsave(&mp->lock, flags);

mp->tx_ring_skbs++;
BUG_ON(mp->tx_ring_skbs > mp->tx_ring_size);

Expand Down Expand Up @@ -2742,12 +2732,9 @@ static ETH_FUNC_RET_STATUS eth_port_send(struct mv643xx_private *mp,
/* Check for ring index overlap in the Tx desc ring */
if (tx_desc_curr == tx_desc_used) {
mp->tx_resource_err = 1;

spin_unlock_irqrestore(&mp->lock, flags);
return ETH_QUEUE_LAST_RESOURCE;
}

spin_unlock_irqrestore(&mp->lock, flags);
return ETH_OK;
}
#endif
Expand Down

0 comments on commit c7cd901

Please sign in to comment.