Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 14 Jul 2009 22:54:29 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r195703 - in head/sys: nfsclient rpc
Message-ID:  <200907142254.n6EMsT1C073749@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Tue Jul 14 22:54:29 2009
New Revision: 195703
URL: http://svn.freebsd.org/changeset/base/195703

Log:
  Use PBDRY flag for msleep(9) in NFS and NLM when sleeping thread owns
  kernel resources that block other threads, like vnode locks. The SIGSTOP
  sent to such thread (process, rather) shall not stop it until thread
  releases the resources.
  
  Tested by:	pho
  Reviewed by:	jhb
  Approved by:	re (kensmith)

Modified:
  head/sys/nfsclient/nfs_bio.c
  head/sys/nfsclient/nfs_vnops.c
  head/sys/nfsclient/nfsmount.h
  head/sys/rpc/clnt_rc.c
  head/sys/rpc/clnt_vc.c

Modified: head/sys/nfsclient/nfs_bio.c
==============================================================================
--- head/sys/nfsclient/nfs_bio.c	Tue Jul 14 22:52:46 2009	(r195702)
+++ head/sys/nfsclient/nfs_bio.c	Tue Jul 14 22:54:29 2009	(r195703)
@@ -1254,7 +1254,7 @@ nfs_getcacheblk(struct vnode *vp, daddr_
  		sigset_t oldset;
 
  		nfs_set_sigmask(td, &oldset);
-		bp = getblk(vp, bn, size, PCATCH, 0, 0);
+		bp = getblk(vp, bn, size, NFS_PCATCH, 0, 0);
  		nfs_restore_sigmask(td, &oldset);
 		while (bp == NULL) {
 			if (nfs_sigintr(nmp, td))
@@ -1291,7 +1291,7 @@ nfs_vinvalbuf(struct vnode *vp, int flag
 	if ((nmp->nm_flag & NFSMNT_INT) == 0)
 		intrflg = 0;
 	if (intrflg) {
-		slpflag = PCATCH;
+		slpflag = NFS_PCATCH;
 		slptimeo = 2 * hz;
 	} else {
 		slpflag = 0;
@@ -1370,7 +1370,7 @@ nfs_asyncio(struct nfsmount *nmp, struct
 	}
 again:
 	if (nmp->nm_flag & NFSMNT_INT)
-		slpflag = PCATCH;
+		slpflag = NFS_PCATCH;
 	gotiod = FALSE;
 
 	/*
@@ -1439,7 +1439,7 @@ again:
 					mtx_unlock(&nfs_iod_mtx);					
 					return (error2);
 				}
-				if (slpflag == PCATCH) {
+				if (slpflag == NFS_PCATCH) {
 					slpflag = 0;
 					slptimeo = 2 * hz;
 				}

Modified: head/sys/nfsclient/nfs_vnops.c
==============================================================================
--- head/sys/nfsclient/nfs_vnops.c	Tue Jul 14 22:52:46 2009	(r195702)
+++ head/sys/nfsclient/nfs_vnops.c	Tue Jul 14 22:54:29 2009	(r195703)
@@ -2934,7 +2934,7 @@ nfs_flush(struct vnode *vp, int waitfor,
 	int bvecsize = 0, bveccount;
 
 	if (nmp->nm_flag & NFSMNT_INT)
-		slpflag = PCATCH;
+		slpflag = NFS_PCATCH;
 	if (!commit)
 		passone = 0;
 	bo = &vp->v_bufobj;
@@ -3132,7 +3132,7 @@ loop:
 				error = EINTR;
 				goto done;
 			}
-			if (slpflag == PCATCH) {
+			if (slpflag & PCATCH) {
 				slpflag = 0;
 				slptimeo = 2 * hz;
 			}
@@ -3170,7 +3170,7 @@ loop:
 			    error = nfs_sigintr(nmp, td);
 			    if (error)
 				goto done;
-			    if (slpflag == PCATCH) {
+			    if (slpflag & PCATCH) {
 				slpflag = 0;
 				slptimeo = 2 * hz;
 			    }

Modified: head/sys/nfsclient/nfsmount.h
==============================================================================
--- head/sys/nfsclient/nfsmount.h	Tue Jul 14 22:52:46 2009	(r195702)
+++ head/sys/nfsclient/nfsmount.h	Tue Jul 14 22:54:29 2009	(r195703)
@@ -107,6 +107,8 @@ struct	nfsmount {
 #define NFS_TPRINTF_DELAY               30
 #endif
 
+#define	NFS_PCATCH	(PCATCH | PBDRY)
+
 #endif
 
 #endif

Modified: head/sys/rpc/clnt_rc.c
==============================================================================
--- head/sys/rpc/clnt_rc.c	Tue Jul 14 22:52:46 2009	(r195702)
+++ head/sys/rpc/clnt_rc.c	Tue Jul 14 22:54:29 2009	(r195703)
@@ -264,7 +264,8 @@ clnt_reconnect_call(
 			stat = clnt_reconnect_connect(cl);
 			if (stat == RPC_SYSTEMERROR) {
 				error = tsleep(&fake_wchan,
-				    rc->rc_intr ? PCATCH : 0, "rpccon", hz);
+				    rc->rc_intr ? PCATCH | PBDRY : 0, "rpccon",
+				    hz);
 				if (error == EINTR || error == ERESTART)
 					return (RPC_INTR);
 				tries++;

Modified: head/sys/rpc/clnt_vc.c
==============================================================================
--- head/sys/rpc/clnt_vc.c	Tue Jul 14 22:52:46 2009	(r195702)
+++ head/sys/rpc/clnt_vc.c	Tue Jul 14 22:54:29 2009	(r195703)
@@ -196,7 +196,7 @@ clnt_vc_create(
 		while ((so->so_state & SS_ISCONNECTING)
 		    && so->so_error == 0) {
 			error = msleep(&so->so_timeo, SOCK_MTX(so),
-			    PSOCK | PCATCH, "connec", 0);
+			    PSOCK | PCATCH | PBDRY, "connec", 0);
 			if (error) {
 				if (error == EINTR || error == ERESTART)
 					interrupted = 1;
@@ -477,6 +477,7 @@ call_again:
 		errp->re_errno = error;
 		switch (error) {
 		case EINTR:
+		case ERESTART:
 			stat = RPC_INTR;
 			break;
 		case EWOULDBLOCK:
@@ -709,7 +710,7 @@ clnt_vc_control(CLIENT *cl, u_int reques
 
 	case CLSET_INTERRUPTIBLE:
 		if (*(int *) info)
-			ct->ct_waitflag = PCATCH;
+			ct->ct_waitflag = PCATCH | PBDRY;
 		else
 			ct->ct_waitflag = 0;
 		break;



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