Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -1060,7 +1060,8 @@ struct macb_or_gem_ops {
	int	(*mog_alloc_rx_buffers)(struct macb *bp);
	void	(*mog_free_rx_buffers)(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. */
+10 −8
Original line number Diff line number Diff line
@@ -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;
	unsigned int		len;
@@ -1073,7 +1074,7 @@ static int gem_rx(struct macb_queue *queue, int budget)
			       skb->data, 32, true);
#endif

		netif_receive_skb(skb);
		napi_gro_receive(napi, skb);
	}

	gem_rx_refill(queue);
@@ -1081,8 +1082,8 @@ static int gem_rx(struct macb_queue *queue, int budget)
	return count;
}

static int macb_rx_frame(struct macb_queue *queue, unsigned int first_frag,
			 unsigned int last_frag)
static int macb_rx_frame(struct macb_queue *queue, struct napi_struct *napi,
			 unsigned int first_frag, unsigned int last_frag)
{
	unsigned int len;
	unsigned int 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;
	netdev_vdbg(bp->dev, "received skb of length %u, csum: %08x\n",
		    skb->len, skb->csum);
	netif_receive_skb(skb);
	napi_gro_receive(napi, skb);

	return 0;
}
@@ -1181,7 +1182,8 @@ static inline void macb_init_rx_ring(struct macb_queue *queue)
	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;
	bool reset_rx_queue = false;
@@ -1218,7 +1220,7 @@ static int macb_rx(struct macb_queue *queue, int budget)
				continue;
			}

			dropped = macb_rx_frame(queue, first_frag, tail);
			dropped = macb_rx_frame(queue, napi, first_frag, tail);
			first_frag = -1;
			if (unlikely(dropped < 0)) {
				reset_rx_queue = true;
@@ -1272,7 +1274,7 @@ static int macb_poll(struct napi_struct *napi, int budget)
	netdev_vdbg(bp->dev, "poll: status = %08lx, budget = %d\n",
		    (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) {
		napi_complete_done(napi, work_done);