Date: Fri, 12 Mar 2004 09:23:47 +0900 From: Taku YAMAMOTO <taku@cent.saitama-u.ac.jp> To: freebsd-current@freebsd.org Subject: [PATCH] for SCHED_ULE & libpthread issue (was Re: I like SCHED_4BSD) Message-ID: <20040312092348.18be60e0.taku@cent.saitama-u.ac.jp> In-Reply-To: <4050BBCB.50302@cinci.rr.com> References: <XFMail.20040310213645.conrads@cox.net> <4050BBCB.50302@cinci.rr.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, 11 Mar 2004 14:19:39 -0500 Mike B <meb@cinci.rr.com> wrote: > Conrad Sabatier wrote: (snip) > seconds to redraw the screen. This sluggishness isn't exclusive to > firefox, opera and openoffice are noticeably laggy under ULE as well. I > WANT to like and use ULE but the performance just isn't there. I think all of those applications are using libpthread, which utilizes scheduler activation mechanism. Unfortunately, due to over-optimization in sched_switch(), SCHED_ULE doesn't give reasonable CPU time to the threads which are using scheduler activation. Detailed analisis is described in my previous message posted to current@: "SCHED_ULE sometimes puts P_SA processes into ksq_next unnecessarily" <20040213063139.71298ea9.taku@cent.saitama-u.ac.jp> or http://docs.freebsd.org/cgi/mid.cgi?20040213063139.71298ea9.taku , which didn't get broader audience :( Until the problem is fully addressed, I will propose following patch to be applied. (the least intrusive one attached in the former message) --- sched_ule.c.orig Fri Feb 13 05:24:48 2004 +++ sched_ule.c Fri Feb 13 05:37:53 2004 @@ -186,7 +186,7 @@ #define SCHED_INTERACTIVE(kg) \ (sched_interact_score(kg) < SCHED_INTERACT_THRESH) #define SCHED_CURR(kg, ke) \ - (ke->ke_thread->td_priority != kg->kg_user_pri || \ + (ke->ke_thread->td_priority < kg->kg_user_pri || \ SCHED_INTERACTIVE(kg)) /* @@ -1166,11 +1166,8 @@ */ if ((ke->ke_flags & KEF_ASSIGNED) == 0) { if (TD_IS_RUNNING(td)) { - if (td->td_proc->p_flag & P_SA) { - kseq_load_rem(KSEQ_CPU(ke->ke_cpu), ke); - setrunqueue(td); - } else - kseq_runq_add(KSEQ_SELF(), ke); + kseq_load_rem(KSEQ_CPU(ke->ke_cpu), ke); + setrunqueue(td); } else { if (ke->ke_runq) { kseq_load_rem(KSEQ_CPU(ke->ke_cpu), ke); -- -|-__ YAMAMOTO, Taku <taku@cent.saitama-u.ac.jp> | __ <
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040312092348.18be60e0.taku>