mlx4: make validate_loopback() more generic
authorEric Dumazet <edumazet@google.com>
Wed, 8 Mar 2017 16:17:17 +0000 (08:17 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 9 Mar 2017 17:54:46 +0000 (09:54 -0800)
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: Eric Dumazet <edumazet@google.com>
Acked-by: Tariq Toukan <tariqt@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlx4/en_rx.c
drivers/net/ethernet/mellanox/mlx4/en_selftest.c

index b5aa3f986508f0a5a89a40e18f8db99767068fef..33b28278c8270197c5a8f35521fd2af5e1e6b1be 100644 (file)
@@ -584,20 +584,17 @@ static struct sk_buff *mlx4_en_rx_skb(struct mlx4_en_priv *priv,
        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 offset = ETH_HLEN;
 
-       for (i = 0; i < MLX4_LOOPBACK_TEST_PAYLOAD; i++, offset++) {
-               if (*(skb->data + offset) != (unsigned char) (i & 0xff))
-                       goto out_loopback;
+       for (i = 0; i < MLX4_LOOPBACK_TEST_PAYLOAD; i++) {
+               if (data[i] != (unsigned char)i)
+                       return;
        }
        /* Loopback found */
        priv->loopback_ok = 1;
-
-out_loopback:
-       dev_kfree_skb_any(skb);
 }
 
 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
                        }
                }
 
+               if (unlikely(priv->validate_loopback)) {
+                       validate_loopback(priv, va);
+                       goto next;
+               }
+
                /*
                 * Packet is OK - process it.
                 */
@@ -948,11 +950,6 @@ xdp_drop_no_cnt:
                        goto next;
                }
 
-               if (unlikely(priv->validate_loopback)) {
-                       validate_loopback(priv, skb);
-                       goto next;
-               }
-
                if (ip_summed == CHECKSUM_COMPLETE) {
                        if (check_csum(cqe, skb, va, dev->features)) {
                                ip_summed = CHECKSUM_NONE;
index 95290e1fc9fe7600b2e3bcca334f3fad7d733c09..17112faafbccc5f7a75ee82a287be7952859ae9e 100644 (file)
@@ -81,14 +81,11 @@ static int mlx4_en_test_loopback(struct mlx4_en_priv *priv)
 {
        u32 loopback_ok = 0;
        int i;
-       bool gro_enabled;
 
         priv->loopback_ok = 0;
        priv->validate_loopback = 1;
-       gro_enabled = priv->dev->features & NETIF_F_GRO;
 
        mlx4_en_update_loopback_state(priv->dev, priv->dev->features);
-       priv->dev->features &= ~NETIF_F_GRO;
 
        /* xmit */
        if (mlx4_en_test_loopback_xmit(priv)) {
@@ -111,9 +108,6 @@ mlx4_en_test_loopback_exit:
 
        priv->validate_loopback = 0;
 
-       if (gro_enabled)
-               priv->dev->features |= NETIF_F_GRO;
-
        mlx4_en_update_loopback_state(priv->dev, priv->dev->features);
        return !loopback_ok;
 }