svn commit: r316669 - head/sys/fs/nfsclient

Rick Macklem rmacklem at FreeBSD.org
Mon Apr 10 01:28:02 UTC 2017


Author: rmacklem
Date: Mon Apr 10 01:28:01 2017
New Revision: 316669
URL: https://svnweb.freebsd.org/changeset/base/316669

Log:
  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

Modified:
  head/sys/fs/nfsclient/nfs_clstate.c

Modified: head/sys/fs/nfsclient/nfs_clstate.c
==============================================================================
--- head/sys/fs/nfsclient/nfs_clstate.c	Mon Apr 10 01:26:12 2017	(r316668)
+++ head/sys/fs/nfsclient/nfs_clstate.c	Mon Apr 10 01:28:01 2017	(r316669)
@@ -797,8 +797,18 @@ nfscl_getcl(struct mount *mp, struct ucr
 	    (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


More information about the svn-src-head mailing list