• Trond Myklebust's avatar
    SUNRPC: Fixup socket wait for memory · 13331a55
    Trond Myklebust authored
    We're seeing hangs in the NFS client code, with loops of the form:
    
     RPC: 30317 xmit incomplete (267368 left of 524448)
     RPC: 30317 call_status (status -11)
     RPC: 30317 call_transmit (status 0)
     RPC: 30317 xprt_prepare_transmit
     RPC: 30317 xprt_transmit(524448)
     RPC:       xs_tcp_send_request(267368) = -11
     RPC: 30317 xmit incomplete (267368 left of 524448)
     RPC: 30317 call_status (status -11)
     RPC: 30317 call_transmit (status 0)
     RPC: 30317 xprt_prepare_transmit
     RPC: 30317 xprt_transmit(524448)
    
    Turns out commit ceb5d58b ("net: fix sock_wake_async() rcu protection")
    moved SOCKWQ_ASYNC_NOSPACE out of sock->flags and into sk->sk_wq->flags,
    however it never tried to fix up the code in net/sunrpc.
    
    The new idiom is to use the flags in the RCU protected struct socket_wq.
    While we're at it, clear out the now redundant places where we set/clear
    SOCKWQ_ASYNC_NOSPACE and SOCK_NOSPACE. In principle, sk_stream_wait_memory()
    is supposed to set these for us, so we only need to clear them in the
    particular case of our ->write_space() callback.
    
    Fixes: ceb5d58b ("net: fix sock_wake_async() rcu protection")
    Cc: Eric Dumazet <edumazet@google.com>
    Cc: stable@vger.kernel.org # 4.4
    Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
    13331a55
xprtsock.c 83 KB