lkml.org 
[lkml]   [2019]   [Dec]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.19 33/84] net: ena: fix napi handler misbehavior when the napi budget is zero
    Date
    From: Netanel Belgazal <netanel@amazon.com>

    [ 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: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/ethernet/amazon/ena/ena_netdev.c | 10 +++++++---
    1 file changed, 7 insertions(+), 3 deletions(-)

    diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c
    index b5d72815776c..e26c195fec83 100644
    --- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
    +++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
    @@ -1197,8 +1197,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;
    @@ -1215,7 +1215,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
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-12-27 18:45    [W:4.110 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site