From: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>
To: Rusty Russell <rusty@rustcorp.com.au>, linux-kernel@vger.kernel.org
Subject: [PATCH 2/3] stop_machine: add timeout for child thread deployment
Date: Tue, 29 Apr 2008 10:31:43 +0900 [thread overview]
Message-ID: <48167A7F.1010203@jp.fujitsu.com> (raw)
In-Reply-To: <481678F5.7080504@jp.fujitsu.com>
If stopmachine() invoked while one of onlined cpu is locked up
by some reason, stopmachine cannot finish its work because the
locked cpu cannot stop.
This patch allows stopmachine to return -EBUSY if any of
kstopmachine's child threads cannot start running on its target
cpu.
Signed-off-by: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>
---
kernel/stop_machine.c | 40 +++++++++++++++++++++++++++++++++++++++-
1 files changed, 39 insertions(+), 1 deletions(-)
Index: GIT-torvalds/kernel/stop_machine.c
===================================================================
--- GIT-torvalds.orig/kernel/stop_machine.c 2008-04-29 00:29:20.000000000 +0900
+++ GIT-torvalds/kernel/stop_machine.c 2008-04-29 00:31:55.000000000 +0900
@@ -29,6 +29,9 @@
static enum stopmachine_state stopmachine_state;
static unsigned int stopmachine_num_threads;
static atomic_t stopmachine_thread_ack;
+static atomic_t stopmachine_busy_exit;
+
+static unsigned long stopmachine_timeout = 5; /* secs, arbitrary */
static int stopmachine(void *cpu)
{
@@ -42,6 +45,7 @@
if (stopmachine_state == STOPMACHINE_EXIT)
goto exit;
+ /* If target cpu is on fire, this call can stuck */
set_cpus_allowed_ptr(current, &cpumask_of_cpu((int)(long)cpu));
/* Ack: we arrived */
@@ -83,6 +87,12 @@
if (prepared)
preempt_enable();
+ if (atomic_read(&stopmachine_busy_exit)) {
+ atomic_dec(&stopmachine_busy_exit);
+ printk(KERN_INFO "stopmachine: cpu#%d is not busy now.\n",
+ (int)(long)cpu);
+ }
+
return 0;
}
@@ -99,6 +109,15 @@
static int stop_machine(void)
{
int i, ret = 0;
+ unsigned long limit;
+
+ if (atomic_read(&stopmachine_busy_exit)) {
+ /*
+ * previous try was timeout, and still there is a unreachable
+ * cpu and abandoned child.
+ */
+ return -EBUSY;
+ }
atomic_set(&stopmachine_thread_ack, 0);
stopmachine_num_threads = 0;
@@ -113,10 +132,15 @@
stopmachine_num_threads++;
}
+ limit = jiffies + msecs_to_jiffies(stopmachine_timeout * MSEC_PER_SEC);
+
/* Wait for them all to come to life on the target. */
stopmachine_state = STOPMACHINE_DEPLOY;
while (atomic_read(&stopmachine_thread_ack) != stopmachine_num_threads)
- yield();
+ if (time_is_after_jiffies(limit))
+ yield();
+ else
+ goto deploy_timeout;
/* Now they are all started, make them hold the CPUs, ready. */
preempt_disable();
@@ -129,6 +153,20 @@
return 0;
+deploy_timeout:
+ printk(KERN_CRIT "stopmachine: Failed to stop machine in time(%lds). "
+ "Are there any CPUs on file?\n", stopmachine_timeout);
+
+ /* defer exit check to the beginning of next try. */
+ atomic_set(&stopmachine_busy_exit, stopmachine_num_threads);
+
+ printk(KERN_INFO "stopmachine: cpu#%d is initiator of failed stop.\n",
+ raw_smp_processor_id());
+ smp_wmb();
+ stopmachine_state = STOPMACHINE_EXIT;
+
+ return -EBUSY;
+
exit_threads:
/* Wait for them all to exit, since stop is canceled */
stopmachine_set_state(STOPMACHINE_EXIT);
next prev parent reply other threads:[~2008-04-29 1:32 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-04-29 1:25 [PATCH 0/3] patches for stop_machine Hidetoshi Seto
2008-04-29 1:29 ` [PATCH 1/3] stop_machine: short exit path for if we cannot create enough threads Hidetoshi Seto
2008-05-06 2:57 ` Rusty Russell
2008-04-29 1:31 ` Hidetoshi Seto [this message]
2008-04-29 1:33 ` [PATCH 3/3] stop_machine: add stopmachine_timeout sysctl entry Hidetoshi Seto
2008-04-29 2:25 ` [PATCH 0/3] patches for stop_machine Hidetoshi Seto
2008-05-02 20:33 ` Pavel Machek
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=48167A7F.1010203@jp.fujitsu.com \
--to=seto.hidetoshi@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=rusty@rustcorp.com.au \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox