Date: Thu, 8 Jul 2004 22:21:43 +0900 From: Taku YAMAMOTO <taku@tackymt.homeip.net> To: freebsd-current@freebsd.org Subject: Re: Native preemption is the culprit [was Re: today's CURRENT lockups] Message-ID: <20040708222143.0f24c076.taku@tackymt.homeip.net> In-Reply-To: <Pine.NEB.3.96L.1040706001249.2853I-100000@fledge.watson.org> References: <20040705184940.GA2651@tybalt.greiner.local> <Pine.NEB.3.96L.1040706001249.2853I-100000@fledge.watson.org>
next in thread | previous in thread | raw e-mail | index | archive | help
greetings, A quick glance showed me that there are some interesting code paths in sched_ule.c that can be problematic in SMP case. 1. sched_choose() => kseq_idled() => sched_add() 2. sched_choose() => kseq_assign() => sched_add() 3. sched_runnable() => kseq_assign() => sched_add() Here is the patch that re-enables preemption except for the above three cases. --- sched_ule.c.orig Tue Jul 6 14:57:29 2004 +++ sched_ule.c Thu Jul 8 06:37:30 2004 @@ -286,6 +286,7 @@ static void sched_balance_groups(void); static void sched_balance_group(struct kseq_group *ksg); static void sched_balance_pair(struct kseq *high, struct kseq *low); +static void sched_add_internal(struct thread *td, int preemptive); static void kseq_move(struct kseq *from, int cpu); static int kseq_idled(struct kseq *kseq); static void kseq_notify(struct kse *ke, int cpu); @@ -616,7 +617,7 @@ kseq_runq_rem(steal, ke); kseq_load_rem(steal, ke); ke->ke_cpu = PCPU_GET(cpuid); - sched_add(ke->ke_thread); + sched_add_internal(ke->ke_thread, 0); return (0); } } @@ -644,7 +645,7 @@ for (; ke != NULL; ke = nke) { nke = ke->ke_assign; ke->ke_flags &= ~KEF_ASSIGNED; - sched_add(ke->ke_thread); + sched_add_internal(ke->ke_thread, 0); } } @@ -1542,6 +1543,14 @@ void sched_add(struct thread *td) { +#ifdef SMP + sched_add_internal(td, 1); +} + +static void +sched_add_internal(struct thread *td, int preemptive) +{ +#endif /* SMP */ struct kseq *kseq; struct ksegrp *kg; struct kse *ke; @@ -1623,17 +1632,21 @@ if (td->td_priority < curthread->td_priority) curthread->td_flags |= TDF_NEEDRESCHED; -#if 0 #ifdef SMP /* * Only try to preempt if the thread is unpinned or pinned to the * current CPU. + * XXX - avoid preemption if called from sched_ule.c internally. + * there're a few code pathes that may be problematic: + * sched_choose() => kseq_idled() => sched_add + * sched_choose() => kseq_assign() => sched_add + * sched_runnable() => kseq_assign() => sched_add */ - if (KSE_CAN_MIGRATE(ke, class) || ke->ke_cpu == PCPU_GET(cpuid)) + if (preemptive && + (KSE_CAN_MIGRATE(ke, class) || ke->ke_cpu == PCPU_GET(cpuid))) #endif if (maybe_preempt(td)) return; -#endif ke->ke_ksegrp->kg_runq_kses++; ke->ke_state = KES_ONRUNQ; This patch is tested on P4@2.8GHz HTT-enabled machine. It has been running for several hours without a hang, although I have to admit that this machine is too idle, far from being stressed. On Tue, 6 Jul 2004 00:14:21 -0400 (EDT) Robert Watson <rwatson@freebsd.org> wrote: > > (This time to more people) > > The patch below appears to (brute force) eliminate the crash/hang I'm > experiencing with SCHED_ULE in the post-preemption universe. However, I > was experiencing it only in the SMP case, not UP, so it could be I'm just > not triggering it timing-wise. This would be a temporary fix until jhb is > online again post-USENIX to take a look, assuming this works around the > problem for people other than me. > > Note that this is probably damaging to interrupt processing latency. > > Robert N M Watson FreeBSD Core Team, TrustedBSD Projects > robert@fledge.watson.org Principal Research Scientist, McAfee Research (snip) > _______________________________________________ > freebsd-current@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-current > To unsubscribe, send any mail to "freebsd-current-unsubscribe@freebsd.org" -- -|-__ YAMAMOTO, Taku | __ < <taku@tackymt.homeip.net> Post Scriptum to the people who know me as taku@cent.saitama-u.ac.jp: My email address has been changed since April, because I've left the university.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040708222143.0f24c076.taku>