On Mon, 2012-10-29 at 16:27 -0400, Steven Rostedt wrote: > kernel/time/tick-sched.c | 52 > ++++++++++++++++++++++++++++++++++++---------- > 1 file changed, 41 insertions(+), 11 deletions(-) > > diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c > index d6d16fe..c7a78c6 100644 > --- a/kernel/time/tick-sched.c > +++ b/kernel/time/tick-sched.c > @@ -20,6 +20,7 @@ > #include <linux/profile.h> > #include <linux/sched.h> > #include <linux/module.h> > +#include <linux/cpuset.h> > > #include <asm/irq_regs.h> > > @@ -789,6 +790,45 @@ void tick_check_idle(int cpu) > tick_check_nohz(cpu); > } > > +#ifdef CONFIG_CPUSETS_NO_HZ > + > +/* > + * Take the timer duty if nobody is taking care of it. > + * If a CPU already does and and it's in a nohz cpuset,
and and > + * then take the charge so that it can switch to nohz mode. > + */ > +static void tick_do_timer_check_handler(int cpu) > +{ > + int handler = tick_do_timer_cpu; > + > + if (unlikely(handler == TICK_DO_TIMER_NONE)) { > + tick_do_timer_cpu = cpu; I take it that this is the forced (no one has it, so I'll take it?) Perhaps we should do a: WARN_ON(cpuset_cpu_adaptive_nohz(cpu)); > + } else { > + if (!cpuset_adaptive_nohz() && > + cpuset_cpu_adaptive_nohz(handler)) > + tick_do_timer_cpu = cpu; Shouldn't this be if (!cpuset_cpu_adaptive_nohz(cpu) && ... Otherwise, we should have it go to smp_processor_id()? OK, looking further down, the only caller of it passes smp_processor_id() to the function. But we still shouldn't assume this. Either, have the function use smp_processor_id() explicitly, or let it use any cpu. Otherwise it just confuses people, and is prone to be buggy if in the future something calls it with a cpu that's not the local cpu. -- Steve > + } > +} > + > +#else > + > +static void tick_do_timer_check_handler(int cpu) > +{ > +#ifdef CONFIG_NO_HZ > + /* > + * Check if the do_timer duty was dropped. We don't care about > + * concurrency: This happens only when the cpu in charge went > + * into a long sleep. If two cpus happen to assign themself to > + * this duty, then the jiffies update is still serialized by > + * xtime_lock. > + */ > + if (unlikely(tick_do_timer_cpu == TICK_DO_TIMER_NONE)) > + tick_do_timer_cpu = cpu; > +#endif > +} > + > +#endif /* CONFIG_CPUSETS_NO_HZ */ > + > /* > * High resolution timer specific code > */ > @@ -805,17 +845,7 @@ static enum hrtimer_restart tick_sched_timer(struct > hrtimer *timer) > ktime_t now = ktime_get(); > int cpu = smp_processor_id(); > > -#ifdef CONFIG_NO_HZ > - /* > - * Check if the do_timer duty was dropped. We don't care about > - * concurrency: This happens only when the cpu in charge went > - * into a long sleep. If two cpus happen to assign themself to > - * this duty, then the jiffies update is still serialized by > - * xtime_lock. > - */ > - if (unlikely(tick_do_timer_cpu == TICK_DO_TIMER_NONE)) > - tick_do_timer_cpu = cpu; > -#endif > + tick_do_timer_check_handler(cpu); > > /* Check, if the jiffies need an update */ > if (tick_do_timer_cpu == cpu) -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/