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