]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
net: ravb: Align poll function with NAPI docs
authorPaul Barker <paul.barker.ct@bp.renesas.com>
Tue, 4 Jun 2024 07:28:20 +0000 (08:28 +0100)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 6 Jun 2024 07:59:57 +0000 (09:59 +0200)
Align ravb_poll() with the documentation in
`Documentation/networking/kapi.rst` and
`Documentation/networking/napi.rst`.

The documentation says that we should prefer napi_complete_done() over
napi_complete(), and using the former allows us to properly support busy
polling. We should ensure that napi_complete_done() is only called if
the work budget has not been exhausted, and we should only re-arm
interrupts if it returns true.

Signed-off-by: Paul Barker <paul.barker.ct@bp.renesas.com>
Reviewed-by: Sergey Shtylyov <s.shtylyov@omp.ru>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/renesas/ravb_main.c

index 193ad05383a8d57bc3ab180c00778b8af77d3f61..472aa80002bef053b370efedb30f35b68add676d 100644 (file)
@@ -1341,23 +1341,19 @@ static int ravb_poll(struct napi_struct *napi, int budget)
        if (priv->rx_fifo_errors != ndev->stats.rx_fifo_errors)
                ndev->stats.rx_fifo_errors = priv->rx_fifo_errors;
 
-       if (work_done == budget)
-               goto out;
-
-       napi_complete(napi);
-
-       /* Re-enable RX/TX interrupts */
-       spin_lock_irqsave(&priv->lock, flags);
-       if (!info->irq_en_dis) {
-               ravb_modify(ndev, RIC0, mask, mask);
-               ravb_modify(ndev, TIC,  mask, mask);
-       } else {
-               ravb_write(ndev, mask, RIE0);
-               ravb_write(ndev, mask, TIE);
+       if (work_done < budget && napi_complete_done(napi, work_done)) {
+               /* Re-enable RX/TX interrupts */
+               spin_lock_irqsave(&priv->lock, flags);
+               if (!info->irq_en_dis) {
+                       ravb_modify(ndev, RIC0, mask, mask);
+                       ravb_modify(ndev, TIC,  mask, mask);
+               } else {
+                       ravb_write(ndev, mask, RIE0);
+                       ravb_write(ndev, mask, TIE);
+               }
+               spin_unlock_irqrestore(&priv->lock, flags);
        }
-       spin_unlock_irqrestore(&priv->lock, flags);
 
-out:
        return work_done;
 }