From owner-svn-src-head@FreeBSD.ORG Tue Aug 17 21:34:19 2010 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 83A431065673; Tue, 17 Aug 2010 21:34:19 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 58F7B8FC13; Tue, 17 Aug 2010 21:34:19 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o7HLYJKj046562; Tue, 17 Aug 2010 21:34:19 GMT (envelope-from jhb@svn.freebsd.org) Received: (from jhb@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o7HLYJ7A046560; Tue, 17 Aug 2010 21:34:19 GMT (envelope-from jhb@svn.freebsd.org) Message-Id: <201008172134.o7HLYJ7A046560@svn.freebsd.org> From: John Baldwin Date: Tue, 17 Aug 2010 21:34:19 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r211439 - head/sys/kern X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 17 Aug 2010 21:34:19 -0000 Author: jhb Date: Tue Aug 17 21:34:19 2010 New Revision: 211439 URL: http://svn.freebsd.org/changeset/base/211439 Log: Keep the process locked when calling ktrops() or ktrsetchildren() instead of dropping the lock only to immediately reacquire it. Modified: head/sys/kern/kern_ktrace.c Modified: head/sys/kern/kern_ktrace.c ============================================================================== --- head/sys/kern/kern_ktrace.c Tue Aug 17 21:28:40 2010 (r211438) +++ head/sys/kern/kern_ktrace.c Tue Aug 17 21:34:19 2010 (r211439) @@ -741,7 +741,6 @@ ktrace(td, uap) PROC_UNLOCK(p); continue; } - PROC_UNLOCK(p); nfound++; if (descend) ret |= ktrsetchildren(td, p, ops, facs, vp); @@ -758,18 +757,13 @@ ktrace(td, uap) * by pid */ p = pfind(uap->pid); - if (p == NULL) { - sx_sunlock(&proctree_lock); + if (p == NULL) error = ESRCH; - goto done; - } - error = p_cansee(td, p); - /* - * The slock of the proctree lock will keep this process - * from going away, so unlocking the proc here is ok. - */ - PROC_UNLOCK(p); + else + error = p_cansee(td, p); if (error) { + if (p != NULL) + PROC_UNLOCK(p); sx_sunlock(&proctree_lock); goto done; } @@ -841,11 +835,16 @@ ktrops(td, p, ops, facs, vp) struct vnode *tracevp = NULL; struct ucred *tracecred = NULL; - PROC_LOCK(p); + PROC_LOCK_ASSERT(p, MA_OWNED); if (!ktrcanset(td, p)) { PROC_UNLOCK(p); return (0); } + if (p->p_flag & P_WEXIT) { + /* If the process is exiting, just ignore it. */ + PROC_UNLOCK(p); + return (1); + } mtx_lock(&ktrace_mtx); if (ops == KTROP_SET) { if (p->p_tracevp != vp) { @@ -900,6 +899,7 @@ ktrsetchildren(td, top, ops, facs, vp) register int ret = 0; p = top; + PROC_LOCK_ASSERT(p, MA_OWNED); sx_assert(&proctree_lock, SX_LOCKED); for (;;) { ret |= ktrops(td, p, ops, facs, vp); @@ -919,6 +919,7 @@ ktrsetchildren(td, top, ops, facs, vp) } p = p->p_pptr; } + PROC_LOCK(p); } /*NOTREACHED*/ }