lkml.org 
[lkml]   [2021]   [Jul]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.12 214/292] nfsd: Reduce contention for the nfsd_file nf_rwsem
    Date
    From: Trond Myklebust <trond.myklebust@hammerspace.com>

    [ Upstream commit 474bc334698df98ce07c890f1898c7e7f389b0c7 ]

    When flushing out the unstable file writes as part of a COMMIT call, try
    to perform most of of the data writes and waits outside the semaphore.

    This means that if the client is sending the COMMIT as part of a memory
    reclaim operation, then it can continue performing I/O, with contention
    for the lock occurring only once the data sync is finished.

    Fixes: 5011af4c698a ("nfsd: Fix stable writes")
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Tested-by: Chuck Lever <chuck.lever@oracle.com>
    Signed-off-by: J. Bruce Fields <bfields@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/nfsd/vfs.c | 18 ++++++++++++++++--
    1 file changed, 16 insertions(+), 2 deletions(-)

    diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
    index fd6be35a1642..f83a1d122505 100644
    --- a/fs/nfsd/vfs.c
    +++ b/fs/nfsd/vfs.c
    @@ -1123,6 +1123,19 @@ out:
    }

    #ifdef CONFIG_NFSD_V3
    +static int
    +nfsd_filemap_write_and_wait_range(struct nfsd_file *nf, loff_t offset,
    + loff_t end)
    +{
    + struct address_space *mapping = nf->nf_file->f_mapping;
    + int ret = filemap_fdatawrite_range(mapping, offset, end);
    +
    + if (ret)
    + return ret;
    + filemap_fdatawait_range_keep_errors(mapping, offset, end);
    + return 0;
    +}
    +
    /*
    * Commit all pending writes to stable storage.
    *
    @@ -1153,10 +1166,11 @@ nfsd_commit(struct svc_rqst *rqstp, struct svc_fh *fhp,
    if (err)
    goto out;
    if (EX_ISSYNC(fhp->fh_export)) {
    - int err2;
    + int err2 = nfsd_filemap_write_and_wait_range(nf, offset, end);

    down_write(&nf->nf_rwsem);
    - err2 = vfs_fsync_range(nf->nf_file, offset, end, 0);
    + if (!err2)
    + err2 = vfs_fsync_range(nf->nf_file, offset, end, 0);
    switch (err2) {
    case 0:
    nfsd_copy_boot_verifier(verf, net_generic(nf->nf_net,
    --
    2.30.2


    \
     
     \ /
      Last update: 2021-07-19 20:41    [W:4.162 / U:0.532 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site