net: ena: fix napi handler misbehavior when the napi budget is zero
authorNetanel Belgazal <netanel@amazon.com>
Tue, 10 Dec 2019 11:27:44 +0000 (11:27 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 4 Jan 2020 13:00:11 +0000 (14:00 +0100)
[ Upstream commit 24dee0c7478d1a1e00abdf5625b7f921467325dc ]

In netpoll the napi handler could be called with budget equal to zero.
Current ENA napi handler doesn't take that into consideration.

The napi handler handles Rx packets in a do-while loop.
Currently, the budget check happens only after decrementing the
budget, therefore the napi handler, in rare cases, could run over
MAX_INT packets.

In addition to that, this moves all budget related variables to int
calculation and stop mixing u32 to avoid ambiguity

Fixes: 1738cd3ed342 ("net: ena: Add a driver for Amazon Elastic Network Adapters (ENA)")
Signed-off-by: Netanel Belgazal <netanel@amazon.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/ethernet/amazon/ena/ena_netdev.c

index db6f6a877f6308120049229b59355fd4747aa6b8..d22b138c2b096813b7471a0219ce7430ba3b739c 100644 (file)
@@ -1196,8 +1196,8 @@ static int ena_io_poll(struct napi_struct *napi, int budget)
        struct ena_napi *ena_napi = container_of(napi, struct ena_napi, napi);
        struct ena_ring *tx_ring, *rx_ring;
 
-       u32 tx_work_done;
-       u32 rx_work_done;
+       int tx_work_done;
+       int rx_work_done = 0;
        int tx_budget;
        int napi_comp_call = 0;
        int ret;
@@ -1214,7 +1214,11 @@ static int ena_io_poll(struct napi_struct *napi, int budget)
        }
 
        tx_work_done = ena_clean_tx_irq(tx_ring, tx_budget);
-       rx_work_done = ena_clean_rx_irq(rx_ring, napi, budget);
+       /* On netpoll the budget is zero and the handler should only clean the
+        * tx completions.
+        */
+       if (likely(budget))
+               rx_work_done = ena_clean_rx_irq(rx_ring, napi, budget);
 
        /* If the device is about to reset or down, avoid unmask
         * the interrupt and return 0 so NAPI won't reschedule