lkml.org 
[lkml]   [2020]   [May]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 258/312] sfc: clear napi_hash state when copying channels
    Date
    From: Bert Kenward <bkenward@solarflare.com>

    commit 46d054f8f540612f09987a53154aa39ae15f2e4c upstream.

    efx_copy_channel() doesn't correctly clear the napi_hash related state.
    This means that when napi_hash_add is called for that channel nothing is
    done, and we are left with a copy of the napi_hash_node from the old
    channel. When we later call napi_hash_del() on this channel we have a
    stale napi_hash_node.

    Corruption is only seen when there are multiple entries in one of the
    napi_hash lists. This is made more likely by having a very large number
    of channels. Testing was carried out with 512 channels - 32 channels on
    each of 16 ports.

    This failure typically appears as protection faults within napi_by_id()
    or napi_hash_add(). efx_copy_channel() is only used when tx or rx ring
    sizes are changed (ethtool -G).

    Fixes: 36763266bbe8 ("sfc: Add support for busy polling")
    Signed-off-by: Bert Kenward <bkenward@solarflare.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/net/ethernet/sfc/efx.c | 3 +++
    1 file changed, 3 insertions(+)

    --- a/drivers/net/ethernet/sfc/efx.c
    +++ b/drivers/net/ethernet/sfc/efx.c
    @@ -479,6 +479,9 @@ efx_copy_channel(const struct efx_channe
    *channel = *old_channel;

    channel->napi_dev = NULL;
    + INIT_HLIST_NODE(&channel->napi_str.napi_hash_node);
    + channel->napi_str.napi_id = 0;
    + channel->napi_str.state = 0;
    memset(&channel->eventq, 0, sizeof(channel->eventq));

    for (j = 0; j < EFX_TXQ_TYPES; j++) {

    \
     
     \ /
      Last update: 2020-05-08 14:48    [W:6.173 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site