aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMoshe Shemesh <moshe@mellanox.com>2016-09-11 03:56:20 -0400
committerDavid S. Miller <davem@davemloft.net>2016-09-11 22:40:26 -0400
commit7a61fc86af4a0c957c5b8c5777ab21d5cc286748 (patch)
treef7908527ba24428c8426aae21a6343939b2795ae
parent564ed9b187082da79726a2f25bb88a58ebeec7e8 (diff)
net/mlx4_en: Fix panic on xmit while port is down
When port is down, tx drop counter update is not needed. Updating the counter in this case can cause a kernel panic as when the port is down, ring can be NULL. Fixes: 63a664b7e92b ("net/mlx4_en: fix tx_dropped bug") Signed-off-by: Moshe Shemesh <moshe@mellanox.com> Signed-off-by: Tariq Toukan <tariqt@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_tx.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c
index 9df87ca0515a..e2509bba3e7c 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c
@@ -818,7 +818,7 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
818 real_size = get_real_size(skb, shinfo, dev, &lso_header_size, 818 real_size = get_real_size(skb, shinfo, dev, &lso_header_size,
819 &inline_ok, &fragptr); 819 &inline_ok, &fragptr);
820 if (unlikely(!real_size)) 820 if (unlikely(!real_size))
821 goto tx_drop; 821 goto tx_drop_count;
822 822
823 /* Align descriptor to TXBB size */ 823 /* Align descriptor to TXBB size */
824 desc_size = ALIGN(real_size, TXBB_SIZE); 824 desc_size = ALIGN(real_size, TXBB_SIZE);
@@ -826,7 +826,7 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
826 if (unlikely(nr_txbb > MAX_DESC_TXBBS)) { 826 if (unlikely(nr_txbb > MAX_DESC_TXBBS)) {
827 if (netif_msg_tx_err(priv)) 827 if (netif_msg_tx_err(priv))
828 en_warn(priv, "Oversized header or SG list\n"); 828 en_warn(priv, "Oversized header or SG list\n");
829 goto tx_drop; 829 goto tx_drop_count;
830 } 830 }
831 831
832 bf_ok = ring->bf_enabled; 832 bf_ok = ring->bf_enabled;
@@ -1071,9 +1071,10 @@ tx_drop_unmap:
1071 PCI_DMA_TODEVICE); 1071 PCI_DMA_TODEVICE);
1072 } 1072 }
1073 1073
1074tx_drop_count:
1075 ring->tx_dropped++;
1074tx_drop: 1076tx_drop:
1075 dev_kfree_skb_any(skb); 1077 dev_kfree_skb_any(skb);
1076 ring->tx_dropped++;
1077 return NETDEV_TX_OK; 1078 return NETDEV_TX_OK;
1078} 1079}
1079 1080
@@ -1106,7 +1107,7 @@ netdev_tx_t mlx4_en_xmit_frame(struct mlx4_en_rx_alloc *frame,
1106 goto tx_drop; 1107 goto tx_drop;
1107 1108
1108 if (mlx4_en_is_tx_ring_full(ring)) 1109 if (mlx4_en_is_tx_ring_full(ring))
1109 goto tx_drop; 1110 goto tx_drop_count;
1110 1111
1111 /* fetch ring->cons far ahead before needing it to avoid stall */ 1112 /* fetch ring->cons far ahead before needing it to avoid stall */
1112 ring_cons = READ_ONCE(ring->cons); 1113 ring_cons = READ_ONCE(ring->cons);
@@ -1176,7 +1177,8 @@ netdev_tx_t mlx4_en_xmit_frame(struct mlx4_en_rx_alloc *frame,
1176 1177
1177 return NETDEV_TX_OK; 1178 return NETDEV_TX_OK;
1178 1179
1179tx_drop: 1180tx_drop_count:
1180 ring->tx_dropped++; 1181 ring->tx_dropped++;
1182tx_drop:
1181 return NETDEV_TX_BUSY; 1183 return NETDEV_TX_BUSY;
1182} 1184}