svn commit: r326952 - stable/11/sys/fs/nfsserver
Rick Macklem
rmacklem at FreeBSD.org
Mon Dec 18 22:55:21 UTC 2017
Author: rmacklem
Date: Mon Dec 18 22:55:19 2017
New Revision: 326952
URL: https://svnweb.freebsd.org/changeset/base/326952
Log:
MFC: r326544
Avoid the overhead of acquiring a lock in nfsrv_checkgetattr() when
there are no write delegations issued.
manu@ reported on the freebsd-current@ mailing list that there was
a significant performance hit in nfsrv_checkgetattr() caused by
the acquisition/release of a state lock, even when there were no
write delegations issued.
This patch add a count of outstanding issued write delegations to the
NFSv4 server. This count allows nfsrv_checkgetattr() to return without
acquiring any lock when the count is 0, avoiding the performance hit
for the case where no write delegations are issued.
Modified:
stable/11/sys/fs/nfsserver/nfs_nfsdstate.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/fs/nfsserver/nfs_nfsdstate.c
==============================================================================
--- stable/11/sys/fs/nfsserver/nfs_nfsdstate.c Mon Dec 18 20:17:54 2017 (r326951)
+++ stable/11/sys/fs/nfsserver/nfs_nfsdstate.c Mon Dec 18 22:55:19 2017 (r326952)
@@ -93,6 +93,7 @@ static time_t nfsrvboottime;
static int nfsrv_returnoldstateid = 0, nfsrv_clients = 0;
static int nfsrv_clienthighwater = NFSRV_CLIENTHIGHWATER;
static int nfsrv_nogsscallback = 0;
+static volatile int nfsrv_writedelegcnt = 0;
/* local functions */
static void nfsrv_dumpaclient(struct nfsclient *clp,
@@ -1261,6 +1262,8 @@ nfsrv_freedeleg(struct nfsstate *stp)
LIST_REMOVE(stp, ls_hash);
LIST_REMOVE(stp, ls_list);
LIST_REMOVE(stp, ls_file);
+ if ((stp->ls_flags & NFSLCK_DELEGWRITE) != 0)
+ nfsrv_writedelegcnt--;
lfp = stp->ls_lfp;
if (LIST_EMPTY(&lfp->lf_open) &&
LIST_EMPTY(&lfp->lf_lock) && LIST_EMPTY(&lfp->lf_deleg) &&
@@ -2905,6 +2908,7 @@ tryagain:
new_deleg->ls_flags = (NFSLCK_DELEGWRITE |
NFSLCK_READACCESS | NFSLCK_WRITEACCESS);
*rflagsp |= NFSV4OPEN_WRITEDELEGATE;
+ nfsrv_writedelegcnt++;
} else {
new_deleg->ls_flags = (NFSLCK_DELEGREAD |
NFSLCK_READACCESS);
@@ -3035,6 +3039,7 @@ tryagain:
new_deleg->ls_clp = clp;
new_deleg->ls_filerev = filerev;
new_deleg->ls_compref = nd->nd_compref;
+ nfsrv_writedelegcnt++;
LIST_INSERT_HEAD(&lfp->lf_deleg, new_deleg, ls_file);
LIST_INSERT_HEAD(NFSSTATEHASH(clp,
new_deleg->ls_stateid), new_deleg, ls_hash);
@@ -3092,6 +3097,7 @@ tryagain:
new_deleg->ls_flags = (NFSLCK_DELEGWRITE |
NFSLCK_READACCESS | NFSLCK_WRITEACCESS);
*rflagsp |= NFSV4OPEN_WRITEDELEGATE;
+ nfsrv_writedelegcnt++;
} else {
new_deleg->ls_flags = (NFSLCK_DELEGREAD |
NFSLCK_READACCESS);
@@ -3168,6 +3174,7 @@ tryagain:
NFSLCK_READACCESS |
NFSLCK_WRITEACCESS);
*rflagsp |= NFSV4OPEN_WRITEDELEGATE;
+ nfsrv_writedelegcnt++;
} else {
new_deleg->ls_flags =
(NFSLCK_DELEGREAD |
@@ -5297,6 +5304,8 @@ nfsrv_checkgetattr(struct nfsrv_descript *nd, vnode_t
NFSCBGETATTR_ATTRBIT(attrbitp, &cbbits);
if (!NFSNONZERO_ATTRBIT(&cbbits))
+ goto out;
+ if (nfsrv_writedelegcnt == 0)
goto out;
/*
More information about the svn-src-stable
mailing list