Commit 97236cda authored by Antoine Tenart's avatar Antoine Tenart Committed by David S. Miller

net: macb: use GRO

This patch updates the macb driver to use NAPI GRO helpers when
receiving SKBs. This improves performances.
Signed-off-by: default avatarAntoine Tenart <antoine.tenart@bootlin.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 760a3c1a
...@@ -1060,7 +1060,8 @@ struct macb_or_gem_ops { ...@@ -1060,7 +1060,8 @@ struct macb_or_gem_ops {
int (*mog_alloc_rx_buffers)(struct macb *bp); int (*mog_alloc_rx_buffers)(struct macb *bp);
void (*mog_free_rx_buffers)(struct macb *bp); void (*mog_free_rx_buffers)(struct macb *bp);
void (*mog_init_rings)(struct macb *bp); void (*mog_init_rings)(struct macb *bp);
int (*mog_rx)(struct macb_queue *queue, int budget); int (*mog_rx)(struct macb_queue *queue, struct napi_struct *napi,
int budget);
}; };
/* MACB-PTP interface: adapt to platform needs. */ /* MACB-PTP interface: adapt to platform needs. */
......
...@@ -991,7 +991,8 @@ static void discard_partial_frame(struct macb_queue *queue, unsigned int begin, ...@@ -991,7 +991,8 @@ static void discard_partial_frame(struct macb_queue *queue, unsigned int begin,
*/ */
} }
static int gem_rx(struct macb_queue *queue, int budget) static int gem_rx(struct macb_queue *queue, struct napi_struct *napi,
int budget)
{ {
struct macb *bp = queue->bp; struct macb *bp = queue->bp;
unsigned int len; unsigned int len;
...@@ -1073,7 +1074,7 @@ static int gem_rx(struct macb_queue *queue, int budget) ...@@ -1073,7 +1074,7 @@ static int gem_rx(struct macb_queue *queue, int budget)
skb->data, 32, true); skb->data, 32, true);
#endif #endif
netif_receive_skb(skb); napi_gro_receive(napi, skb);
} }
gem_rx_refill(queue); gem_rx_refill(queue);
...@@ -1081,8 +1082,8 @@ static int gem_rx(struct macb_queue *queue, int budget) ...@@ -1081,8 +1082,8 @@ static int gem_rx(struct macb_queue *queue, int budget)
return count; return count;
} }
static int macb_rx_frame(struct macb_queue *queue, unsigned int first_frag, static int macb_rx_frame(struct macb_queue *queue, struct napi_struct *napi,
unsigned int last_frag) unsigned int first_frag, unsigned int last_frag)
{ {
unsigned int len; unsigned int len;
unsigned int frag; unsigned int frag;
...@@ -1158,7 +1159,7 @@ static int macb_rx_frame(struct macb_queue *queue, unsigned int first_frag, ...@@ -1158,7 +1159,7 @@ static int macb_rx_frame(struct macb_queue *queue, unsigned int first_frag,
bp->dev->stats.rx_bytes += skb->len; bp->dev->stats.rx_bytes += skb->len;
netdev_vdbg(bp->dev, "received skb of length %u, csum: %08x\n", netdev_vdbg(bp->dev, "received skb of length %u, csum: %08x\n",
skb->len, skb->csum); skb->len, skb->csum);
netif_receive_skb(skb); napi_gro_receive(napi, skb);
return 0; return 0;
} }
...@@ -1181,7 +1182,8 @@ static inline void macb_init_rx_ring(struct macb_queue *queue) ...@@ -1181,7 +1182,8 @@ static inline void macb_init_rx_ring(struct macb_queue *queue)
queue->rx_tail = 0; queue->rx_tail = 0;
} }
static int macb_rx(struct macb_queue *queue, int budget) static int macb_rx(struct macb_queue *queue, struct napi_struct *napi,
int budget)
{ {
struct macb *bp = queue->bp; struct macb *bp = queue->bp;
bool reset_rx_queue = false; bool reset_rx_queue = false;
...@@ -1218,7 +1220,7 @@ static int macb_rx(struct macb_queue *queue, int budget) ...@@ -1218,7 +1220,7 @@ static int macb_rx(struct macb_queue *queue, int budget)
continue; continue;
} }
dropped = macb_rx_frame(queue, first_frag, tail); dropped = macb_rx_frame(queue, napi, first_frag, tail);
first_frag = -1; first_frag = -1;
if (unlikely(dropped < 0)) { if (unlikely(dropped < 0)) {
reset_rx_queue = true; reset_rx_queue = true;
...@@ -1272,7 +1274,7 @@ static int macb_poll(struct napi_struct *napi, int budget) ...@@ -1272,7 +1274,7 @@ static int macb_poll(struct napi_struct *napi, int budget)
netdev_vdbg(bp->dev, "poll: status = %08lx, budget = %d\n", netdev_vdbg(bp->dev, "poll: status = %08lx, budget = %d\n",
(unsigned long)status, budget); (unsigned long)status, budget);
work_done = bp->macbgem_ops.mog_rx(queue, budget); work_done = bp->macbgem_ops.mog_rx(queue, napi, budget);
if (work_done < budget) { if (work_done < budget) {
napi_complete_done(napi, work_done); napi_complete_done(napi, work_done);
......
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