• Chuck Lever's avatar
    NFS: Fix direct WRITE throughput regression · ba838a75
    Chuck Lever authored
    I measured a 50% throughput regression for large direct writes.
    
    The observed on-the-wire behavior is that the client sends every
    NFS WRITE twice: once as an UNSTABLE WRITE plus a COMMIT, and once
    as a FILE_SYNC WRITE.
    
    This is because the nfs_write_match_verf() check in
    nfs_direct_commit_complete() fails for every WRITE.
    
    Buffered writes use nfs_write_completion(), which sets req->wb_verf
    correctly. Direct writes use nfs_direct_write_completion(), which
    does not set req->wb_verf at all. This leaves req->wb_verf set to
    all zeroes for every direct WRITE, and thus
    nfs_direct_commit_completion() always sets NFS_ODIRECT_RESCHED_WRITES.
    
    This fix appears to restore nearly all of the lost performance.
    
    Fixes: 1f28476d ("NFS: Fix O_DIRECT commit verifier handling")
    Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
    ba838a75
direct.c 26.4 KB