From owner-p4-projects@FreeBSD.ORG Thu Jul 24 10:53:26 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 559451065681; Thu, 24 Jul 2008 10:53:26 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 193CB106567E for ; Thu, 24 Jul 2008 10:53:26 +0000 (UTC) (envelope-from ed@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id E76398FC18 for ; Thu, 24 Jul 2008 10:53:25 +0000 (UTC) (envelope-from ed@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.2/8.14.2) with ESMTP id m6OArP3L029845 for ; Thu, 24 Jul 2008 10:53:25 GMT (envelope-from ed@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.2/8.14.1/Submit) id m6OArPwN029843 for perforce@freebsd.org; Thu, 24 Jul 2008 10:53:25 GMT (envelope-from ed@FreeBSD.org) Date: Thu, 24 Jul 2008 10:53:25 GMT Message-Id: <200807241053.m6OArPwN029843@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to ed@FreeBSD.org using -f From: Ed Schouten To: Perforce Change Reviews Cc: Subject: PERFORCE change 145787 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 24 Jul 2008 10:53:26 -0000 http://perforce.freebsd.org/chv.cgi?CH=145787 Change 145787 by ed@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);