From owner-p4-projects@FreeBSD.ORG Mon May 10 16:23:47 2004 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 3429916A4D0; Mon, 10 May 2004 16:23:47 -0700 (PDT) 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 0FFC816A4CE for ; Mon, 10 May 2004 16:23:47 -0700 (PDT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id AB88343D5A for ; Mon, 10 May 2004 16:23:46 -0700 (PDT) (envelope-from julian@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.10/8.12.10) with ESMTP id i4ANNkGe031808 for ; Mon, 10 May 2004 16:23:46 -0700 (PDT) (envelope-from julian@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.10/8.12.10/Submit) id i4ANNkE5031805 for perforce@freebsd.org; Mon, 10 May 2004 16:23:46 -0700 (PDT) (envelope-from julian@freebsd.org) Date: Mon, 10 May 2004 16:23:46 -0700 (PDT) Message-Id: <200405102323.i4ANNkE5031805@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to julian@freebsd.org using -f From: Julian Elischer To: Perforce Change Reviews Subject: PERFORCE change 52646 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: Mon, 10 May 2004 23:23:47 -0000 http://perforce.freebsd.org/chv.cgi?CH=52646 Change 52646 by julian@julian_desk on 2004/05/10 16:23:03 finish IFC.. changes in parts of code that moved to a new file Affected files ... .. //depot/projects/nsched/sys/kern/kern_kse.c#5 edit Differences ... ==== //depot/projects/nsched/sys/kern/kern_kse.c#5 (text+ko) ==== @@ -327,9 +327,12 @@ PROC_LOCK(p); if (ku->ku_mflags & KMF_WAITSIGEVENT) { /* UTS wants to wait for signal event */ - if (!(p->p_flag & P_SIGEVENT) && !(ku->ku_flags & KUF_DOUPCALL)) + if (!(p->p_flag & P_SIGEVENT) && !(ku->ku_flags & KUF_DOUPCALL)) { + td->td_kflags |= TDK_KSERELSIG; error = msleep(&p->p_siglist, &p->p_mtx, PPAUSE|PCATCH, "ksesigwait", (uap->timeout ? tvtohz(&tv) : 0)); + td->td_kflags &= ~(TDK_KSERELSIG | TDK_WAKEUP); + } p->p_flag &= ~P_SIGEVENT; sigset = p->p_siglist; PROC_UNLOCK(p); @@ -338,9 +341,11 @@ } else { if (! kg->kg_completed && !(ku->ku_flags & KUF_DOUPCALL)) { kg->kg_upsleeps++; + td->td_kflags |= TDK_KSEREL; error = msleep(&kg->kg_completed, &p->p_mtx, PPAUSE|PCATCH, "kserel", (uap->timeout ? tvtohz(&tv) : 0)); + td->td_kflags &= ~(TDK_KSEREL | TDK_WAKEUP); kg->kg_upsleeps--; } PROC_UNLOCK(p); @@ -384,31 +389,36 @@ } else { kg = td->td_ksegrp; if (kg->kg_upsleeps) { + mtx_unlock_spin(&sched_lock); wakeup_one(&kg->kg_completed); - mtx_unlock_spin(&sched_lock); PROC_UNLOCK(p); return (0); } ku = TAILQ_FIRST(&kg->kg_upcalls); } - if (ku) { - if ((td2 = ku->ku_owner) == NULL) { - panic("%s: no owner", __func__); - } else if (TD_ON_SLEEPQ(td2) && (td2->td_flags & TDF_SINTR) && - ((td2->td_wchan == &kg->kg_completed) || - (td2->td_wchan == &p->p_siglist && - (ku->ku_mflags & KMF_WAITSIGEVENT)))) { - sleepq_abort(td2); - } else { - ku->ku_flags |= KUF_DOUPCALL; + if (ku == NULL) { + mtx_unlock_spin(&sched_lock); + PROC_UNLOCK(p); + return (ESRCH); + } + if ((td2 = ku->ku_owner) == NULL) { + mtx_unlock_spin(&sched_lock); + panic("%s: no owner", __func__); + } else if (td2->td_kflags & (TDK_KSEREL | TDK_KSERELSIG)) { + mtx_unlock_spin(&sched_lock); + if (!(td2->td_kflags & TDK_WAKEUP)) { + td2->td_kflags |= TDK_WAKEUP; + if (td2->td_kflags & TDK_KSEREL) + sleepq_remove(td2, &kg->kg_completed); + else + sleepq_remove(td2, &p->p_siglist); } + } else { + ku->ku_flags |= KUF_DOUPCALL; mtx_unlock_spin(&sched_lock); - PROC_UNLOCK(p); - return (0); } - mtx_unlock_spin(&sched_lock); PROC_UNLOCK(p); - return (ESRCH); + return (0); } /*