Use napi_complete_done() instead of __napi_complete() to : 1) Get support of gro_flush_timeout if opt-in 2) Not rearm interrupts for busy-polling users. 3) use standard NAPI API. 4) Eventually get rid of napi_gro_flush() in the future.
Signed-off-by: Eric Dumazet <eduma...@google.com> --- drivers/net/ethernet/realtek/8139cp.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/drivers/net/ethernet/realtek/8139cp.c b/drivers/net/ethernet/realtek/8139cp.c index 0b3cd58093d5ecf00abef6eda1386f13ac5e..1ca3ff1d36923c09ddcbdc2ba1a36ae67f46 100644 --- a/drivers/net/ethernet/realtek/8139cp.c +++ b/drivers/net/ethernet/realtek/8139cp.c @@ -465,10 +465,8 @@ static int cp_rx_poll(struct napi_struct *napi, int budget) struct cp_private *cp = container_of(napi, struct cp_private, napi); struct net_device *dev = cp->dev; unsigned int rx_tail = cp->rx_tail; - int rx; + int rx = 0; - rx = 0; -rx_status_loop: cpw16(IntrStatus, cp_rx_intr_mask); while (rx < budget) { @@ -557,16 +555,13 @@ static int cp_rx_poll(struct napi_struct *napi, int budget) * this round of polling */ if (rx < budget) { - unsigned long flags; + if (napi_complete_done(napi, rx)) { + unsigned long flags; - if (cpr16(IntrStatus) & cp_rx_intr_mask) - goto rx_status_loop; - - napi_gro_flush(napi, false); - spin_lock_irqsave(&cp->lock, flags); - __napi_complete(napi); - cpw16_f(IntrMask, cp_intr_mask); - spin_unlock_irqrestore(&cp->lock, flags); + spin_lock_irqsave(&cp->lock, flags); + cpw16_f(IntrMask, cp_intr_mask); + spin_unlock_irqrestore(&cp->lock, flags); + } } return rx; -- 2.11.0.483.g087da7b7c-goog