aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Dumazet <eric.dumazet@gmail.com>2010-11-23 22:45:10 -0500
committerDavid S. Miller <davem@davemloft.net>2010-11-24 14:08:13 -0500
commite1210d127d11fc40d229648c9754aa60776ef796 (patch)
treeedcae49b857172ad2af0ba721d99d715e8f694e7
parent37a118452cbc9c0cf0d23bfd16d3ca56058be754 (diff)
bnx2x: Disable local BHes to prevent a dead-lock situation
According to Eric's suggestion: Disable local BHes to prevent a dead-lock situation between sch_direct_xmit() (Soft_IRQ context) and bnx2x_tx_int (called by bnx2x_run_loopback() - syscall context), as both are taking a netif_tx_lock(). Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: Vladislav Zolotarov <vladz@broadcom.com> Signed-off-by: Eilon Greenstein <eilong@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/bnx2x/bnx2x_ethtool.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/net/bnx2x/bnx2x_ethtool.c b/drivers/net/bnx2x/bnx2x_ethtool.c
index d02ffbdc9f0e..03012787de2f 100644
--- a/drivers/net/bnx2x/bnx2x_ethtool.c
+++ b/drivers/net/bnx2x/bnx2x_ethtool.c
@@ -1499,8 +1499,15 @@ static int bnx2x_run_loopback(struct bnx2x *bp, int loopback_mode, u8 link_up)
1499 * updates that have been performed while interrupts were 1499 * updates that have been performed while interrupts were
1500 * disabled. 1500 * disabled.
1501 */ 1501 */
1502 if (bp->common.int_block == INT_BLOCK_IGU) 1502 if (bp->common.int_block == INT_BLOCK_IGU) {
1503 /* Disable local BHes to prevent a dead-lock situation between
1504 * sch_direct_xmit() and bnx2x_run_loopback() (calling
1505 * bnx2x_tx_int()), as both are taking netif_tx_lock().
1506 */
1507 local_bh_disable();
1503 bnx2x_tx_int(fp_tx); 1508 bnx2x_tx_int(fp_tx);
1509 local_bh_enable();
1510 }
1504 1511
1505 rx_idx = le16_to_cpu(*fp_rx->rx_cons_sb); 1512 rx_idx = le16_to_cpu(*fp_rx->rx_cons_sb);
1506 if (rx_idx != rx_start_idx + num_pkts) 1513 if (rx_idx != rx_start_idx + num_pkts)