On Thu, Jun 02, 2011 at 11:48:31AM -0400, Peter Zijlstra wrote: > Crap.. you're right. And I bet other archs don't do that either. With > NO_HZ you really need irq_enter() for pretty much all interrupts so I > was assuming the resched IPI had it, but its been special and never > really needed it. If it would wake an idle cpu the idle loop exit would > deal with it, if it interrupted userspace the thing was running and > NO_HZ wasn't relevant. > > Damn. > > And yes, the only reason I didn't see this on my dev box was because we > do indeed set that sched_clock_stable thing on wsm. And I never noticed > on my desktop because firefox/X/etc. consuming heaps of CPU isn't weird > at all. > > Adding it to all resched int handlers is of course a possibility but > would slow down the thing, although with the new code, most users are > now indeed wakeups (excepting weird and wonderful users like KVM). FWIW, we could set the sched_clock_stable on AMD too - at least on F10h and later. This will take care of the problem at hand and defer the issue of slowing down the resched ipi handlers. I dunno, however, whether we still would need the proper ->tick_gtod update for correct ttwu accounting regardless of sched_clock_stable on K8 (unstable TSCs) and maybe even other arches. > > We could of course add it in sched.c since the logic recurses just > fine.. its not pretty though.. :/ > > Thoughts? > > --- > kernel/sched.c | 18 +++++++++++++++++- > 1 files changed, 17 insertions(+), 1 deletions(-) > > diff --git a/kernel/sched.c b/kernel/sched.c > index 2fe98ed..365ed6b 100644 > --- a/kernel/sched.c > +++ b/kernel/sched.c > @@ -2554,7 +2554,23 @@ static void sched_ttwu_pending(void) > > void scheduler_ipi(void) > { > - sched_ttwu_pending(); > + struct rq *rq = this_rq(); > + struct task_struct *list = xchg(&rq->wake_list, NULL); > + > + if (!list) > + return; > + > + irq_enter(); > + raw_spin_lock(&rq->lock); > + > + while (list) { > + struct task_struct *p = list; > + list = list->wake_entry; > + ttwu_do_activate(rq, p, 0); > + } > + > + raw_spin_unlock(&rq->lock); > + irq_exit(); > } > > static void ttwu_queue_remote(struct task_struct *p, int cpu) > > > -- Regards/Gruss, Boris. Advanced Micro Devices GmbH Einsteinring 24, 85609 Dornach General Managers: Alberto Bozzo, Andrew Bowd Registration: Dornach, Gemeinde Aschheim, Landkreis Muenchen Registergericht Muenchen, HRB Nr. 43632 -- To unsubscribe from this list: send the line "unsubscribe linux-tip-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html