Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 23 Feb 2012 16:47:05 +0000 (UTC)
From:      Rick Macklem <rmacklem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r232050 - head/sys/fs/nfsserver
Message-ID:  <201202231647.q1NGl51V013856@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rmacklem
Date: Thu Feb 23 16:47:05 2012
New Revision: 232050
URL: http://svn.freebsd.org/changeset/base/232050

Log:
  hrs@ reported a panic to freebsd-stable@ under the subject line
  "panic in 8.3-PRERELEASE" on Feb. 22, 2012. This panic was caused
  by use of a mix of tsleep() and msleep() calls on the same event
  in the new NFS server DRC code. It did "mtx_unlock(); tsleep();"
  in two places, which kib@ noted introduced a slight risk that the
  wakeup() would occur before the tsleep(), resulting in a 10sec
  delay before waking up. This patch fixes the problem by replacing
  "mtx_unlock(); tsleep();" with mtx_sleep(..PDROP..). It also
  changes a nfsmsleep() call to mtx_sleep() so that the code uses
  mtx_sleep() consistently within the file.
  
  Tested by:	hrs (in progress)
  Reviewed by:	jhb
  MFC after:	5 days

Modified:
  head/sys/fs/nfsserver/nfs_nfsdcache.c

Modified: head/sys/fs/nfsserver/nfs_nfsdcache.c
==============================================================================
--- head/sys/fs/nfsserver/nfs_nfsdcache.c	Thu Feb 23 14:35:56 2012	(r232049)
+++ head/sys/fs/nfsserver/nfs_nfsdcache.c	Thu Feb 23 16:47:05 2012	(r232050)
@@ -336,9 +336,8 @@ loop:
 		nfsaddr_match(NETFAMILY(rp), &rp->rc_haddr, nd->nd_nam)) {
 			if ((rp->rc_flag & RC_LOCKED) != 0) {
 				rp->rc_flag |= RC_WANTED;
-				NFSUNLOCKCACHE();
-				(void) tsleep((caddr_t)rp, PZERO - 1,
-				    "nfsrc", 10 * hz);
+				(void)mtx_sleep(rp, NFSCACHEMUTEXPTR,
+				    (PZERO - 1) | PDROP, "nfsrc", 10 * hz);
 				goto loop;
 			}
 			if (rp->rc_flag == 0)
@@ -622,8 +621,8 @@ tryagain:
 		rp = hitrp;
 		if ((rp->rc_flag & RC_LOCKED) != 0) {
 			rp->rc_flag |= RC_WANTED;
-			NFSUNLOCKCACHE();
-			(void) tsleep((caddr_t)rp, PZERO-1, "nfsrc", 10 * hz);
+			(void)mtx_sleep(rp, NFSCACHEMUTEXPTR,
+			    (PZERO - 1) | PDROP, "nfsrc", 10 * hz);
 			goto tryagain;
 		}
 		if (rp->rc_flag == 0)
@@ -694,7 +693,7 @@ nfsrc_lock(struct nfsrvcache *rp)
 	NFSCACHELOCKREQUIRED();
 	while ((rp->rc_flag & RC_LOCKED) != 0) {
 		rp->rc_flag |= RC_WANTED;
-		(void) nfsmsleep((caddr_t)rp, NFSCACHEMUTEXPTR, PZERO - 1,
+		(void)mtx_sleep(rp, NFSCACHEMUTEXPTR, PZERO - 1,
 		    "nfsrc", 0);
 	}
 	rp->rc_flag |= RC_LOCKED;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201202231647.q1NGl51V013856>