Commit 6969cf0f authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller

mlx4: make validate_loopback() more generic

Testing a boolean in fast path is not worth duplicating
the code allocating packets, when GRO is on or off.

If this proves to be a problem, we might later use a jump label.

Next patch will remove this duplicated code and ease code review.
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Acked-by: default avatarTariq Toukan <tariqt@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 02e6fd3e
...@@ -584,20 +584,17 @@ static struct sk_buff *mlx4_en_rx_skb(struct mlx4_en_priv *priv, ...@@ -584,20 +584,17 @@ static struct sk_buff *mlx4_en_rx_skb(struct mlx4_en_priv *priv,
return skb; return skb;
} }
static void validate_loopback(struct mlx4_en_priv *priv, struct sk_buff *skb) static void validate_loopback(struct mlx4_en_priv *priv, void *va)
{ {
const unsigned char *data = va + ETH_HLEN;
int i; int i;
int offset = ETH_HLEN;
for (i = 0; i < MLX4_LOOPBACK_TEST_PAYLOAD; i++, offset++) { for (i = 0; i < MLX4_LOOPBACK_TEST_PAYLOAD; i++) {
if (*(skb->data + offset) != (unsigned char) (i & 0xff)) if (data[i] != (unsigned char)i)
goto out_loopback; return;
} }
/* Loopback found */ /* Loopback found */
priv->loopback_ok = 1; priv->loopback_ok = 1;
out_loopback:
dev_kfree_skb_any(skb);
} }
static bool mlx4_en_refill_rx_buffers(struct mlx4_en_priv *priv, static bool mlx4_en_refill_rx_buffers(struct mlx4_en_priv *priv,
...@@ -785,6 +782,11 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud ...@@ -785,6 +782,11 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
} }
} }
if (unlikely(priv->validate_loopback)) {
validate_loopback(priv, va);
goto next;
}
/* /*
* Packet is OK - process it. * Packet is OK - process it.
*/ */
...@@ -948,11 +950,6 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud ...@@ -948,11 +950,6 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
goto next; goto next;
} }
if (unlikely(priv->validate_loopback)) {
validate_loopback(priv, skb);
goto next;
}
if (ip_summed == CHECKSUM_COMPLETE) { if (ip_summed == CHECKSUM_COMPLETE) {
if (check_csum(cqe, skb, va, dev->features)) { if (check_csum(cqe, skb, va, dev->features)) {
ip_summed = CHECKSUM_NONE; ip_summed = CHECKSUM_NONE;
......
...@@ -81,14 +81,11 @@ static int mlx4_en_test_loopback(struct mlx4_en_priv *priv) ...@@ -81,14 +81,11 @@ static int mlx4_en_test_loopback(struct mlx4_en_priv *priv)
{ {
u32 loopback_ok = 0; u32 loopback_ok = 0;
int i; int i;
bool gro_enabled;
priv->loopback_ok = 0; priv->loopback_ok = 0;
priv->validate_loopback = 1; priv->validate_loopback = 1;
gro_enabled = priv->dev->features & NETIF_F_GRO;
mlx4_en_update_loopback_state(priv->dev, priv->dev->features); mlx4_en_update_loopback_state(priv->dev, priv->dev->features);
priv->dev->features &= ~NETIF_F_GRO;
/* xmit */ /* xmit */
if (mlx4_en_test_loopback_xmit(priv)) { if (mlx4_en_test_loopback_xmit(priv)) {
...@@ -111,9 +108,6 @@ static int mlx4_en_test_loopback(struct mlx4_en_priv *priv) ...@@ -111,9 +108,6 @@ static int mlx4_en_test_loopback(struct mlx4_en_priv *priv)
priv->validate_loopback = 0; priv->validate_loopback = 0;
if (gro_enabled)
priv->dev->features |= NETIF_F_GRO;
mlx4_en_update_loopback_state(priv->dev, priv->dev->features); mlx4_en_update_loopback_state(priv->dev, priv->dev->features);
return !loopback_ok; return !loopback_ok;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment