Re: rcu: Provide compile-time control for no-CBs CPUs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Apr 30, 2013 at 04:24:40PM -0400, Dave Jones wrote:
> On Tue, Apr 30, 2013 at 12:25:41PM -0700, Paul E. McKenney wrote:
>  > On Tue, Apr 30, 2013 at 02:46:12PM -0400, Dave Jones wrote:
> 
>  > > Additionally, nowhere in any of this text does it say what a "no-CB CPU" is,
>  > > or why I would care, or even what the downsides are for each option.
>  > 
>  > In the absence of any Kconfig change, would the following be more helpful?
> 
> A little. You've now documented the mechanism behind each choice,
> but there's still no real explanation why I would pick one over the other.
> The average reader of these texts isn't going to know whether running something
> from a kthread is a better/worse idea than running from softirq context.
> 
> Who doesn't like saving energy ? Why would I leave it at the NONE default ?
> Why is it even an option ? I'm assuming there's a reason we don't pick
> (one of the) energy efficient options by default (performance?) who knows,
> there's no explanation.
> 
> Why would I want to treat CPU0 differently ? What user-visible downsides
> are there ? Who knows..

OK, taking the questions one at a time...

o	Who doesn't like saving energy?

	That depends on what you lose when you save the energy.  In fact,
	there may come a time when RCU always invokes its context from
	kthread context.  But before I take that step, I need to see
	a year or two worth of experience with this for a lot of different
	workloads, especially workloads involving extremely heavy
	networking loads.

o	Why would I leave it at the NONE default?
o	Why is it even an option?

	Because if you are doing testing or running benchmarks to check
	the effects of setting different numbers of CPUs to no-CBs mode,
	and you might not want to incur the overhead of a kernel build
	between each run.  The NONE default is what you want for this
	case, because it allows complete freedom to choose an arbitrary
	no-CBs configuration on each boot.

o	I'm assuming there's a reason we don't pick (one of the) energy
	efficient options by default (performance)?

	The reason I picked NONE as default is because it gives the most
	boot-time flexibility.	I felt that flexibility was important
	at the moment because I expect most of the users to be kicking
	the tires rather than putting it into production.  I might well
	change the default later on, in fact, I might well eliminate
	the choice entirely (so that all CPUs are always no-CBs CPUs)
	if experience indicates that this is a reasonable approach.

o	Why would I want to treat CPU0 differently?

	I added this option because it ensures that the various people
	doing randconfig testing will at least sometimes test a mixed
	system that has only some of the CPUs be no-CBs CPUs.

o	What user-visible downsides are there?

	There might well not be any.  In theory, no-CBs CPUs will incur
	a little bit more overhead, especially if they are pinned to
	some CPU on the other side of the system from the CPU they
	are serving.  In practice, you would have to show me a workload
	where this difference was visible at the system level, but at
	the same time, I clearly cannot prove that there is no such
	workload.

Should I add this to the Kconfig help text?  My guess is "not all of it",
but figured I should ask.  See below for my current best guess.

>  > +choice
>  > +	prompt "Build-forced no-CBs CPUs"
>  > +	default RCU_NOCB_CPU_NONE
>  > +	help
>  > +	  This option allows no-CBs CPUs (whose RCU callbacks are invoked
>  > +	  from kthreads rather than from softirq context) to be specified
>  > +	  at build time.  Additional no-CBs CPUs may be specified by
>  > +	  the rcu_nocbs= boot parameter.
>  > +
>  > +config RCU_NOCB_CPU_NONE
>  > +	bool "No build_forced no-CBs CPUs"
>  > +	depends on RCU_NOCB_CPU
>  > +	help
>  > +	  This option does not force any of the CPUs to be no-CBs CPUs.
>  > +	  Only CPUs designated by the rcu_nocbs= boot parameter will be
>  > +	  no-CBs CPUs, whose RCU callbacks will be invoked by per-CPU
>  > +	  rcuo kthreads.  All other CPUs will invoke their own RCU
>  > +	  callbacks in softirq context.
>  > +
>  > +config RCU_NOCB_CPU_ZERO
>  > +	bool "CPU 0 is a build_forced no-CBs CPU"
>  > +	depends on RCU_NOCB_CPU
>  > +	help
>  > +	  This option forces CPU 0 to be a no-CBs CPU, so that its
>  > +	  RCU callbacks are invoked by a per-CPU rcuo kthread.
>  > +	  Additional CPUs may be designated as no-CBs CPUs using the
>  > +	  rcu_nocbs= boot parameter will be no-CBs CPUs.  All other CPUs
>  > +	  will invoke their own RCU callbacks in softirq context.
>  > +
>  > +	  Select this if CPU 0 needs to be a no-CBs CPU for real-time
>  > +	  or energy-efficiency reasons.
>  > +
>  > +config RCU_NOCB_CPU_ALL
>  > +	bool "All CPUs are build_forced no-CBs CPUs"
>  > +	depends on RCU_NOCB_CPU
>  > +	help
>  > +	  This option forces all CPUs to be no-CBs CPUs.  The rcu_nocbs=
>  > +	  boot parameter will be ignored.  All CPUs' RCU callbacks will
>  > +	  be executed in the context of per-CPU rcuo kthreads created
>  > +	  for this purpose.
>  > +
>  > +	  Select this if all CPUs need to be no-CBs CPUs for real-time
>  > +	  or energy-efficiency reasons.
> 
> I know how much IBMers love their acronyms. I thought you'd invented
> some new rcu variant for a moment. Perhaps "kthreads named 'rcuo'"
> would be clearer ?

Good point, changed as you suggest.  And I am trying to avoid
perpetrating^Winventing new RCU flavors, at least for the next
week or two.

Speaking as an IBMer, I can only hang my head in shame at my inability
thus far to come up with an acronym that is at least five letters long,
but consisting only of vowels.  ;-)

							Thanx, Paul

------------------------------------------------------------------------

config RCU_NOCB_CPU
	bool "Offload RCU callback processing from boot-selected CPUs"
	depends on TREE_RCU || TREE_PREEMPT_RCU
	default n
	help
	  Use this option to reduce OS jitter for aggressive HPC or
	  real-time workloads.	It can also be used to offload RCU
	  callback invocation to energy-efficient CPUs in battery-powered
	  asymmetric multiprocessors.

	  This option offloads callback invocation from the set of
	  CPUs specified at boot time by the rcu_nocbs parameter.
	  For each such CPU, a kthread ("rcuox/N") will be created to
	  invoke callbacks, where the "N" is the CPU being offloaded,
	  and where the "x" is "b" for RCU-bh, "p" for RCU-preempt, and
	  "s" for RCU-sched.  Nothing prevents this kthread from running
	  on the specified CPUs, but (1) the kthreads may be preempted
	  between each callback, and (2) affinity or cgroups can be used
	  to force the kthreads to run on whatever set of CPUs is desired.

	  Say Y here if you want to help to debug reduced OS jitter.
	  Say N here if you are unsure.

choice
	prompt "Build-forced no-CBs CPUs"
	default RCU_NOCB_CPU_NONE
	help
	  This option allows no-CBs CPUs (whose RCU callbacks are invoked
	  from kthreads rather than from softirq context) to be specified
	  at build time.  Additional no-CBs CPUs may be specified by
	  the rcu_nocbs= boot parameter.

config RCU_NOCB_CPU_NONE
	bool "No build_forced no-CBs CPUs"
	depends on RCU_NOCB_CPU
	help
	  This option does not force any of the CPUs to be no-CBs CPUs.
	  Only CPUs designated by the rcu_nocbs= boot parameter will be
	  no-CBs CPUs, whose RCU callbacks will be invoked by per-CPU
	  kthreads whose names begin with "rcuo".  All other CPUs will
	  invoke their own RCU callbacks in softirq context.

	  Select this option if you want to choose no-CBs CPUs at
	  boot time, for example, to allow testing of different no-CBs
	  configurations without having to rebuild the kernel each time.

config RCU_NOCB_CPU_ZERO
	bool "CPU 0 is a build_forced no-CBs CPU"
	depends on RCU_NOCB_CPU
	help
	  This option forces CPU 0 to be a no-CBs CPU, so that its RCU
	  callbacks are invoked by a per-CPU kthread whose name begins
	  with "rcuo".	Additional CPUs may be designated as no-CBs
	  CPUs using the rcu_nocbs= boot parameter will be no-CBs CPUs.
	  All other CPUs will invoke their own RCU callbacks in softirq
	  context.

	  Select this if CPU 0 needs to be a no-CBs CPU for real-time
	  or energy-efficiency reasons, but the real reason it exists
	  is to ensure that randconfig testing covers mixed systems.

config RCU_NOCB_CPU_ALL
	bool "All CPUs are build_forced no-CBs CPUs"
	depends on RCU_NOCB_CPU
	help
	  This option forces all CPUs to be no-CBs CPUs.  The rcu_nocbs=
	  boot parameter will be ignored.  All CPUs' RCU callbacks will
	  be executed in the context of per-CPU rcuo kthreads created for
	  this purpose.  Assuming that the kthreads whose names start with
	  "rcuo" are bound to "housekeeping" CPUs, this reduces OS jitter
	  on the remaining CPUs, but might decrease memory locality during
	  RCU-callback invocation, thus potentially degrading throughput.

	  Select this if all CPUs need to be no-CBs CPUs for real-time
	  or energy-efficiency reasons.

endchoice

--
To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux&nblp;USB Development]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite Secrets]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux