lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Date:   Thu, 30 Nov 2017 16:45:57 -0800
From:   "Paul E. McKenney" <paulmck@...ux.vnet.ibm.com>
To:     Thomas Gleixner <tglx@...utronix.de>
Cc:     kernel test robot <xiaolong.ye@...el.com>,
        LKML <linux-kernel@...r.kernel.org>, lkp@...org,
        frederic@...nel.org
Subject: Re: [lkp-robot] [torture] b151f93a71:
 INFO:rcu_preempt_detected_stalls_on_CPUs/tasks

On Wed, Nov 29, 2017 at 02:38:06PM -0800, Paul E. McKenney wrote:
> On Wed, Nov 29, 2017 at 02:07:03PM -0800, Paul E. McKenney wrote:

[ . . . ]

> > And it converged to 5c4991e24c69 ("sched/isolation: Split out new
> > CONFIG_CPU_ISOLATION=y config from CONFIG_NO_HZ_FULL"), which is a bit
> > hard to believe.  Please see below for the log.  I will be retesting
> > some of the allegedly good commits, just in case.
> 
> And the bisection really did converge here.  It appears that splitting
> CONFIG_CPU_ISOLATION from CONFIG_NO_HZ_FULL isn't fully cooked.
> Adding CONFIG_CPU_ISOLATION=y to my tests causes them to pass, but I
> get the eternal wait for a three-jiffy timeout given CONFIG_NO_HZ_FULL=y
> and CONFIG_CPU_ISOLATION=n.  Both cases use CONFIG_NO_HZ_FULL_ALL=y.
> 
> Adding Frederic for his perspective.

And the next layer of this onion is 6f1982fedd59 ("sched/isolation:
Handle the nohz_full= parameter").  This one seems to have broken
CONFIG_NO_HZ_FULL_ALL:  If you have CONFIG_NO_HZ_FULL_ALL=y, but
don't supply the nohz_full= boot parameter, it is supposed to put all
but the boot CPU into nohz_full mode.  But the code doesn't do that.
The tick_nohz_init_all() function simply creates the tick_nohz_full_mask
and sets tick_nohz_full_running, but doesn't do any of the housekeeping
initialization that now appears to be required.

My path of least resistance is to just remove CONFIG_NO_HZ_FULL_ALL,
as in the following patch.  And the lack of bug reports leads me to believe
that I am the only one using this Kconfig option.

If someone else is using CONFIG_NO_HZ_FULL_ALL, I of course have no
problem with them putting forward an alternative patch that makes it
work correctly.  ;-)

With both patches applied, things appear to work much better.

							Thanx, Paul

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

commit cf3b2149af558fb4e09f486bf937256e5c7947fe
Author: Paul E. McKenney <paulmck@...ux.vnet.ibm.com>
Date:   Thu Nov 30 15:36:35 2017 -0800

    sched/isolation: Eliminate NO_HZ_FULL_ALL
    
    Commit 6f1982fedd59 ("sched/isolation: Handle the nohz_full= parameter")
    broke CONFIG_NO_HZ_FULL_ALL=y kernels.  This breakage is due to the code
    under CONFIG_NO_HZ_FULL_ALL failing to invoke the shiny new housekeeping
    functions.  This means that rcutorture scenario TREE04 now emits RCU CPU
    stall warnings due to the RCU grace-period kthreads not being awakened
    at a time of their choosing, or perhaps even not at all:
    
    [   27.731422] rcu_bh kthread starved for 21001 jiffies! g18446744073709551369 c18446744073709551368 f0x0 RCU_GP_WAIT_FQS(3) ->state=0x402 ->cpu=3
    [   27.731423] rcu_bh          I14936     9      2 0x80080000
    [   27.731435] Call Trace:
    [   27.731440]  __schedule+0x31a/0x6d0
    [   27.731442]  schedule+0x31/0x80
    [   27.731446]  schedule_timeout+0x15a/0x320
    [   27.731453]  ? call_timer_fn+0x130/0x130
    [   27.731457]  rcu_gp_kthread+0x66c/0xea0
    [   27.731458]  ? rcu_gp_kthread+0x66c/0xea0
    
    Because no one has complained about CONFIG_NO_HZ_FULL_ALL=y being broken,
    I hypothesize that no one is in fact using it, other than rcutorture.
    This commit therefore eliminates CONFIG_NO_HZ_FULL_ALL and updates
    rcutorture's config files to instead use the nohz_full= kernel parameter
    to put the desired CPUs into nohz_full mode.
    
    Fixes: 6f1982fedd59 ("sched/isolation: Handle the nohz_full= parameter")
    
    Reported-by: kernel test robot <xiaolong.ye@...el.com>
    Signed-off-by: Paul E. McKenney <paulmck@...ux.vnet.ibm.com>
    Cc: Frederic Weisbecker <frederic@...nel.org>
    Cc: Thomas Gleixner <tglx@...utronix.de>
    Cc: Chris Metcalf <cmetcalf@...lanox.com>
    Cc: Christoph Lameter <cl@...ux.com>
    Cc: Linus Torvalds <torvalds@...ux-foundation.org>
    Cc: Luiz Capitulino <lcapitulino@...hat.com>
    Cc: Mike Galbraith <efault@....de>
    Cc: Peter Zijlstra <peterz@...radead.org>
    Cc: Rik van Riel <riel@...hat.com>
    Cc: Wanpeng Li <kernellwp@...il.com>
    Cc: Ingo Molnar <mingo@...nel.org>
    Cc: John Stultz <john.stultz@...aro.org>
    Cc: Jonathan Corbet <corbet@....net>

diff --git a/Documentation/timers/NO_HZ.txt b/Documentation/timers/NO_HZ.txt
index 2dcaf9adb7a7..9591092da5e0 100644
--- a/Documentation/timers/NO_HZ.txt
+++ b/Documentation/timers/NO_HZ.txt
@@ -131,13 +131,6 @@ error message, and the boot CPU will be removed from the mask.  Note that
 this means that your system must have at least two CPUs in order for
 CONFIG_NO_HZ_FULL=y to do anything for you.
 
-Alternatively, the CONFIG_NO_HZ_FULL_ALL=y Kconfig parameter specifies
-that all CPUs other than the boot CPU are adaptive-ticks CPUs.  This
-Kconfig parameter will be overridden by the "nohz_full=" boot parameter,
-so that if both the CONFIG_NO_HZ_FULL_ALL=y Kconfig parameter and
-the "nohz_full=1" boot parameter is specified, the boot parameter will
-prevail so that only CPU 1 will be an adaptive-ticks CPU.
-
 Finally, adaptive-ticks CPUs must have their RCU callbacks offloaded.
 This is covered in the "RCU IMPLICATIONS" section below.
 
diff --git a/kernel/time/Kconfig b/kernel/time/Kconfig
index f6b5f19223d6..78eabc41eaa6 100644
--- a/kernel/time/Kconfig
+++ b/kernel/time/Kconfig
@@ -113,16 +113,6 @@ config NO_HZ_FULL
 
 endchoice
 
-config NO_HZ_FULL_ALL
-       bool "Full dynticks system on all CPUs by default (except CPU 0)"
-       depends on NO_HZ_FULL
-       help
-         If the user doesn't pass the nohz_full boot option to
-	 define the range of full dynticks CPUs, consider that all
-	 CPUs in the system are full dynticks by default.
-	 Note the boot CPU will still be kept outside the range to
-	 handle the timekeeping duty.
-
 config NO_HZ
 	bool "Old Idle dynticks config"
 	depends on !ARCH_USES_GETTIMEOFFSET && GENERIC_CLOCKEVENTS
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index 99578f06c8d4..ee10208148d5 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -405,30 +405,12 @@ static int tick_nohz_cpu_down(unsigned int cpu)
 	return 0;
 }
 
-static int tick_nohz_init_all(void)
-{
-	int err = -1;
-
-#ifdef CONFIG_NO_HZ_FULL_ALL
-	if (!alloc_cpumask_var(&tick_nohz_full_mask, GFP_KERNEL)) {
-		WARN(1, "NO_HZ: Can't allocate full dynticks cpumask\n");
-		return err;
-	}
-	err = 0;
-	cpumask_setall(tick_nohz_full_mask);
-	tick_nohz_full_running = true;
-#endif
-	return err;
-}
-
 void __init tick_nohz_init(void)
 {
 	int cpu, ret;
 
-	if (!tick_nohz_full_running) {
-		if (tick_nohz_init_all() < 0)
-			return;
-	}
+	if (!tick_nohz_full_running)
+		return;
 
 	/*
 	 * Full dynticks uses irq work to drive the tick rescheduling on safe
diff --git a/tools/testing/selftests/rcutorture/configs/rcu/TASKS03 b/tools/testing/selftests/rcutorture/configs/rcu/TASKS03
index c70c51d5ded1..28568b72a31b 100644
--- a/tools/testing/selftests/rcutorture/configs/rcu/TASKS03
+++ b/tools/testing/selftests/rcutorture/configs/rcu/TASKS03
@@ -9,5 +9,4 @@ CONFIG_PREEMPT=y
 CONFIG_HZ_PERIODIC=n
 CONFIG_NO_HZ_IDLE=n
 CONFIG_NO_HZ_FULL=y
-CONFIG_NO_HZ_FULL_ALL=y
 #CHECK#CONFIG_RCU_EXPERT=n
diff --git a/tools/testing/selftests/rcutorture/configs/rcu/TASKS03.boot b/tools/testing/selftests/rcutorture/configs/rcu/TASKS03.boot
index cd2a188eeb6d..838297c58318 100644
--- a/tools/testing/selftests/rcutorture/configs/rcu/TASKS03.boot
+++ b/tools/testing/selftests/rcutorture/configs/rcu/TASKS03.boot
@@ -1 +1 @@
-rcutorture.torture_type=tasks
+rcutorture.torture_type=tasks nohz_full=1
diff --git a/tools/testing/selftests/rcutorture/configs/rcu/TREE04 b/tools/testing/selftests/rcutorture/configs/rcu/TREE04
index 27d22695d64c..24c9f6012e35 100644
--- a/tools/testing/selftests/rcutorture/configs/rcu/TREE04
+++ b/tools/testing/selftests/rcutorture/configs/rcu/TREE04
@@ -7,7 +7,6 @@ CONFIG_PREEMPT=n
 CONFIG_HZ_PERIODIC=n
 CONFIG_NO_HZ_IDLE=n
 CONFIG_NO_HZ_FULL=y
-CONFIG_NO_HZ_FULL_ALL=y
 CONFIG_RCU_FAST_NO_HZ=y
 CONFIG_RCU_TRACE=y
 CONFIG_HOTPLUG_CPU=n
diff --git a/tools/testing/selftests/rcutorture/configs/rcu/TREE04.boot b/tools/testing/selftests/rcutorture/configs/rcu/TREE04.boot
index e34c33430447..e6071bb96c7d 100644
--- a/tools/testing/selftests/rcutorture/configs/rcu/TREE04.boot
+++ b/tools/testing/selftests/rcutorture/configs/rcu/TREE04.boot
@@ -1 +1 @@
-rcutorture.torture_type=rcu_bh rcutree.rcu_fanout_leaf=4
+rcutorture.torture_type=rcu_bh rcutree.rcu_fanout_leaf=4 nohz_full=1-7
diff --git a/tools/testing/selftests/rcutorture/configs/rcu/TREE07 b/tools/testing/selftests/rcutorture/configs/rcu/TREE07
index 0f4759f4232e..d7afb271a586 100644
--- a/tools/testing/selftests/rcutorture/configs/rcu/TREE07
+++ b/tools/testing/selftests/rcutorture/configs/rcu/TREE07
@@ -7,7 +7,6 @@ CONFIG_PREEMPT=n
 CONFIG_HZ_PERIODIC=n
 CONFIG_NO_HZ_IDLE=n
 CONFIG_NO_HZ_FULL=y
-CONFIG_NO_HZ_FULL_ALL=n
 CONFIG_RCU_FAST_NO_HZ=n
 CONFIG_RCU_TRACE=y
 CONFIG_HOTPLUG_CPU=y

Powered by blists - more mailing lists