[V1,net] net: ena: fix napi handler misbehavior when the napi budget is zero
diff mbox series

Message ID 20191208173026.25745-1-netanel@amazon.com
State Not Applicable
Delegated to: David Miller
Headers show
Series
  • [V1,net] net: ena: fix napi handler misbehavior when the napi budget is zero
Related show

Commit Message

Belgazal, Netanel Dec. 8, 2019, 5:30 p.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>
---
 drivers/net/ethernet/amazon/ena/ena_netdev.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

Comments

David Miller Dec. 9, 2019, 6:34 p.m. UTC | #1
From: Netanel Belgazal <netanel@amazon.com>
Date: Sun, 8 Dec 2019 17:30:26 +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>

Bug fixes need to have an appropriate Fixes: tag.

Please repost with that added, thank you.
Belgazal, Netanel Dec. 10, 2019, 11:28 a.m. UTC | #2
I just did it.

Regards,
Netanel

´╗┐On 12/9/19, 8:35 PM, "David Miller" <davem@davemloft.net> wrote:

    From: Netanel Belgazal <netanel@amazon.com>
    Date: Sun, 8 Dec 2019 17:30:26 +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>
    
    Bug fixes need to have an appropriate Fixes: tag.
    
    Please repost with that added, thank you.

Patch
diff mbox series

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