public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 1/2] rcu: Create a function for rcu_nocb_mask boot time setup
@ 2014-07-25  0:37 Pranith Kumar
  2014-07-25  0:37 ` [PATCH v2 2/2] rcu: Check the return value of rcu_nocb_mask cpumask allocation Pranith Kumar
  2014-07-25 15:27 ` [PATCH v2 1/2] rcu: Create a function for rcu_nocb_mask boot time setup Paul E. McKenney
  0 siblings, 2 replies; 6+ messages in thread
From: Pranith Kumar @ 2014-07-25  0:37 UTC (permalink / raw)
  To: Paul E. McKenney, Josh Triplett, Steven Rostedt,
	Mathieu Desnoyers, Lai Jiangshan, open list:READ-COPY UPDATE...

This commit creates a function rcu_bootup_announce_oddness_nocb(), which handles
allocation of rcu_nocb_mask and setting it according to the kernel configuration
parameters.

Signed-off-by: Pranith Kumar <bobby.prani@gmail.com>
---
v2: don't break the print string (comment from paulmck)

 kernel/rcu/tree_plugin.h | 61 +++++++++++++++++++++++++++---------------------
 1 file changed, 35 insertions(+), 26 deletions(-)

diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
index c31eb28..520538a 100644
--- a/kernel/rcu/tree_plugin.h
+++ b/kernel/rcu/tree_plugin.h
@@ -47,6 +47,39 @@ static char __initdata nocb_buf[NR_CPUS * 5];
 #endif /* #ifdef CONFIG_RCU_NOCB_CPU */
 
 /*
+ * This is a helper for rcu_bootup_announce_oddness(), which takes care of
+ * setting up rcu_nocb_mask for nocb specific kernel configuration parameters
+ */
+static void __init rcu_bootup_announce_oddness_nocb(void)
+{
+#ifndef CONFIG_RCU_NOCB_CPU_NONE
+	if (!have_rcu_nocb_mask) {
+		zalloc_cpumask_var(&rcu_nocb_mask, GFP_KERNEL);
+		have_rcu_nocb_mask = true;
+	}
+#ifdef CONFIG_RCU_NOCB_CPU_ZERO
+	pr_info("\tOffload RCU callbacks from CPU 0\n");
+	cpumask_set_cpu(0, rcu_nocb_mask);
+#endif /* #ifdef CONFIG_RCU_NOCB_CPU_ZERO */
+#ifdef CONFIG_RCU_NOCB_CPU_ALL
+	pr_info("\tOffload RCU callbacks from all CPUs\n");
+	cpumask_copy(rcu_nocb_mask, cpu_possible_mask);
+#endif /* #ifdef CONFIG_RCU_NOCB_CPU_ALL */
+#endif /* #ifndef CONFIG_RCU_NOCB_CPU_NONE */
+	if (have_rcu_nocb_mask) {
+		if (!cpumask_subset(rcu_nocb_mask, cpu_possible_mask)) {
+			pr_info("\tNote: kernel parameter 'rcu_nocbs=' contains nonexistent CPUs.\n");
+			cpumask_and(rcu_nocb_mask, cpu_possible_mask,
+				    rcu_nocb_mask);
+		}
+		cpulist_scnprintf(nocb_buf, sizeof(nocb_buf), rcu_nocb_mask);
+		pr_info("\tOffload RCU callbacks from CPUs: %s.\n", nocb_buf);
+		if (rcu_nocb_poll)
+			pr_info("\tPoll for callbacks from no-CBs CPUs.\n");
+	}
+}
+
+/*
  * Check the RCU kernel configuration parameters and print informative
  * messages about anything out of the ordinary.  If you like #ifdef, you
  * will love this function.
@@ -86,32 +119,8 @@ static void __init rcu_bootup_announce_oddness(void)
 	if (nr_cpu_ids != NR_CPUS)
 		pr_info("\tRCU restricting CPUs from NR_CPUS=%d to nr_cpu_ids=%d.\n", NR_CPUS, nr_cpu_ids);
 #ifdef CONFIG_RCU_NOCB_CPU
-#ifndef CONFIG_RCU_NOCB_CPU_NONE
-	if (!have_rcu_nocb_mask) {
-		zalloc_cpumask_var(&rcu_nocb_mask, GFP_KERNEL);
-		have_rcu_nocb_mask = true;
-	}
-#ifdef CONFIG_RCU_NOCB_CPU_ZERO
-	pr_info("\tOffload RCU callbacks from CPU 0\n");
-	cpumask_set_cpu(0, rcu_nocb_mask);
-#endif /* #ifdef CONFIG_RCU_NOCB_CPU_ZERO */
-#ifdef CONFIG_RCU_NOCB_CPU_ALL
-	pr_info("\tOffload RCU callbacks from all CPUs\n");
-	cpumask_copy(rcu_nocb_mask, cpu_possible_mask);
-#endif /* #ifdef CONFIG_RCU_NOCB_CPU_ALL */
-#endif /* #ifndef CONFIG_RCU_NOCB_CPU_NONE */
-	if (have_rcu_nocb_mask) {
-		if (!cpumask_subset(rcu_nocb_mask, cpu_possible_mask)) {
-			pr_info("\tNote: kernel parameter 'rcu_nocbs=' contains nonexistent CPUs.\n");
-			cpumask_and(rcu_nocb_mask, cpu_possible_mask,
-				    rcu_nocb_mask);
-		}
-		cpulist_scnprintf(nocb_buf, sizeof(nocb_buf), rcu_nocb_mask);
-		pr_info("\tOffload RCU callbacks from CPUs: %s.\n", nocb_buf);
-		if (rcu_nocb_poll)
-			pr_info("\tPoll for callbacks from no-CBs CPUs.\n");
-	}
-#endif /* #ifdef CONFIG_RCU_NOCB_CPU */
+	rcu_bootup_announce_oddness_nocb();
+#endif
 }
 
 #ifdef CONFIG_TREE_PREEMPT_RCU
-- 
2.0.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v2 2/2] rcu: Check the return value of rcu_nocb_mask cpumask allocation
  2014-07-25  0:37 [PATCH v2 1/2] rcu: Create a function for rcu_nocb_mask boot time setup Pranith Kumar
@ 2014-07-25  0:37 ` Pranith Kumar
  2014-07-25 15:25   ` Paul E. McKenney
  2014-07-25 15:27 ` [PATCH v2 1/2] rcu: Create a function for rcu_nocb_mask boot time setup Paul E. McKenney
  1 sibling, 1 reply; 6+ messages in thread
From: Pranith Kumar @ 2014-07-25  0:37 UTC (permalink / raw)
  To: Paul E. McKenney, Josh Triplett, Steven Rostedt,
	Mathieu Desnoyers, Lai Jiangshan, open list:READ-COPY UPDATE...

This commit checks the return value of the zalloc_cpumask_var() used for
allocating cpumask for rcu_nocb_mask.

Signed-off-by: Pranith Kumar <bobby.prani@gmail.com>
---
v2: no change from v1

 kernel/rcu/tree_plugin.h | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
index 520538a..9c9a01c 100644
--- a/kernel/rcu/tree_plugin.h
+++ b/kernel/rcu/tree_plugin.h
@@ -54,7 +54,10 @@ static void __init rcu_bootup_announce_oddness_nocb(void)
 {
 #ifndef CONFIG_RCU_NOCB_CPU_NONE
 	if (!have_rcu_nocb_mask) {
-		zalloc_cpumask_var(&rcu_nocb_mask, GFP_KERNEL);
+		if (!zalloc_cpumask_var(&rcu_nocb_mask, GFP_KERNEL)) {
+			pr_info("rcu_nocb_mask allocation failed\n");
+			return;
+		}
 		have_rcu_nocb_mask = true;
 	}
 #ifdef CONFIG_RCU_NOCB_CPU_ZERO
@@ -66,17 +69,15 @@ static void __init rcu_bootup_announce_oddness_nocb(void)
 	cpumask_copy(rcu_nocb_mask, cpu_possible_mask);
 #endif /* #ifdef CONFIG_RCU_NOCB_CPU_ALL */
 #endif /* #ifndef CONFIG_RCU_NOCB_CPU_NONE */
-	if (have_rcu_nocb_mask) {
-		if (!cpumask_subset(rcu_nocb_mask, cpu_possible_mask)) {
-			pr_info("\tNote: kernel parameter 'rcu_nocbs=' contains nonexistent CPUs.\n");
-			cpumask_and(rcu_nocb_mask, cpu_possible_mask,
-				    rcu_nocb_mask);
-		}
-		cpulist_scnprintf(nocb_buf, sizeof(nocb_buf), rcu_nocb_mask);
-		pr_info("\tOffload RCU callbacks from CPUs: %s.\n", nocb_buf);
-		if (rcu_nocb_poll)
-			pr_info("\tPoll for callbacks from no-CBs CPUs.\n");
+	if (!cpumask_subset(rcu_nocb_mask, cpu_possible_mask)) {
+		pr_info("\tNote: kernel parameter 'rcu_nocbs=' contains nonexistent CPUs.\n");
+		cpumask_and(rcu_nocb_mask, cpu_possible_mask,
+				rcu_nocb_mask);
 	}
+	cpulist_scnprintf(nocb_buf, sizeof(nocb_buf), rcu_nocb_mask);
+	pr_info("\tOffload RCU callbacks from CPUs: %s.\n", nocb_buf);
+	if (rcu_nocb_poll)
+		pr_info("\tPoll for callbacks from no-CBs CPUs.\n");
 }
 
 /*
-- 
2.0.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 2/2] rcu: Check the return value of rcu_nocb_mask cpumask allocation
  2014-07-25  0:37 ` [PATCH v2 2/2] rcu: Check the return value of rcu_nocb_mask cpumask allocation Pranith Kumar
@ 2014-07-25 15:25   ` Paul E. McKenney
  2014-07-25 18:06     ` Paul E. McKenney
  0 siblings, 1 reply; 6+ messages in thread
From: Paul E. McKenney @ 2014-07-25 15:25 UTC (permalink / raw)
  To: Pranith Kumar
  Cc: Josh Triplett, Steven Rostedt, Mathieu Desnoyers, Lai Jiangshan,
	open list:READ-COPY UPDATE...

On Thu, Jul 24, 2014 at 08:37:32PM -0400, Pranith Kumar wrote:
> This commit checks the return value of the zalloc_cpumask_var() used for
> allocating cpumask for rcu_nocb_mask.
> 
> Signed-off-by: Pranith Kumar <bobby.prani@gmail.com>

Hmmm...  I saw the check in the previous patch, but didn't see removal
of the later have_rcu_nocb_mask check.  Please see below.

							Thanx, Paul

> ---
> v2: no change from v1
> 
>  kernel/rcu/tree_plugin.h | 23 ++++++++++++-----------
>  1 file changed, 12 insertions(+), 11 deletions(-)
> 
> diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
> index 520538a..9c9a01c 100644
> --- a/kernel/rcu/tree_plugin.h
> +++ b/kernel/rcu/tree_plugin.h
> @@ -54,7 +54,10 @@ static void __init rcu_bootup_announce_oddness_nocb(void)
>  {
>  #ifndef CONFIG_RCU_NOCB_CPU_NONE
>  	if (!have_rcu_nocb_mask) {
> -		zalloc_cpumask_var(&rcu_nocb_mask, GFP_KERNEL);
> +		if (!zalloc_cpumask_var(&rcu_nocb_mask, GFP_KERNEL)) {
> +			pr_info("rcu_nocb_mask allocation failed\n");
> +			return;
> +		}
>  		have_rcu_nocb_mask = true;
>  	}
>  #ifdef CONFIG_RCU_NOCB_CPU_ZERO
> @@ -66,17 +69,15 @@ static void __init rcu_bootup_announce_oddness_nocb(void)
>  	cpumask_copy(rcu_nocb_mask, cpu_possible_mask);
>  #endif /* #ifdef CONFIG_RCU_NOCB_CPU_ALL */
>  #endif /* #ifndef CONFIG_RCU_NOCB_CPU_NONE */
> -	if (have_rcu_nocb_mask) {
> -		if (!cpumask_subset(rcu_nocb_mask, cpu_possible_mask)) {
> -			pr_info("\tNote: kernel parameter 'rcu_nocbs=' contains nonexistent CPUs.\n");
> -			cpumask_and(rcu_nocb_mask, cpu_possible_mask,
> -				    rcu_nocb_mask);
> -		}
> -		cpulist_scnprintf(nocb_buf, sizeof(nocb_buf), rcu_nocb_mask);
> -		pr_info("\tOffload RCU callbacks from CPUs: %s.\n", nocb_buf);
> -		if (rcu_nocb_poll)
> -			pr_info("\tPoll for callbacks from no-CBs CPUs.\n");
> +	if (!cpumask_subset(rcu_nocb_mask, cpu_possible_mask)) {

What happens if CONFIG_RCU_NOCB_CPU_NONE=y and the rcu_nocbs= boot
parameter is not specified and we get here?

In order to get visible failures when testing, build with
CONFIG_CPUMASK_OFFSTACK=y.

> +		pr_info("\tNote: kernel parameter 'rcu_nocbs=' contains nonexistent CPUs.\n");
> +		cpumask_and(rcu_nocb_mask, cpu_possible_mask,
> +				rcu_nocb_mask);
>  	}
> +	cpulist_scnprintf(nocb_buf, sizeof(nocb_buf), rcu_nocb_mask);
> +	pr_info("\tOffload RCU callbacks from CPUs: %s.\n", nocb_buf);
> +	if (rcu_nocb_poll)
> +		pr_info("\tPoll for callbacks from no-CBs CPUs.\n");
>  }
> 
>  /*
> -- 
> 2.0.1
> 


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 1/2] rcu: Create a function for rcu_nocb_mask boot time setup
  2014-07-25  0:37 [PATCH v2 1/2] rcu: Create a function for rcu_nocb_mask boot time setup Pranith Kumar
  2014-07-25  0:37 ` [PATCH v2 2/2] rcu: Check the return value of rcu_nocb_mask cpumask allocation Pranith Kumar
@ 2014-07-25 15:27 ` Paul E. McKenney
  1 sibling, 0 replies; 6+ messages in thread
From: Paul E. McKenney @ 2014-07-25 15:27 UTC (permalink / raw)
  To: Pranith Kumar
  Cc: Josh Triplett, Steven Rostedt, Mathieu Desnoyers, Lai Jiangshan,
	open list:READ-COPY UPDATE...

On Thu, Jul 24, 2014 at 08:37:31PM -0400, Pranith Kumar wrote:
> This commit creates a function rcu_bootup_announce_oddness_nocb(), which handles
> allocation of rcu_nocb_mask and setting it according to the kernel configuration
> parameters.
> 
> Signed-off-by: Pranith Kumar <bobby.prani@gmail.com>

Much better!

One more change called out below.

							Thanx, Paul

> ---
> v2: don't break the print string (comment from paulmck)
> 
>  kernel/rcu/tree_plugin.h | 61 +++++++++++++++++++++++++++---------------------
>  1 file changed, 35 insertions(+), 26 deletions(-)
> 
> diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
> index c31eb28..520538a 100644
> --- a/kernel/rcu/tree_plugin.h
> +++ b/kernel/rcu/tree_plugin.h
> @@ -47,6 +47,39 @@ static char __initdata nocb_buf[NR_CPUS * 5];
>  #endif /* #ifdef CONFIG_RCU_NOCB_CPU */
> 
>  /*
> + * This is a helper for rcu_bootup_announce_oddness(), which takes care of
> + * setting up rcu_nocb_mask for nocb specific kernel configuration parameters
> + */
> +static void __init rcu_bootup_announce_oddness_nocb(void)
> +{
> +#ifndef CONFIG_RCU_NOCB_CPU_NONE
> +	if (!have_rcu_nocb_mask) {
> +		zalloc_cpumask_var(&rcu_nocb_mask, GFP_KERNEL);
> +		have_rcu_nocb_mask = true;
> +	}
> +#ifdef CONFIG_RCU_NOCB_CPU_ZERO
> +	pr_info("\tOffload RCU callbacks from CPU 0\n");
> +	cpumask_set_cpu(0, rcu_nocb_mask);
> +#endif /* #ifdef CONFIG_RCU_NOCB_CPU_ZERO */
> +#ifdef CONFIG_RCU_NOCB_CPU_ALL
> +	pr_info("\tOffload RCU callbacks from all CPUs\n");
> +	cpumask_copy(rcu_nocb_mask, cpu_possible_mask);
> +#endif /* #ifdef CONFIG_RCU_NOCB_CPU_ALL */
> +#endif /* #ifndef CONFIG_RCU_NOCB_CPU_NONE */
> +	if (have_rcu_nocb_mask) {
> +		if (!cpumask_subset(rcu_nocb_mask, cpu_possible_mask)) {
> +			pr_info("\tNote: kernel parameter 'rcu_nocbs=' contains nonexistent CPUs.\n");
> +			cpumask_and(rcu_nocb_mask, cpu_possible_mask,
> +				    rcu_nocb_mask);
> +		}
> +		cpulist_scnprintf(nocb_buf, sizeof(nocb_buf), rcu_nocb_mask);
> +		pr_info("\tOffload RCU callbacks from CPUs: %s.\n", nocb_buf);
> +		if (rcu_nocb_poll)
> +			pr_info("\tPoll for callbacks from no-CBs CPUs.\n");
> +	}
> +}
> +
> +/*
>   * Check the RCU kernel configuration parameters and print informative
>   * messages about anything out of the ordinary.  If you like #ifdef, you
>   * will love this function.
> @@ -86,32 +119,8 @@ static void __init rcu_bootup_announce_oddness(void)
>  	if (nr_cpu_ids != NR_CPUS)
>  		pr_info("\tRCU restricting CPUs from NR_CPUS=%d to nr_cpu_ids=%d.\n", NR_CPUS, nr_cpu_ids);
>  #ifdef CONFIG_RCU_NOCB_CPU

Please also move the above #ifdef into rcu_bootup_announce_oddness_nocb().
The compiler will inline the resulting empty function, and it is cleaner
to have all of the NOCB-related #ifdefs in that function.

> -#ifndef CONFIG_RCU_NOCB_CPU_NONE
> -	if (!have_rcu_nocb_mask) {
> -		zalloc_cpumask_var(&rcu_nocb_mask, GFP_KERNEL);
> -		have_rcu_nocb_mask = true;
> -	}
> -#ifdef CONFIG_RCU_NOCB_CPU_ZERO
> -	pr_info("\tOffload RCU callbacks from CPU 0\n");
> -	cpumask_set_cpu(0, rcu_nocb_mask);
> -#endif /* #ifdef CONFIG_RCU_NOCB_CPU_ZERO */
> -#ifdef CONFIG_RCU_NOCB_CPU_ALL
> -	pr_info("\tOffload RCU callbacks from all CPUs\n");
> -	cpumask_copy(rcu_nocb_mask, cpu_possible_mask);
> -#endif /* #ifdef CONFIG_RCU_NOCB_CPU_ALL */
> -#endif /* #ifndef CONFIG_RCU_NOCB_CPU_NONE */
> -	if (have_rcu_nocb_mask) {
> -		if (!cpumask_subset(rcu_nocb_mask, cpu_possible_mask)) {
> -			pr_info("\tNote: kernel parameter 'rcu_nocbs=' contains nonexistent CPUs.\n");
> -			cpumask_and(rcu_nocb_mask, cpu_possible_mask,
> -				    rcu_nocb_mask);
> -		}
> -		cpulist_scnprintf(nocb_buf, sizeof(nocb_buf), rcu_nocb_mask);
> -		pr_info("\tOffload RCU callbacks from CPUs: %s.\n", nocb_buf);
> -		if (rcu_nocb_poll)
> -			pr_info("\tPoll for callbacks from no-CBs CPUs.\n");
> -	}
> -#endif /* #ifdef CONFIG_RCU_NOCB_CPU */
> +	rcu_bootup_announce_oddness_nocb();
> +#endif
>  }
> 
>  #ifdef CONFIG_TREE_PREEMPT_RCU
> -- 
> 2.0.1
> 


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 2/2] rcu: Check the return value of rcu_nocb_mask cpumask allocation
  2014-07-25 15:25   ` Paul E. McKenney
@ 2014-07-25 18:06     ` Paul E. McKenney
  2014-07-25 19:33       ` Pranith Kumar
  0 siblings, 1 reply; 6+ messages in thread
From: Paul E. McKenney @ 2014-07-25 18:06 UTC (permalink / raw)
  To: Pranith Kumar
  Cc: Josh Triplett, Steven Rostedt, Mathieu Desnoyers, Lai Jiangshan,
	open list:READ-COPY UPDATE...

On Fri, Jul 25, 2014 at 08:25:51AM -0700, Paul E. McKenney wrote:
> On Thu, Jul 24, 2014 at 08:37:32PM -0400, Pranith Kumar wrote:
> > This commit checks the return value of the zalloc_cpumask_var() used for
> > allocating cpumask for rcu_nocb_mask.
> > 
> > Signed-off-by: Pranith Kumar <bobby.prani@gmail.com>
> 
> Hmmm...  I saw the check in the previous patch, but didn't see removal
> of the later have_rcu_nocb_mask check.  Please see below.

And events overtook this one.  Turns out that commit b58cc46c5f6b
(rcu: Don't offload callbacks unless specifically requested) was not
one of my best efforts.

I will adapt your patch 2/2 in this series and apply it with your
Signed-off-by.  Patch 1/2 is obsoleted by the current fix for
commit b58cc46c5f6b.

							Thanx, Paul

> > ---
> > v2: no change from v1
> > 
> >  kernel/rcu/tree_plugin.h | 23 ++++++++++++-----------
> >  1 file changed, 12 insertions(+), 11 deletions(-)
> > 
> > diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
> > index 520538a..9c9a01c 100644
> > --- a/kernel/rcu/tree_plugin.h
> > +++ b/kernel/rcu/tree_plugin.h
> > @@ -54,7 +54,10 @@ static void __init rcu_bootup_announce_oddness_nocb(void)
> >  {
> >  #ifndef CONFIG_RCU_NOCB_CPU_NONE
> >  	if (!have_rcu_nocb_mask) {
> > -		zalloc_cpumask_var(&rcu_nocb_mask, GFP_KERNEL);
> > +		if (!zalloc_cpumask_var(&rcu_nocb_mask, GFP_KERNEL)) {
> > +			pr_info("rcu_nocb_mask allocation failed\n");
> > +			return;
> > +		}
> >  		have_rcu_nocb_mask = true;
> >  	}
> >  #ifdef CONFIG_RCU_NOCB_CPU_ZERO
> > @@ -66,17 +69,15 @@ static void __init rcu_bootup_announce_oddness_nocb(void)
> >  	cpumask_copy(rcu_nocb_mask, cpu_possible_mask);
> >  #endif /* #ifdef CONFIG_RCU_NOCB_CPU_ALL */
> >  #endif /* #ifndef CONFIG_RCU_NOCB_CPU_NONE */
> > -	if (have_rcu_nocb_mask) {
> > -		if (!cpumask_subset(rcu_nocb_mask, cpu_possible_mask)) {
> > -			pr_info("\tNote: kernel parameter 'rcu_nocbs=' contains nonexistent CPUs.\n");
> > -			cpumask_and(rcu_nocb_mask, cpu_possible_mask,
> > -				    rcu_nocb_mask);
> > -		}
> > -		cpulist_scnprintf(nocb_buf, sizeof(nocb_buf), rcu_nocb_mask);
> > -		pr_info("\tOffload RCU callbacks from CPUs: %s.\n", nocb_buf);
> > -		if (rcu_nocb_poll)
> > -			pr_info("\tPoll for callbacks from no-CBs CPUs.\n");
> > +	if (!cpumask_subset(rcu_nocb_mask, cpu_possible_mask)) {
> 
> What happens if CONFIG_RCU_NOCB_CPU_NONE=y and the rcu_nocbs= boot
> parameter is not specified and we get here?
> 
> In order to get visible failures when testing, build with
> CONFIG_CPUMASK_OFFSTACK=y.
> 
> > +		pr_info("\tNote: kernel parameter 'rcu_nocbs=' contains nonexistent CPUs.\n");
> > +		cpumask_and(rcu_nocb_mask, cpu_possible_mask,
> > +				rcu_nocb_mask);
> >  	}
> > +	cpulist_scnprintf(nocb_buf, sizeof(nocb_buf), rcu_nocb_mask);
> > +	pr_info("\tOffload RCU callbacks from CPUs: %s.\n", nocb_buf);
> > +	if (rcu_nocb_poll)
> > +		pr_info("\tPoll for callbacks from no-CBs CPUs.\n");
> >  }
> > 
> >  /*
> > -- 
> > 2.0.1
> > 


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 2/2] rcu: Check the return value of rcu_nocb_mask cpumask allocation
  2014-07-25 18:06     ` Paul E. McKenney
@ 2014-07-25 19:33       ` Pranith Kumar
  0 siblings, 0 replies; 6+ messages in thread
From: Pranith Kumar @ 2014-07-25 19:33 UTC (permalink / raw)
  To: Paul McKenney
  Cc: Josh Triplett, Steven Rostedt, Mathieu Desnoyers, Lai Jiangshan,
	open list:READ-COPY UPDATE...

On Fri, Jul 25, 2014 at 2:06 PM, Paul E. McKenney
<paulmck@linux.vnet.ibm.com> wrote:
> On Fri, Jul 25, 2014 at 08:25:51AM -0700, Paul E. McKenney wrote:
>> On Thu, Jul 24, 2014 at 08:37:32PM -0400, Pranith Kumar wrote:
>> > This commit checks the return value of the zalloc_cpumask_var() used for
>> > allocating cpumask for rcu_nocb_mask.
>> >
>> > Signed-off-by: Pranith Kumar <bobby.prani@gmail.com>
>>
>> Hmmm...  I saw the check in the previous patch, but didn't see removal
>> of the later have_rcu_nocb_mask check.  Please see below.
>
> And events overtook this one.  Turns out that commit b58cc46c5f6b
> (rcu: Don't offload callbacks unless specifically requested) was not
> one of my best efforts.
>
> I will adapt your patch 2/2 in this series and apply it with your
> Signed-off-by.  Patch 1/2 is obsoleted by the current fix for
> commit b58cc46c5f6b.
>

OK. I am curious to see what problem you found in that commit.
I look forward to see your updated patch.

>> > ---
>> > v2: no change from v1
>> >
>> >  kernel/rcu/tree_plugin.h | 23 ++++++++++++-----------
>> >  1 file changed, 12 insertions(+), 11 deletions(-)
>> >
>> > diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
>> > index 520538a..9c9a01c 100644
>> > --- a/kernel/rcu/tree_plugin.h
>> > +++ b/kernel/rcu/tree_plugin.h
>> > @@ -54,7 +54,10 @@ static void __init rcu_bootup_announce_oddness_nocb(void)
>> >  {
>> >  #ifndef CONFIG_RCU_NOCB_CPU_NONE
>> >     if (!have_rcu_nocb_mask) {
>> > -           zalloc_cpumask_var(&rcu_nocb_mask, GFP_KERNEL);
>> > +           if (!zalloc_cpumask_var(&rcu_nocb_mask, GFP_KERNEL)) {
>> > +                   pr_info("rcu_nocb_mask allocation failed\n");
>> > +                   return;
>> > +           }
>> >             have_rcu_nocb_mask = true;
>> >     }
>> >  #ifdef CONFIG_RCU_NOCB_CPU_ZERO
>> > @@ -66,17 +69,15 @@ static void __init rcu_bootup_announce_oddness_nocb(void)
>> >     cpumask_copy(rcu_nocb_mask, cpu_possible_mask);
>> >  #endif /* #ifdef CONFIG_RCU_NOCB_CPU_ALL */
>> >  #endif /* #ifndef CONFIG_RCU_NOCB_CPU_NONE */
>> > -   if (have_rcu_nocb_mask) {
>> > -           if (!cpumask_subset(rcu_nocb_mask, cpu_possible_mask)) {
>> > -                   pr_info("\tNote: kernel parameter 'rcu_nocbs=' contains nonexistent CPUs.\n");
>> > -                   cpumask_and(rcu_nocb_mask, cpu_possible_mask,
>> > -                               rcu_nocb_mask);
>> > -           }
>> > -           cpulist_scnprintf(nocb_buf, sizeof(nocb_buf), rcu_nocb_mask);
>> > -           pr_info("\tOffload RCU callbacks from CPUs: %s.\n", nocb_buf);
>> > -           if (rcu_nocb_poll)
>> > -                   pr_info("\tPoll for callbacks from no-CBs CPUs.\n");
>> > +   if (!cpumask_subset(rcu_nocb_mask, cpu_possible_mask)) {
>>
>> What happens if CONFIG_RCU_NOCB_CPU_NONE=y and the rcu_nocbs= boot
>> parameter is not specified and we get here?
>>
>> In order to get visible failures when testing, build with
>> CONFIG_CPUMASK_OFFSTACK=y.
>>
>> > +           pr_info("\tNote: kernel parameter 'rcu_nocbs=' contains nonexistent CPUs.\n");
>> > +           cpumask_and(rcu_nocb_mask, cpu_possible_mask,
>> > +                           rcu_nocb_mask);
>> >     }
>> > +   cpulist_scnprintf(nocb_buf, sizeof(nocb_buf), rcu_nocb_mask);
>> > +   pr_info("\tOffload RCU callbacks from CPUs: %s.\n", nocb_buf);
>> > +   if (rcu_nocb_poll)
>> > +           pr_info("\tPoll for callbacks from no-CBs CPUs.\n");
>> >  }
>> >
>> >  /*
>> > --
>> > 2.0.1
>> >
>



-- 
Pranith

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2014-07-25 19:34 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-07-25  0:37 [PATCH v2 1/2] rcu: Create a function for rcu_nocb_mask boot time setup Pranith Kumar
2014-07-25  0:37 ` [PATCH v2 2/2] rcu: Check the return value of rcu_nocb_mask cpumask allocation Pranith Kumar
2014-07-25 15:25   ` Paul E. McKenney
2014-07-25 18:06     ` Paul E. McKenney
2014-07-25 19:33       ` Pranith Kumar
2014-07-25 15:27 ` [PATCH v2 1/2] rcu: Create a function for rcu_nocb_mask boot time setup Paul E. McKenney

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox