Avoid starvation of the server crash recovery thread for the NFSv4 client.

This patch gives a requestor of the exclusive lock on the client state
in the NFSv4 client priority over shared lock requestors. This avoids
the server crash recovery thread being starved out by other threads doing
RPCs.

Tested by:	cperciva
PR:		216087
MFC after:	2 weeks
This commit is contained in:
rmacklem 2017-04-10 01:28:01 +00:00
parent ca4e7073d6
commit 7d21f54a26

View File

@ -797,8 +797,18 @@ nfscl_getcl(struct mount *mp, struct ucred *cred, NFSPROC_T *p,
(mp->mnt_kern_flag & MNTK_UNMOUNTF) == 0)
igotlock = nfsv4_lock(&clp->nfsc_lock, 1, NULL,
NFSCLSTATEMUTEXPTR, mp);
if (!igotlock)
if (igotlock == 0) {
/*
* Call nfsv4_lock() with "iwantlock == 0" so that it will
* wait for a pending exclusive lock request. This gives the
* exclusive lock request priority over this shared lock
* request.
* An exclusive lock on nfsc_lock is used mainly for server
* crash recoveries.
*/
nfsv4_lock(&clp->nfsc_lock, 0, NULL, NFSCLSTATEMUTEXPTR, mp);
nfsv4_getref(&clp->nfsc_lock, NULL, NFSCLSTATEMUTEXPTR, mp);
}
if (igotlock == 0 && (mp->mnt_kern_flag & MNTK_UNMOUNTF) != 0) {
/*
* Both nfsv4_lock() and nfsv4_getref() know to check