diff mbox series

[V2,net] net: ena: fix napi handler misbehavior when the napi budget is zero

Message ID 20191210112744.6301-1-netanel@amazon.com
State Accepted
Delegated to: David Miller
Headers show
Series [V2,net] net: ena: fix napi handler misbehavior when the napi budget is zero | expand

Commit Message

Belgazal, Netanel Dec. 10, 2019, 11:27 a.m. UTC
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

Signed-off-by: Netanel Belgazal <netanel@amazon.com>
Fixes: 1738cd3ed342 ("net: ena: Add a driver for Amazon Elastic Network Adapters (ENA)")
---
 drivers/net/ethernet/amazon/ena/ena_netdev.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

Comments

David Miller Dec. 11, 2019, 1:55 a.m. UTC | #1
From: Netanel Belgazal <netanel@amazon.com>
Date: Tue, 10 Dec 2019 11:27:44 +0000

> 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
> 
> Signed-off-by: Netanel Belgazal <netanel@amazon.com>
> Fixes: 1738cd3ed342 ("net: ena: Add a driver for Amazon Elastic Network Adapters (ENA)")

Please place the Fixes: tag first in the list of tags next time.

Applied and queued up for -stable, thanks.
diff mbox series

Patch

diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index c487d2a7d6dd..b4a145220aba 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -1238,8 +1238,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;
@@ -1256,7 +1256,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