On Wed, Jan 18, 2006 at 04:26:00PM +0100, Olaf Hering wrote:
> I havent checked if this patch is the culprit, but 2.6.16-rc1-git1 does
> lockup after modprobe -v mv643xx_eth , dhcpcd eth2.
> Have to find a serial console for the pegasos, all I get on console is
>
> BUG: spinlock recursion on CPU#0, dhcpcd/2844
> lock: dd96f148, .magic: dead4ead, .owner: dhcpcd/2844, .owner_cpu:0
> BUG: spinlock lockup on CPU#0, dhcpdcd/2844, dd96f148
Olaf, would you please try the patch below. It works for me.
Thanks,
-Dale
From: Dale Farnsworth <[EMAIL PROTECTED]>
This patch eliminates a spinlock recursion bug I 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 <[EMAIL PROTECTED]>
mv643xx_eth.c | 13 -------------
1 file changed, 13 deletions(-)
Index: linux-2.6-mv643xx_enet/drivers/net/mv643xx_eth.c
===================================================================
--- linux-2.6-mv643xx_enet.orig/drivers/net/mv643xx_eth.c 2006-01-18
11:12:07.000000000 -0700
+++ linux-2.6-mv643xx_enet/drivers/net/mv643xx_eth.c 2006-01-18
11:13:44.000000000 -0700
@@ -2617,7 +2617,6 @@
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)
@@ -2634,8 +2633,6 @@
return ETH_ERROR;
}
- spin_lock_irqsave(&mp->lock, flags);
-
mp->tx_ring_skbs++;
BUG_ON(mp->tx_ring_skbs > mp->tx_ring_size);
@@ -2685,15 +2682,11 @@
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
@@ -2704,14 +2697,11 @@
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);
@@ -2742,12 +2732,9 @@
/* 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
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html