PERFORCE change 145787 for review

Ed Schouten ed at FreeBSD.org
Thu Jul 24 10:53:26 UTC 2008


http://perforce.freebsd.org/chv.cgi?CH=145787

Change 145787 by ed at ed_dull on 2008/07/24 10:52:33

	Fixed to tty_wait() and tty_timedwait():
	
	- Make sure the TTY's lock has not been recursed yet. When a TTY
	  uses a lock that may be recursed, we cannot safely cv_wait()
	  on it.
	
	- Also add our Giant-workaround to tty_timedwait().

Affected files ...

.. //depot/projects/mpsafetty/sys/kern/tty.c#5 edit

Differences ...

==== //depot/projects/mpsafetty/sys/kern/tty.c#5 (text+ko) ====

@@ -1166,12 +1166,10 @@
 tty_wait(struct tty *tp, struct cv *cv)
 {
 	int error;
-	int revokecnt;
+	int revokecnt = tp->t_revokecnt;
 
-	tty_lock_assert(tp, MA_OWNED);
+	tty_lock_assert(tp, MA_OWNED|MA_NOTRECURSED);
 
-	/* Restart the system call when we may have been revoked */
-	revokecnt = tp->t_revokecnt;
 	if (tp->t_mtx == &Giant) {
 		/*
 		 * XXX: condvar(9) doesn't allow Giant to be passed as
@@ -1184,6 +1182,8 @@
 	} else {
 		error = cv_wait_sig(cv, tp->t_mtx);
 	}
+
+	/* Restart the system call when we may have been revoked */
 	if (tp->t_revokecnt != revokecnt)
 		return (ERESTART);
 	
@@ -1198,13 +1198,25 @@
 tty_timedwait(struct tty *tp, struct cv *cv, int hz)
 {
 	int error;
-	int revokecnt;
+	int revokecnt = tp->t_revokecnt;
+
+	tty_lock_assert(tp, MA_OWNED|MA_NOTRECURSED);
 
-	tty_lock_assert(tp, MA_OWNED);
+	error = cv_timedwait_sig(cv, tp->t_mtx, hz);
+	if (tp->t_mtx == &Giant) {
+		/*
+		 * XXX: condvar(9) doesn't allow Giant to be passed as
+		 * its mutex. Because we don't use the per-TTY mutex
+		 * here, temporarily abuse it to make condvar(9) work.
+		 */
+		mtx_lock(&tp->t_mtxobj);
+		error = cv_timedwait_sig(cv, &tp->t_mtxobj, hz);
+		mtx_unlock(&tp->t_mtxobj);
+	} else {
+		error = cv_timedwait_sig(cv, tp->t_mtx, hz);
+	}
 
 	/* Restart the system call when we may have been revoked */
-	revokecnt = tp->t_revokecnt;
-	error = cv_timedwait_sig(cv, tp->t_mtx, hz);
 	if (tp->t_revokecnt != revokecnt)
 		return (ERESTART);
 	


More information about the p4-projects mailing list