diff options
author | Eric Dumazet <edumazet@google.com> | 2014-10-05 12:35:14 +0300 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-10-06 01:04:15 -0400 |
commit | 29d40c903247596c954446639116467eb6689bb7 (patch) | |
tree | f7d83f93675d8011428428f673d9882f342fbdfc | |
parent | 3d03641cb4ea050f969dd3ab34113adb95287f36 (diff) | |
download | op-kernel-dev-29d40c903247596c954446639116467eb6689bb7.zip op-kernel-dev-29d40c903247596c954446639116467eb6689bb7.tar.gz |
net/mlx4_en: Use prefetch in tx path
mlx4_en_free_tx_desc() uses a prefetchw(&skb->users) to speed up
consume_skb()
prefetchw(&ring->tx_queue->dql) to speed up BQL update
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Amir Vadai <amirv@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/en_tx.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c index edc4a88..b96627c 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c @@ -37,6 +37,7 @@ #include <linux/mlx4/qp.h> #include <linux/skbuff.h> #include <linux/if_vlan.h> +#include <linux/prefetch.h> #include <linux/vmalloc.h> #include <linux/tcp.h> #include <linux/ip.h> @@ -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)); |