tsnep: Fix NAPI scheduling
authorGerhard Engleder <gerhard@engleder-embedded.com>
Fri, 15 Sep 2023 21:01:24 +0000 (23:01 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 6 Oct 2023 12:56:57 +0000 (14:56 +0200)
[ Upstream commit ea852c17f5382a0a52041cfbd9a4451ae0fa1a38 ]

According to the NAPI documentation networking/napi.rst, drivers which
have to mask interrupts explicitly should use the napi_schedule_prep()
and __napi_schedule() calls.

No problem seen so far with current implementation. Nevertheless, let's
align the implementation with documentation.

Signed-off-by: Gerhard Engleder <gerhard@engleder-embedded.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/engleder/tsnep_main.c

index 6bf3cc1..00436a6 100644 (file)
@@ -65,8 +65,11 @@ static irqreturn_t tsnep_irq(int irq, void *arg)
 
        /* handle TX/RX queue 0 interrupt */
        if ((active & adapter->queue[0].irq_mask) != 0) {
-               tsnep_disable_irq(adapter, adapter->queue[0].irq_mask);
-               napi_schedule(&adapter->queue[0].napi);
+               if (napi_schedule_prep(&adapter->queue[0].napi)) {
+                       tsnep_disable_irq(adapter, adapter->queue[0].irq_mask);
+                       /* schedule after masking to avoid races */
+                       __napi_schedule(&adapter->queue[0].napi);
+               }
        }
 
        return IRQ_HANDLED;
@@ -77,8 +80,11 @@ static irqreturn_t tsnep_irq_txrx(int irq, void *arg)
        struct tsnep_queue *queue = arg;
 
        /* handle TX/RX queue interrupt */
-       tsnep_disable_irq(queue->adapter, queue->irq_mask);
-       napi_schedule(&queue->napi);
+       if (napi_schedule_prep(&queue->napi)) {
+               tsnep_disable_irq(queue->adapter, queue->irq_mask);
+               /* schedule after masking to avoid races */
+               __napi_schedule(&queue->napi);
+       }
 
        return IRQ_HANDLED;
 }