diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c index edc4a881036813f4eb0e1aa23e8e2937f384ecb8..b96627c4972fd48c9c00c39fa8b8540c3830498a 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -267,6 +268,11 @@ static u32 mlx4_en_free_tx_desc(struct mlx4_en_priv *priv, int nr_maps = tx_info->nr_maps; int i; + /* We do not touch skb here, so prefetch skb->users location + * to speedup consume_skb() + */ + prefetchw(&skb->users); + if (unlikely(timestamp)) { struct skb_shared_hwtstamps hwts; @@ -385,6 +391,7 @@ static bool mlx4_en_process_tx_cq(struct net_device *dev, if (!priv->port_up) return true; + prefetchw(&ring->tx_queue->dql.limit); index = cons_index & size_mask; cqe = mlx4_en_get_cqe(buf, index, priv->cqe_size) + factor; ring_index = ring->cons & size_mask; @@ -722,6 +729,8 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev) } } + prefetchw(&ring->tx_queue->dql); + /* Track current inflight packets for performance analysis */ AVG_PERF_COUNTER(priv->pstats.inflight_avg, (u32) (ring->prod - ring->cons - 1));