All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: "Alex,Shi" <alex.shi@intel.com>
Cc: tglx@linutronix.de, mingo@redhat.com,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"Fu, Michael" <michael.fu@intel.com>
Subject: Re: nohz: remove nohz_cpu_mask
Date: Mon, 11 Jul 2011 10:30:47 -0700	[thread overview]
Message-ID: <20110711173047.GL2245@linux.vnet.ibm.com> (raw)
In-Reply-To: <1310345225.28599.10.camel@debian>

On Mon, Jul 11, 2011 at 08:47:05AM +0800, Alex,Shi wrote:
> RCU didn't use this global variable now. Currently no user on it.

Indeed.  RCU's use of it turned out to be quite buggy.  :-(

> Since the ts->do_timer_last is not the real last periodic tick cpu in
> most of time. I once want to compare the cpu_online_mask and
> nohz_cpu_mask to get a real one, and than only let that cpu sleep
> shorter, other cpu will try to sleep KTIME_MAX, that need a extra lock
> for nohz_cpu_mask. But I checked my all platforms, from NHM-EX server to
> laptops, all of them are waked up a few times per second. So, the
> advantage is only in theory. 
> 
> Since no clear usage of this variable, why not remove it? That can save
> a cache-line in all cpus and reduce atomic sync contention.

Works for me!

Reviewed-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>

> Signed-off-by: Alex Shi <alex.shi@intel.com>
> ---
> diff --git a/include/linux/sched.h b/include/linux/sched.h
> index a837b20..6f5cfb3 100644
> --- a/include/linux/sched.h
> +++ b/include/linux/sched.h
> @@ -270,7 +270,6 @@ extern void init_idle_bootup_task(struct task_struct *idle);
> 
>  extern int runqueue_is_locked(int cpu);
> 
> -extern cpumask_var_t nohz_cpu_mask;
>  #if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ)
>  extern void select_nohz_load_balancer(int stop_tick);
>  extern int get_nohz_timer_target(void);
> diff --git a/kernel/sched.c b/kernel/sched.c
> index 3f2e502..a48343c 100644
> --- a/kernel/sched.c
> +++ b/kernel/sched.c
> @@ -5907,15 +5907,6 @@ void __cpuinit init_idle(struct task_struct *idle, int cpu)
>  }
> 
>  /*
> - * In a system that switches off the HZ timer nohz_cpu_mask
> - * indicates which cpus entered this state. This is used
> - * in the rcu update to wait only for active cpus. For system
> - * which do not switch off the HZ timer nohz_cpu_mask should
> - * always be CPU_BITS_NONE.
> - */
> -cpumask_var_t nohz_cpu_mask;
> -
> -/*
>   * Increase the granularity value when there are more CPUs,
>   * because with more CPUs the 'effective latency' as visible
>   * to users decreases. But the relationship is not linear,
> @@ -8010,8 +8001,6 @@ void __init sched_init(void)
>  	 */
>  	current->sched_class = &fair_sched_class;
> 
> -	/* Allocate the nohz_cpu_mask if CONFIG_CPUMASK_OFFSTACK */
> -	zalloc_cpumask_var(&nohz_cpu_mask, GFP_NOWAIT);
>  #ifdef CONFIG_SMP
>  	zalloc_cpumask_var(&sched_domains_tmpmask, GFP_NOWAIT);
>  #ifdef CONFIG_NO_HZ
> diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
> index d5097c4..eb98e55 100644
> --- a/kernel/time/tick-sched.c
> +++ b/kernel/time/tick-sched.c
> @@ -139,7 +139,6 @@ static void tick_nohz_update_jiffies(ktime_t now)
>  	struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);
>  	unsigned long flags;
> 
> -	cpumask_clear_cpu(cpu, nohz_cpu_mask);
>  	ts->idle_waketime = now;
> 
>  	local_irq_save(flags);
> @@ -389,9 +388,6 @@ void tick_nohz_stop_sched_tick(int inidle)
>  		else
>  			expires.tv64 = KTIME_MAX;
> 
> -		if (delta_jiffies > 1)
> -			cpumask_set_cpu(cpu, nohz_cpu_mask);
> -
>  		/* Skip reprogram of event if its not changed */
>  		if (ts->tick_stopped && ktime_equal(expires, dev->next_event))
>  			goto out;
> @@ -441,7 +437,6 @@ void tick_nohz_stop_sched_tick(int inidle)
>  		 * softirq.
>  		 */
>  		tick_do_update_jiffies64(ktime_get());
> -		cpumask_clear_cpu(cpu, nohz_cpu_mask);
>  	}
>  	raise_softirq_irqoff(TIMER_SOFTIRQ);
>  out:
> @@ -524,7 +519,6 @@ void tick_nohz_restart_sched_tick(void)
>  	/* Update jiffies first */
>  	select_nohz_load_balancer(0);
>  	tick_do_update_jiffies64(now);
> -	cpumask_clear_cpu(cpu, nohz_cpu_mask);
> 
>  #ifndef CONFIG_VIRT_CPU_ACCOUNTING
>  	/*
> 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@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	other threads:[~2011-07-11 17:35 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-07-11  0:47 nohz: remove nohz_cpu_mask Alex,Shi
2011-07-11 17:30 ` Paul E. McKenney [this message]
2011-07-15  0:51   ` Alex,Shi
2011-07-19  0:53     ` Alex,Shi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20110711173047.GL2245@linux.vnet.ibm.com \
    --to=paulmck@linux.vnet.ibm.com \
    --cc=alex.shi@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=michael.fu@intel.com \
    --cc=mingo@redhat.com \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.