Skip to content

Commit d8e0814

Browse files
foxdroddkuba-moo
authored andcommitted
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: Florian Fuchs <[email protected]> Reviewed-by: Simon Horman <[email protected]> Reviewed-by: Eric Dumazet <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 3101f3e commit d8e0814

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

drivers/net/ethernet/toshiba/ps3_gelic_net.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,7 @@ static int gelic_card_init_chain(struct gelic_card *card,
364364
* gelic_descr_prepare_rx - reinitializes a rx descriptor
365365
* @card: card structure
366366
* @descr: descriptor to re-init
367+
* @napi_mode: is it running in napi poll
367368
*
368369
* return 0 on success, <0 on failure
369370
*
@@ -374,7 +375,8 @@ static int gelic_card_init_chain(struct gelic_card *card,
374375
* must be a multiple of GELIC_NET_RXBUF_ALIGN.
375376
*/
376377
static int gelic_descr_prepare_rx(struct gelic_card *card,
377-
struct gelic_descr *descr)
378+
struct gelic_descr *descr,
379+
bool napi_mode)
378380
{
379381
static const unsigned int rx_skb_size =
380382
ALIGN(GELIC_NET_MAX_FRAME, GELIC_NET_RXBUF_ALIGN) +
@@ -392,7 +394,10 @@ static int gelic_descr_prepare_rx(struct gelic_card *card,
392394
descr->hw_regs.payload.dev_addr = 0;
393395
descr->hw_regs.payload.size = 0;
394396

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

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

966971
/* pass skb up to stack */
967-
netif_receive_skb(skb);
972+
napi_gro_receive(&card->napi, skb);
968973
}
969974

970975
/**
@@ -1069,7 +1074,7 @@ static int gelic_card_decode_one_descr(struct gelic_card *card)
10691074
/*
10701075
* this call can fail, propagate the error
10711076
*/
1072-
prepare_rx_ret = gelic_descr_prepare_rx(card, descr);
1077+
prepare_rx_ret = gelic_descr_prepare_rx(card, descr, true);
10731078
if (prepare_rx_ret)
10741079
return prepare_rx_ret;
10751080

0 commit comments

Comments
 (0)