• Chuck Lever's avatar
    sunrpc: Prevent duplicate XID allocation · 0dae72d5
    Chuck Lever authored
    Krzysztof Kozlowski <krzk@kernel.org> reports that a heavy NFSv4
    WRITE workload against a slow NFS server causes his Raspberry Pi
    clients to stall. Krzysztof bisected it to commit 37ac86c3
    ("SUNRPC: Initialize rpc_rqst outside of xprt->reserve_lock") .
    
    I was able to reproduce similar behavior and it appears that rarely
    the RPC client layer is re-allocating an XID for an RPC that it has
    already partially sent. This results in the client ignoring the
    subsequent reply, which carries the original XID.
    
    For various reasons, checking !req->rq_xmit_bytes_sent in
    xprt_prepare_transmit is not a 100% reliable mechanism for
    determining when a fresh XID is needed.
    
    Trond's preference is to allocate the XID at the time each rpc_rqst
    slot is initialized.
    
    This patch should also address a gcc 4.1.2 complaint reported by
    Geert Uytterhoeven <geert@linux-m68k.org>.
    Reported-by: default avatarKrzysztof Kozlowski <krzk@kernel.org>
    Fixes: 37ac86c3 ("SUNRPC: Initialize rpc_rqst outside of ... ")
    Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    Tested-by: default avatarKrzysztof Kozlowski <krzk@kernel.org>
    Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
    0dae72d5
xprt.c 40.2 KB