lkml.org 
[lkml]   [2019]   [Sep]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.2 105/124] net: aquantia: fix out of memory condition on rx side
    Date
    From: Dmitry Bogdanov <dmitry.bogdanov@aquantia.com>

    [ Upstream commit be6cef69ba570ebb327eba1ef6438f7af49aaf86 ]

    On embedded environments with hard memory limits it is a normal although
    rare case when skb can't be allocated on rx part under high traffic.

    In such OOM cases napi_complete_done() was not called.
    So the napi object became in an invalid state like it is "scheduled".
    Kernel do not re-schedules the poll of that napi object.

    Consequently, kernel can not remove that object the system hangs on
    `ifconfig down` waiting for a poll.

    We are fixing this by gracefully closing napi poll routine with correct
    invocation of napi_complete_done.

    This was reproduced with artificially failing the allocation of skb to
    simulate an "out of memory" error case and check that traffic does
    not get stuck.

    Fixes: 970a2e9864b0 ("net: ethernet: aquantia: Vector operations")
    Signed-off-by: Igor Russkikh <igor.russkikh@aquantia.com>
    Signed-off-by: Dmitry Bogdanov <dmitry.bogdanov@aquantia.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/ethernet/aquantia/atlantic/aq_vec.c | 3 ++-
    1 file changed, 2 insertions(+), 1 deletion(-)

    diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_vec.c b/drivers/net/ethernet/aquantia/atlantic/aq_vec.c
    index 715685aa48c39..28892b8acd0e1 100644
    --- a/drivers/net/ethernet/aquantia/atlantic/aq_vec.c
    +++ b/drivers/net/ethernet/aquantia/atlantic/aq_vec.c
    @@ -86,6 +86,7 @@ static int aq_vec_poll(struct napi_struct *napi, int budget)
    }
    }

    +err_exit:
    if (!was_tx_cleaned)
    work_done = budget;

    @@ -95,7 +96,7 @@ static int aq_vec_poll(struct napi_struct *napi, int budget)
    1U << self->aq_ring_param.vec_idx);
    }
    }
    -err_exit:
    +
    return work_done;
    }

    --
    2.20.1


    \
     
     \ /
      Last update: 2019-09-20 00:34    [W:2.505 / U:0.336 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site