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. Reported by: manu Reviewed by: kib MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D13327
This commit is contained in:
parent
eb1eebb9aa
commit
b07bc39a23
@ -95,6 +95,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,
|
||||
@ -1263,6 +1264,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) &&
|
||||
@ -2907,6 +2910,7 @@ nfsrv_openctrl(struct nfsrv_descript *nd, vnode_t vp,
|
||||
new_deleg->ls_flags = (NFSLCK_DELEGWRITE |
|
||||
NFSLCK_READACCESS | NFSLCK_WRITEACCESS);
|
||||
*rflagsp |= NFSV4OPEN_WRITEDELEGATE;
|
||||
nfsrv_writedelegcnt++;
|
||||
} else {
|
||||
new_deleg->ls_flags = (NFSLCK_DELEGREAD |
|
||||
NFSLCK_READACCESS);
|
||||
@ -3037,6 +3041,7 @@ nfsrv_openctrl(struct nfsrv_descript *nd, vnode_t vp,
|
||||
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);
|
||||
@ -3094,6 +3099,7 @@ nfsrv_openctrl(struct nfsrv_descript *nd, vnode_t vp,
|
||||
new_deleg->ls_flags = (NFSLCK_DELEGWRITE |
|
||||
NFSLCK_READACCESS | NFSLCK_WRITEACCESS);
|
||||
*rflagsp |= NFSV4OPEN_WRITEDELEGATE;
|
||||
nfsrv_writedelegcnt++;
|
||||
} else {
|
||||
new_deleg->ls_flags = (NFSLCK_DELEGREAD |
|
||||
NFSLCK_READACCESS);
|
||||
@ -3170,6 +3176,7 @@ nfsrv_openctrl(struct nfsrv_descript *nd, vnode_t vp,
|
||||
NFSLCK_READACCESS |
|
||||
NFSLCK_WRITEACCESS);
|
||||
*rflagsp |= NFSV4OPEN_WRITEDELEGATE;
|
||||
nfsrv_writedelegcnt++;
|
||||
} else {
|
||||
new_deleg->ls_flags =
|
||||
(NFSLCK_DELEGREAD |
|
||||
@ -5300,6 +5307,8 @@ nfsrv_checkgetattr(struct nfsrv_descript *nd, vnode_t vp,
|
||||
NFSCBGETATTR_ATTRBIT(attrbitp, &cbbits);
|
||||
if (!NFSNONZERO_ATTRBIT(&cbbits))
|
||||
goto out;
|
||||
if (nfsrv_writedelegcnt == 0)
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* Get the lock file structure.
|
||||
|
Loading…
Reference in New Issue
Block a user