lkml.org 
[lkml]   [2022]   [Apr]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.16 0065/1017] SUNRPC: avoid race between mod_timer() and del_timer_sync()
    Date
    From: NeilBrown <neilb@suse.de>

    commit 3848e96edf4788f772d83990022fa7023a233d83 upstream.

    xprt_destory() claims XPRT_LOCKED and then calls del_timer_sync().
    Both xprt_unlock_connect() and xprt_release() call
    ->release_xprt()
    which drops XPRT_LOCKED and *then* xprt_schedule_autodisconnect()
    which calls mod_timer().

    This may result in mod_timer() being called *after* del_timer_sync().
    When this happens, the timer may fire long after the xprt has been freed,
    and run_timer_softirq() will probably crash.

    The pairing of ->release_xprt() and xprt_schedule_autodisconnect() is
    always called under ->transport_lock. So if we take ->transport_lock to
    call del_timer_sync(), we can be sure that mod_timer() will run first
    (if it runs at all).

    Cc: stable@vger.kernel.org
    Signed-off-by: NeilBrown <neilb@suse.de>
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    net/sunrpc/xprt.c | 7 +++++++
    1 file changed, 7 insertions(+)

    --- a/net/sunrpc/xprt.c
    +++ b/net/sunrpc/xprt.c
    @@ -2112,7 +2112,14 @@ static void xprt_destroy(struct rpc_xprt
    */
    wait_on_bit_lock(&xprt->state, XPRT_LOCKED, TASK_UNINTERRUPTIBLE);

    + /*
    + * xprt_schedule_autodisconnect() can run after XPRT_LOCKED
    + * is cleared. We use ->transport_lock to ensure the mod_timer()
    + * can only run *before* del_time_sync(), never after.
    + */
    + spin_lock(&xprt->transport_lock);
    del_timer_sync(&xprt->timer);
    + spin_unlock(&xprt->transport_lock);

    /*
    * Destroy sockets etc from the system workqueue so they can

    \
     
     \ /
      Last update: 2022-04-05 14:29    [W:2.703 / U:1.476 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site