lkml.org 
[lkml]   [2012]   [Oct]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
SubjectRe: [PATCH 03/32] nohz: Try not to give the timekeeping duty to an adaptive tickless cpu
From
Date
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)




\
 
 \ /
  Last update: 2012-11-01 20:21    [W:0.487 / U:0.048 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site