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] [thread-next>] [day] [month] [year] [list]
Message-Id: <1369065716-22801-7-git-send-email-fweisbec@gmail.com>
Date:	Mon, 20 May 2013 18:01:54 +0200
From:	Frederic Weisbecker <fweisbec@...il.com>
To:	LKML <linux-kernel@...r.kernel.org>
Cc:	Frederic Weisbecker <fweisbec@...il.com>,
	"Srivatsa S. Bhat" <srivatsa.bhat@...ux.vnet.ibm.com>,
	Steven Rostedt <rostedt@...dmis.org>,
	"Paul E. McKenney" <paulmck@...ux.vnet.ibm.com>,
	Ingo Molnar <mingo@...nel.org>,
	Thomas Gleixner <tglx@...utronix.de>,
	Peter Zijlstra <peterz@...radead.org>,
	Borislav Petkov <bp@...en8.de>,
	Li Zhong <zhong@...ux.vnet.ibm.com>,
	Don Zickus <dzickus@...hat.com>
Subject: [RFC PATCH 6/8] kthread: Enable parking requests from setup() and unpark() callbacks

When the watchdog code is boot-disabled by the user, for example
through the 'nmi_watchdog=0' boot option, the setup() callback of
the watchdog kthread requests to park the task, and that until the
user later re-enables the watchdog through sysctl or procfs.

However the parking request is not well handled when done from
the setup() callback. After ->setup() is called, the generic smpboot
kthread loop directly tries to call the thread function or wait
for some event if ->thread_should_run() is false.

In the case of the watchdog kthread, ->thread_should_run() returns
false and the kthread goes to sleep and wait for the watchdog timer
to wake it up. But the timer is not enabled since the user requested
to disable the watchdog. We want the kthread to park instead of waiting
for events that can't happen.

As a result, later unpark requests after sysctl write through
'sysctl -w kernel.watchdog=1' won't wake up/unpark the task as
expected, since it's not parked anyway, leaving the value modified
without triggering any action.

We could workaround some solution in the watchdog code like forcing
one pass to the thread function and immediately return to park.

But supporting parking requests from ->setup() or ->unpark()
callbacks look like proper way to implement cancellation in
general. So let's fix it that way.

Signed-off-by: Frederic Weisbecker <fweisbec@...il.com>
Cc: Srivatsa S. Bhat <srivatsa.bhat@...ux.vnet.ibm.com>
Cc: Steven Rostedt <rostedt@...dmis.org>
Cc: Paul E. McKenney <paulmck@...ux.vnet.ibm.com>
Cc: Ingo Molnar <mingo@...nel.org>
Cc: Thomas Gleixner <tglx@...utronix.de>
Cc: Peter Zijlstra <peterz@...radead.org>
Cc: Borislav Petkov <bp@...en8.de>
Cc: Li Zhong <zhong@...ux.vnet.ibm.com>
Cc: Don Zickus <dzickus@...hat.com>
---
 kernel/smpboot.c |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/kernel/smpboot.c b/kernel/smpboot.c
index 02fc5c9..3394ed0 100644
--- a/kernel/smpboot.c
+++ b/kernel/smpboot.c
@@ -151,6 +151,12 @@ static int smpboot_thread_fn(void *data)
 			break;
 		}
 
+		/* Check if setup or unpark actually want us to park */
+		if (kthread_should_stop() || kthread_should_park()) {
+			preempt_enable();
+			continue;
+		}
+
 		if (!ht->thread_should_run(td->cpu)) {
 			preempt_enable();
 			schedule();
-- 
1.7.5.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ