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/

Reply via email to