]> Pileus Git - ~andy/linux/commitdiff
net/mlx4_en: call gro handler for encapsulated frames
authorEric Dumazet <edumazet@google.com>
Thu, 9 Jan 2014 18:30:13 +0000 (10:30 -0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 13 Jan 2014 19:41:47 +0000 (11:41 -0800)
In order to use the native GRO handling of encapsulated protocols on
mlx4, we need to call napi_gro_receive() instead of netif_receive_skb()
unless busy polling is in action.

While we are at it, rename mlx4_en_cq_ll_polling() to
mlx4_en_cq_busy_polling()

Tested with GRE tunnel : GRO aggregation is now performed on the
ethernet device instead of being done later on gre device.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Amir Vadai <amirv@mellanox.com>
Cc: Jerry Chu <hkchu@google.com>
Cc: Or Gerlitz <ogerlitz@mellanox.com>
Acked-By: Amir Vadai <amirv@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlx4/en_rx.c
drivers/net/ethernet/mellanox/mlx4/mlx4_en.h

index 3b66f26ba0491dc1db22fdb0ac6a166b830e84ea..890922c1c8eea11d4d737d81aefffde4e157e3a2 100644 (file)
@@ -724,7 +724,7 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
                                 * - not an IP fragment
                                 * - no LLS polling in progress
                                 */
-                               if (!mlx4_en_cq_ll_polling(cq) &&
+                               if (!mlx4_en_cq_busy_polling(cq) &&
                                    (dev->features & NETIF_F_GRO)) {
                                        struct sk_buff *gro_skb = napi_get_frags(&cq->napi);
                                        if (!gro_skb)
@@ -816,8 +816,10 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
 
                skb_mark_napi_id(skb, &cq->napi);
 
-               /* Push it up the stack */
-               netif_receive_skb(skb);
+               if (!mlx4_en_cq_busy_polling(cq))
+                       napi_gro_receive(&cq->napi, skb);
+               else
+                       netif_receive_skb(skb);
 
 next:
                for (nr = 0; nr < priv->num_frags; nr++)
index 2f1e200f2e4ce8b29e69ec8c970f7743f61bd466..fe7bdfebf353e745e3c447b820d5c72c413c06e4 100644 (file)
@@ -661,7 +661,7 @@ static inline bool mlx4_en_cq_unlock_poll(struct mlx4_en_cq *cq)
 }
 
 /* true if a socket is polling, even if it did not get the lock */
-static inline bool mlx4_en_cq_ll_polling(struct mlx4_en_cq *cq)
+static inline bool mlx4_en_cq_busy_polling(struct mlx4_en_cq *cq)
 {
        WARN_ON(!(cq->state & MLX4_CQ_LOCKED));
        return cq->state & CQ_USER_PEND;
@@ -691,7 +691,7 @@ static inline bool mlx4_en_cq_unlock_poll(struct mlx4_en_cq *cq)
        return false;
 }
 
-static inline bool mlx4_en_cq_ll_polling(struct mlx4_en_cq *cq)
+static inline bool mlx4_en_cq_busy_polling(struct mlx4_en_cq *cq)
 {
        return false;
 }