diff options
author | Eric Dumazet <edumazet@google.com> | 2014-10-05 05:35:11 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-10-06 01:04:15 -0400 |
commit | 6a4e81211f475561ed87c613216f981fbef8b7fc (patch) | |
tree | ced59807448f488d408e5fe28a89b563357676bb | |
parent | 98b1634941e3efb0334f794efc79702839993d86 (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.c | 17 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 3 |
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, | |||
654 | netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev) | 655 | netdev_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; |