|
@@ -66,6 +66,7 @@ int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv,
|
|
|
ring->size = size;
|
|
|
ring->size_mask = size - 1;
|
|
|
ring->stride = stride;
|
|
|
+ ring->full_size = ring->size - HEADROOM - MAX_DESC_TXBBS;
|
|
|
|
|
|
tmp = size * sizeof(struct mlx4_en_tx_info);
|
|
|
ring->tx_info = kmalloc_node(tmp, GFP_KERNEL | __GFP_NOWARN, node);
|
|
@@ -232,6 +233,11 @@ void mlx4_en_deactivate_tx_ring(struct mlx4_en_priv *priv,
|
|
|
MLX4_QP_STATE_RST, NULL, 0, 0, &ring->qp);
|
|
|
}
|
|
|
|
|
|
+static inline bool mlx4_en_is_tx_ring_full(struct mlx4_en_tx_ring *ring)
|
|
|
+{
|
|
|
+ return ring->prod - ring->cons > ring->full_size;
|
|
|
+}
|
|
|
+
|
|
|
static void mlx4_en_stamp_wqe(struct mlx4_en_priv *priv,
|
|
|
struct mlx4_en_tx_ring *ring, int index,
|
|
|
u8 owner)
|
|
@@ -474,11 +480,10 @@ static bool mlx4_en_process_tx_cq(struct net_device *dev,
|
|
|
|
|
|
netdev_tx_completed_queue(ring->tx_queue, packets, bytes);
|
|
|
|
|
|
- /*
|
|
|
- * Wakeup Tx queue if this stopped, and at least 1 packet
|
|
|
- * was completed
|
|
|
+ /* Wakeup Tx queue if this stopped, and ring is not full.
|
|
|
*/
|
|
|
- if (netif_tx_queue_stopped(ring->tx_queue) && txbbs_skipped > 0) {
|
|
|
+ if (netif_tx_queue_stopped(ring->tx_queue) &&
|
|
|
+ !mlx4_en_is_tx_ring_full(ring)) {
|
|
|
netif_tx_wake_queue(ring->tx_queue);
|
|
|
ring->wake_queue++;
|
|
|
}
|
|
@@ -922,8 +927,7 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
skb_tx_timestamp(skb);
|
|
|
|
|
|
/* Check available TXBBs And 2K spare for prefetch */
|
|
|
- stop_queue = (int)(ring->prod - ring_cons) >
|
|
|
- ring->size - HEADROOM - MAX_DESC_TXBBS;
|
|
|
+ stop_queue = mlx4_en_is_tx_ring_full(ring);
|
|
|
if (unlikely(stop_queue)) {
|
|
|
netif_tx_stop_queue(ring->tx_queue);
|
|
|
ring->queue_stopped++;
|
|
@@ -992,8 +996,7 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
smp_rmb();
|
|
|
|
|
|
ring_cons = ACCESS_ONCE(ring->cons);
|
|
|
- if (unlikely(((int)(ring->prod - ring_cons)) <=
|
|
|
- ring->size - HEADROOM - MAX_DESC_TXBBS)) {
|
|
|
+ if (unlikely(!mlx4_en_is_tx_ring_full(ring))) {
|
|
|
netif_tx_wake_queue(ring->tx_queue);
|
|
|
ring->wake_queue++;
|
|
|
}
|