From owner-freebsd-arch@FreeBSD.ORG Mon Sep 27 14:15:57 2004 Return-Path: Delivered-To: freebsd-arch@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 8E9E316A4CE for ; Mon, 27 Sep 2004 14:15:57 +0000 (GMT) Received: from mail5.speakeasy.net (mail5.speakeasy.net [216.254.0.205]) by mx1.FreeBSD.org (Postfix) with ESMTP id 519BC43D1F for ; Mon, 27 Sep 2004 14:15:57 +0000 (GMT) (envelope-from jhb@FreeBSD.org) Received: (qmail 27172 invoked from network); 27 Sep 2004 14:15:56 -0000 Received: from dsl027-160-063.atl1.dsl.speakeasy.net (HELO server.baldwin.cx) ([216.27.160.63]) (envelope-sender ) encrypted SMTP for ; 27 Sep 2004 14:15:56 -0000 Received: from [10.50.40.210] (gw1.twc.weather.com [216.133.140.1]) (authenticated bits=0) by server.baldwin.cx (8.12.11/8.12.11) with ESMTP id i8REFoCE012318; Mon, 27 Sep 2004 10:15:52 -0400 (EDT) (envelope-from jhb@FreeBSD.org) From: John Baldwin To: freebsd-arch@FreeBSD.org Date: Mon, 27 Sep 2004 10:16:13 -0400 User-Agent: KMail/1.6.2 References: <1096133353.53798.17613.camel@palm.tree.com> In-Reply-To: <1096133353.53798.17613.camel@palm.tree.com> MIME-Version: 1.0 Content-Disposition: inline Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <200409271016.13345.jhb@FreeBSD.org> X-Spam-Checker-Version: SpamAssassin 2.63 (2004-01-11) on server.baldwin.cx cc: "freebsd-arch@freebsd.org" cc: Julian Elischer cc: Stephan Uphoff Subject: Re: sched_userret priority adjustment patch for sched_4bsd X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 27 Sep 2004 14:15:57 -0000 On Saturday 25 September 2004 01:29 pm, Stephan Uphoff wrote: > When a thread is about to return to user space it resets its priority to > the user level priority. > However after lowering the permission its priority it needs to check if > its priority is still better than all other runable threads. > This is currently not implemented. > Without the check the thread can block kernel or user threads with > better priority until a switch is forced by by an interrupt. > > The attached patch checks the relevant runqueues and threads without > slots in the same ksegrp and forces a thread switch if the currently > running thread is no longer the best thread to run after it changed its > priority. > > The patch should improve interactive response under heavy load somewhat. > It needs a lot of testing. Perhaps the better fix is to teach the schedulers to set TDF_NEEDRESCHED based on on a comparison against user_pri rather than td_priority inside of sched_add()? Having the flag set by sched_add() is supposed to make this sort of check unnecessary. Even 4.x has the same bug I think as a process can make another process runnable after it's priority has been boosted by a tsleep() and need_resched() is only called based on a comparison of p_pri. Ah, 4.x doesn't have the bug because it caches the priority of curproc when it enters the kernel and compares against that. Thus, I think the correct fix is more like this: Index: sched_4bsd.c =================================================================== RCS file: /usr/cvs/src/sys/kern/sched_4bsd.c,v retrieving revision 1.63 diff -u -r1.63 sched_4bsd.c --- sched_4bsd.c 11 Sep 2004 10:07:22 -0000 1.63 +++ sched_4bsd.c 27 Sep 2004 14:12:03 -0000 @@ -272,7 +272,7 @@ { mtx_assert(&sched_lock, MA_OWNED); - if (td->td_priority < curthread->td_priority) + if (td->td_priority < curthread->td_ksegrp->kg_user_pri) curthread->td_flags |= TDF_NEEDRESCHED; } Index: sched_ule.c =================================================================== RCS file: /usr/cvs/src/sys/kern/sched_ule.c,v retrieving revision 1.129 diff -u -r1.129 sched_ule.c --- sched_ule.c 11 Sep 2004 10:07:22 -0000 1.129 +++ sched_ule.c 27 Sep 2004 14:13:01 -0000 @@ -723,7 +723,7 @@ */ pcpu = pcpu_find(cpu); td = pcpu->pc_curthread; - if (ke->ke_thread->td_priority < td->td_priority || + if (ke->ke_thread->td_priority < td->td_ksegrp->kg_user_pri || td == pcpu->pc_idlethread) { td->td_flags |= TDF_NEEDRESCHED; ipi_selected(1 << cpu, IPI_AST); An even better fix might be to fix td_base_pri by having it be set on kernel entry similar to how 4.x sets curpriority. The above fix should be sufficient for now, however. -- John Baldwin <>< http://www.FreeBSD.org/~jhb/ "Power Users Use the Power to Serve" = http://www.FreeBSD.org