aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Dumazet <edumazet@google.com>2014-10-05 05:35:11 -0400
committerDavid S. Miller <davem@davemloft.net>2014-10-06 01:04:15 -0400
commit6a4e81211f475561ed87c613216f981fbef8b7fc (patch)
treeced59807448f488d408e5fe28a89b563357676bb
parent98b1634941e3efb0334f794efc79702839993d86 (diff)
net/mlx4_en: Avoid calling bswap in tx fast path
- doorbell_qpn is stored in the cpu_to_be32() way to avoid bswap() in fast path. - mdev->mr.key stored in ring->mr_key to also avoid bswap() and access to cold cache line. 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.c17
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/mlx4_en.h3
2 files changed, 12 insertions, 8 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c
index eaf23eb7266a..322cda32ef80 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c
@@ -195,7 +195,8 @@ int mlx4_en_activate_tx_ring(struct mlx4_en_priv *priv,
195 memset(ring->buf, 0, ring->buf_size); 195 memset(ring->buf, 0, ring->buf_size);
196 196
197 ring->qp_state = MLX4_QP_STATE_RST; 197 ring->qp_state = MLX4_QP_STATE_RST;
198 ring->doorbell_qpn = ring->qp.qpn << 8; 198 ring->doorbell_qpn = cpu_to_be32(ring->qp.qpn << 8);
199 ring->mr_key = cpu_to_be32(mdev->mr.key);
199 200
200 mlx4_en_fill_qp_context(priv, ring->size, ring->stride, 1, 0, ring->qpn, 201 mlx4_en_fill_qp_context(priv, ring->size, ring->stride, 1, 0, ring->qpn,
201 ring->cqn, user_prio, &ring->context); 202 ring->cqn, user_prio, &ring->context);
@@ -654,7 +655,6 @@ static void mlx4_bf_copy(void __iomem *dst, const void *src,
654netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev) 655netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
655{ 656{
656 struct mlx4_en_priv *priv = netdev_priv(dev); 657 struct mlx4_en_priv *priv = netdev_priv(dev);
657 struct mlx4_en_dev *mdev = priv->mdev;
658 struct device *ddev = priv->ddev; 658 struct device *ddev = priv->ddev;
659 struct mlx4_en_tx_ring *ring; 659 struct mlx4_en_tx_ring *ring;
660 struct mlx4_en_tx_desc *tx_desc; 660 struct mlx4_en_tx_desc *tx_desc;
@@ -769,7 +769,7 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
769 goto tx_drop_unmap; 769 goto tx_drop_unmap;
770 770
771 data->addr = cpu_to_be64(dma); 771 data->addr = cpu_to_be64(dma);
772 data->lkey = cpu_to_be32(mdev->mr.key); 772 data->lkey = ring->mr_key;
773 wmb(); 773 wmb();
774 data->byte_count = cpu_to_be32(skb_frag_size(frag)); 774 data->byte_count = cpu_to_be32(skb_frag_size(frag));
775 --data; 775 --data;
@@ -787,7 +787,7 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
787 goto tx_drop_unmap; 787 goto tx_drop_unmap;
788 788
789 data->addr = cpu_to_be64(dma); 789 data->addr = cpu_to_be64(dma);
790 data->lkey = cpu_to_be32(mdev->mr.key); 790 data->lkey = ring->mr_key;
791 wmb(); 791 wmb();
792 data->byte_count = cpu_to_be32(byte_count); 792 data->byte_count = cpu_to_be32(byte_count);
793 } 793 }
@@ -879,9 +879,12 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
879 879
880 send_doorbell = !skb->xmit_more || netif_xmit_stopped(ring->tx_queue); 880 send_doorbell = !skb->xmit_more || netif_xmit_stopped(ring->tx_queue);
881 881
882 real_size = (real_size / 16) & 0x3f;
883
882 if (ring->bf_enabled && desc_size <= MAX_BF && !bounce && 884 if (ring->bf_enabled && desc_size <= MAX_BF && !bounce &&
883 !vlan_tx_tag_present(skb) && send_doorbell) { 885 !vlan_tx_tag_present(skb) && send_doorbell) {
884 tx_desc->ctrl.bf_qpn |= cpu_to_be32(ring->doorbell_qpn); 886 tx_desc->ctrl.bf_qpn = ring->doorbell_qpn |
887 cpu_to_be32(real_size);
885 888
886 op_own |= htonl((bf_index & 0xffff) << 8); 889 op_own |= htonl((bf_index & 0xffff) << 8);
887 /* Ensure new descriptor hits memory 890 /* Ensure new descriptor hits memory
@@ -911,8 +914,8 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
911 tx_desc->ctrl.owner_opcode = op_own; 914 tx_desc->ctrl.owner_opcode = op_own;
912 if (send_doorbell) { 915 if (send_doorbell) {
913 wmb(); 916 wmb();
914 iowrite32be(ring->doorbell_qpn, 917 iowrite32(ring->doorbell_qpn,
915 ring->bf.uar->map + MLX4_SEND_DOORBELL); 918 ring->bf.uar->map + MLX4_SEND_DOORBELL);
916 } else { 919 } else {
917 ring->xmit_more++; 920 ring->xmit_more++;
918 } 921 }
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
index b7bde95e05fe..ab34461e628c 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
@@ -279,7 +279,8 @@ struct mlx4_en_tx_ring {
279 u16 stride; 279 u16 stride;
280 u16 cqn; /* index of port CQ associated with this ring */ 280 u16 cqn; /* index of port CQ associated with this ring */
281 u32 buf_size; 281 u32 buf_size;
282 u32 doorbell_qpn; 282 __be32 doorbell_qpn;
283 __be32 mr_key;
283 void *buf; 284 void *buf;
284 struct mlx4_en_tx_info *tx_info; 285 struct mlx4_en_tx_info *tx_info;
285 u8 *bounce_buf; 286 u8 *bounce_buf;