• Wei Wang's avatar
    net: fix race between napi kthread mode and busy poll · cb038357
    Wei Wang authored
    Currently, napi_thread_wait() checks for NAPI_STATE_SCHED bit to
    determine if the kthread owns this napi and could call napi->poll() on
    it. However, if socket busy poll is enabled, it is possible that the
    busy poll thread grabs this SCHED bit (after the previous napi->poll()
    invokes napi_complete_done() and clears SCHED bit) and tries to poll
    on the same napi. napi_disable() could grab the SCHED bit as well.
    This patch tries to fix this race by adding a new bit
    NAPI_STATE_SCHED_THREADED in napi->state. This bit gets set in
    ____napi_schedule() if the threaded mode is enabled, and gets cleared
    in napi_complete_done(), and we only poll the napi in kthread if this
    bit is set. This helps distinguish the ownership of the napi between
    kthread and other scenarios and fixes the race issue.
    
    Fixes: 29863d41 ("net: implement threaded-able napi poll loop support")
    Reported-by: default avatarMartin Zaharinov <micron10@gmail.com>
    Suggested-by: default avatarJakub Kicinski <kuba@kernel.org>
    Signed-off-by: default avatarWei Wang <weiwan@google.com>
    Cc: Alexander Duyck <alexanderduyck@fb.com>
    Cc: Eric Dumazet <edumazet@google.com>
    Cc: Paolo Abeni <pabeni@redhat.com>
    Cc: Hannes Frederic Sowa <hannes@stressinduktion.org>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    cb038357
dev.c 287 KB