diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2010-11-23 22:45:10 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-11-24 14:08:13 -0500 |
commit | e1210d127d11fc40d229648c9754aa60776ef796 (patch) | |
tree | edcae49b857172ad2af0ba721d99d715e8f694e7 | |
parent | 37a118452cbc9c0cf0d23bfd16d3ca56058be754 (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.c | 9 |
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) |