From owner-p4-projects@FreeBSD.ORG Sun Jul 18 13:23:15 2004 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 6EC1816A4D0; Sun, 18 Jul 2004 13:23:15 +0000 (GMT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 325A616A4CE for ; Sun, 18 Jul 2004 13:23:15 +0000 (GMT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 1A15D43D55 for ; Sun, 18 Jul 2004 13:23:15 +0000 (GMT) (envelope-from davidxu@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.11/8.12.11) with ESMTP id i6IDNE9v089972 for ; Sun, 18 Jul 2004 13:23:15 GMT (envelope-from davidxu@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.11/8.12.11/Submit) id i6IDNEea089969 for perforce@freebsd.org; Sun, 18 Jul 2004 13:23:14 GMT (envelope-from davidxu@freebsd.org) Date: Sun, 18 Jul 2004 13:23:14 GMT Message-Id: <200407181323.i6IDNEea089969@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to davidxu@freebsd.org using -f From: David Xu To: Perforce Change Reviews Subject: PERFORCE change 57626 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 18 Jul 2004 13:23:16 -0000 http://perforce.freebsd.org/chv.cgi?CH=57626 Change 57626 by davidxu@davidxu_alona on 2004/07/18 13:22:44 Refine code ptracestop. Don't schdule upcall in trapsignal if the signal is a debug signal and we are being debugged, this allows debugger to resume and single step the thread without going into UTS which maybe be blocked by schedule lock or other blockable objects. Affected files ... .. //depot/projects/davidxu_ksedbg/src/sys/kern/kern_sig.c#12 edit Differences ... ==== //depot/projects/davidxu_ksedbg/src/sys/kern/kern_sig.c#12 (text+ko) ==== @@ -1484,24 +1484,13 @@ p = td->td_proc; if (td->td_pflags & TDP_SA) { - if (td->td_mailbox == NULL) - thread_user_enter(p, td); - if ((p->p_flag & P_TRACED) && (sig == SIGTRAP)) { - mtx_lock_spin(&sched_lock); - td->td_flags &= ~TDF_CAN_UNBIND; - mtx_unlock_spin(&sched_lock); + /* Don't upcall if it is debug signal */ + if (!((p->p_flag & P_TRACED) && (sig == SIGTRAP))) { + if (td->td_mailbox == NULL) + thread_user_enter(p, td); } PROC_LOCK(p); SIGDELSET(td->td_sigmask, sig); - mtx_lock_spin(&sched_lock); - /* - * Force scheduling an upcall, so UTS has chance to - * process the signal before thread runs again in - * userland. - */ - if (td->td_upcall) - td->td_upcall->ku_flags |= KUF_DOUPCALL; - mtx_unlock_spin(&sched_lock); } else { PROC_LOCK(p); } @@ -2016,13 +2005,8 @@ td->td_flags |= TDF_XSIG; mtx_unlock_spin(&sched_lock); td->td_xsig = sig; - while ((p->p_flag & P_TRACED) && (td->td_flags & TDF_XSIG)) { - if (p->p_flag & P_SINGLE_EXIT) { - mtx_lock_spin(&sched_lock); - td->td_flags &= ~TDF_XSIG; - mtx_unlock_spin(&sched_lock); - return (sig); - } + while (!(p->p_flag & P_SINGLE_EXIT) && (p->p_flag & P_TRACED) + && (td->td_flags & TDF_XSIG)) { /* * Just make wait() to work, the last stopped thread * will win. @@ -2049,15 +2033,18 @@ mtx_unlock_spin(&sched_lock); PICKUP_GIANT(); PROC_LOCK(p); - if (!(p->p_flag & P_TRACED)) + if ((p->p_flag & P_SINGLE_EXIT) || !(p->p_flag & P_TRACED)) break; if (td->td_flags & TDF_DBSUSPEND) { - if (p->p_flag & P_SINGLE_EXIT) - break; mtx_lock_spin(&sched_lock); goto stopme; } } + if (td->td_flags & TDF_XSIG) { + mtx_lock_spin(&sched_lock); + td->td_flags &= ~TDF_XSIG; + mtx_unlock_spin(&sched_lock); + } return (td->td_xsig); } @@ -2111,8 +2098,10 @@ */ if (SIGISMEMBER(ps->ps_sigignore, sig) && (traced == 0)) { SIGDELSET(td->td_siglist, sig); - if (td->td_pflags & TDP_SA) + if (td->td_pflags & TDP_SA) { SIGADDSET(td->td_sigmask, sig); + SIG_CANTMASK(td->td_sigmask); + } continue; } if (p->p_flag & P_TRACED && (p->p_flag & P_PPWAIT) == 0) { @@ -2129,8 +2118,10 @@ * otherwise we just look for signals again. */ SIGDELSET(td->td_siglist, sig); /* clear old signal */ - if (td->td_pflags & TDP_SA) + if (td->td_pflags & TDP_SA) { SIGADDSET(td->td_sigmask, sig); + SIG_CANTMASK(td->td_sigmask); + } if (newsig == 0) continue; sig = newsig; @@ -2281,8 +2272,8 @@ n++; if ((p->p_flag & P_STOPPED_SIG) && (n == p->p_numthreads)) { mtx_unlock_spin(&sched_lock); + PROC_LOCK(p->p_pptr); stop(p); - PROC_LOCK(p->p_pptr); ps = p->p_pptr->p_sigacts; mtx_lock(&ps->ps_mtx); if ((ps->ps_flag & PS_NOCLDSTOP) == 0) {