From owner-p4-projects@FreeBSD.ORG Mon May 10 16:05:20 2004 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id C5AE416A4D0; Mon, 10 May 2004 16:05:19 -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 8205116A4CE for ; Mon, 10 May 2004 16:05:19 -0700 (PDT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id D108B43D5D for ; Mon, 10 May 2004 16:05:18 -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 i4AN5IGe027809 for ; Mon, 10 May 2004 16:05:18 -0700 (PDT) (envelope-from julian@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.10/8.12.10/Submit) id i4AN5IVL027806 for perforce@freebsd.org; Mon, 10 May 2004 16:05:18 -0700 (PDT) (envelope-from julian@freebsd.org) Date: Mon, 10 May 2004 16:05:18 -0700 (PDT) Message-Id: <200405102305.i4AN5IVL027806@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 52643 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:05:20 -0000 http://perforce.freebsd.org/chv.cgi?CH=52643 Change 52643 by julian@julian_ref on 2004/05/10 16:05:05 try not crash in boot. Affected files ... .. //depot/projects/nsched/sys/i386/i386/mp_machdep.c#2 edit .. //depot/projects/nsched/sys/kern/kern_exit.c#5 edit .. //depot/projects/nsched/sys/kern/kern_thread.c#12 edit .. //depot/projects/nsched/sys/kern/sched_4bsd.c#7 edit Differences ... ==== //depot/projects/nsched/sys/i386/i386/mp_machdep.c#2 (text+ko) ==== @@ -550,7 +550,7 @@ binuptime(PCPU_PTR(switchtime)); PCPU_SET(switchticks, ticks); - cpu_throw(NULL, choosethread()); /* doesn't return */ + cpu_throw(NULL, choosethread(SW_VOL)); /* doesn't return */ panic("scheduler returned us to %s", __func__); /* NOTREACHED */ ==== //depot/projects/nsched/sys/kern/kern_exit.c#5 (text+ko) ==== @@ -489,15 +489,6 @@ */ cpu_exit(td); - /* - * Release this thread's reference to the ucred. The actual proc - * reference will stay around until the proc is harvested by - * wait(). XXX maybe this should be done there too. - */ - crfree(td->td_ucred); - td->td_ucred = NULL; - - PROC_LOCK(p); PROC_LOCK(p->p_pptr); sx_xunlock(&proctree_lock); @@ -530,7 +521,7 @@ * Allow the scheduler to adjust the priority of the * parent when a process is exiting. */ - if (p->p_pid != 1) + if (p->p_pptr != initproc) sched_exit(p->p_pptr, td); /* @@ -683,6 +674,8 @@ /* * do any thread-system specific cleanups + * like freeing the thread's ucred, + * and any spare threads, etc. */ thread_wait(p); @@ -697,8 +690,6 @@ #ifdef MAC mac_destroy_proc(p); #endif - KASSERT(FIRST_THREAD_IN_PROC(p), - ("kern_wait: no residual thread!")); uma_zfree(proc_zone, p); sx_xlock(&allproc_lock); nprocs--; ==== //depot/projects/nsched/sys/kern/kern_thread.c#12 (text+ko) ==== @@ -645,6 +645,10 @@ KASSERT((p->p_numthreads == 1), ("Multiple threads in wait1()")); KASSERT((p->p_numksegrps == 1), ("Multiple ksegrps in wait1()")); FOREACH_THREAD_IN_PROC(p, td) { + if (td->td_ucred) { + crfree(td->td_ucred); + td->td_ucred = NULL; + } if (td->td_standin != NULL) { thread_free(td->td_standin); td->td_standin = NULL; ==== //depot/projects/nsched/sys/kern/sched_4bsd.c#7 (text+ko) ==== @@ -1202,11 +1202,11 @@ TAILQ_REMOVE(&kg->kg_iq, ke, ke_kgrlist); kg->kg_idle_kses--; } - if (--kg->kg_kses == 0) - ksegrp_unlink(kg); /* * Aggregate stats from the KSE + * ## none yet ## */ + kse_stash(ke); } @@ -1300,12 +1300,14 @@ /* * Whenever we have idle KSEs and there are too many for the concurrancy, - * then free as many as we can. + * then free as many as we can. Don't free too many if we have threads + * to run/kill. */ -#define REDUCE_KSES(skg) \ +#define REDUCE_KSES(kg, skg) \ do { \ while ((skg->skg_concurrancy < skg->skg_kses) && \ - (skg->skg_idle_kses > 0)) { \ + (skg->skg_idle_kses > 0) && \ + (skg->skg_kses > kg->kg_numthreads)) { \ kse_unlink(TAILQ_FIRST(&skg->skg_iq)); \ } \ } while (0) @@ -1318,7 +1320,7 @@ skg = kg->kg_sched; skg->skg_concurrancy = concurrancy; - REDUCE_KSES(skg); + REDUCE_KSES(kg, skg); while (skg->skg_kses < skg->skg_concurrancy) { newke = kse_alloc(); bzero(&newke->ke_startzero, RANGEOF(struct kse, @@ -1554,7 +1556,7 @@ TAILQ_INSERT_TAIL(&kg->kg_iq, ke, ke_kgrlist); kg->kg_idle_kses++; CTR1(KTR_RUNQ, "kse_reassign: ke%p on idle queue", ke); - REDUCE_KSES(kg->kg_sched); /* if we are closing down discard it */ + REDUCE_KSES(kg, kg->kg_sched); /* if we are closing down discard it */ return; }