Commit d8e08149 authored by Florian Fuchs's avatar Florian Fuchs Committed by Jakub Kicinski
Browse files

net: ps3_gelic_net: Use napi_alloc_skb() and napi_gro_receive()



Use the napi functions napi_alloc_skb() and napi_gro_receive() instead
of netdev_alloc_skb() and netif_receive_skb() for more efficient packet
receiving. The switch to napi aware functions increases the RX
throughput, reduces the occurrence of retransmissions and improves the
resilience against SKB allocation failures.

Signed-off-by: default avatarFlorian Fuchs <fuchsfl@gmail.com>
Reviewed-by: default avatarSimon Horman <horms@kernel.org>
Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20251130194155.1950980-1-fuchsfl@gmail.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 3101f3e1
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -364,6 +364,7 @@ static int gelic_card_init_chain(struct gelic_card *card,
 * gelic_descr_prepare_rx - reinitializes a rx descriptor
 * @card: card structure
 * @descr: descriptor to re-init
 * @napi_mode: is it running in napi poll
 *
 * return 0 on success, <0 on failure
 *
@@ -374,7 +375,8 @@ static int gelic_card_init_chain(struct gelic_card *card,
 * must be a multiple of GELIC_NET_RXBUF_ALIGN.
 */
static int gelic_descr_prepare_rx(struct gelic_card *card,
				  struct gelic_descr *descr)
				  struct gelic_descr *descr,
				  bool napi_mode)
{
	static const unsigned int rx_skb_size =
		ALIGN(GELIC_NET_MAX_FRAME, GELIC_NET_RXBUF_ALIGN) +
@@ -392,6 +394,9 @@ static int gelic_descr_prepare_rx(struct gelic_card *card,
	descr->hw_regs.payload.dev_addr = 0;
	descr->hw_regs.payload.size = 0;

	if (napi_mode)
		descr->skb = napi_alloc_skb(&card->napi, rx_skb_size);
	else
		descr->skb = netdev_alloc_skb(*card->netdev, rx_skb_size);
	if (!descr->skb) {
		descr->hw_regs.payload.dev_addr = 0; /* tell DMAC don't touch memory */
@@ -464,7 +469,7 @@ static int gelic_card_fill_rx_chain(struct gelic_card *card)

	do {
		if (!descr->skb) {
			ret = gelic_descr_prepare_rx(card, descr);
			ret = gelic_descr_prepare_rx(card, descr, false);
			if (ret)
				goto rewind;
		}
@@ -964,7 +969,7 @@ static void gelic_net_pass_skb_up(struct gelic_descr *descr,
	netdev->stats.rx_bytes += skb->len;

	/* pass skb up to stack */
	netif_receive_skb(skb);
	napi_gro_receive(&card->napi, skb);
}

/**
@@ -1069,7 +1074,7 @@ static int gelic_card_decode_one_descr(struct gelic_card *card)
	/*
	 * this call can fail, propagate the error
	 */
	prepare_rx_ret = gelic_descr_prepare_rx(card, descr);
	prepare_rx_ret = gelic_descr_prepare_rx(card, descr, true);
	if (prepare_rx_ret)
		return prepare_rx_ret;