# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Date 1189155842 -3600
# Node ID 1e2284d885fbe9fc0f18143ccce7fdcc30788e94
# Parent f30b59f550c2ac03734c7a8cb63f658f16ca087a
Fix potential kthread deadlock during Xen suspend.
kthread_create() depends on keventd, so it cannot be executed from
keventd. Replace use of kthread_create() with an approach based on
kernel_thread().
Based on an original patch by:
Signed-off-by: Ben Guthro <bguthro@xxxxxxxxxxxxxxx>
Signed-off-by: Robert Phillips <rphillips@xxxxxxxxxxxxxxx>
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
drivers/xen/core/reboot.c | 36 +++++++++++++++---------------------
1 files changed, 15 insertions(+), 21 deletions(-)
diff -r f30b59f550c2 -r 1e2284d885fb drivers/xen/core/reboot.c
--- a/drivers/xen/core/reboot.c Fri Aug 31 10:45:38 2007 +0100
+++ b/drivers/xen/core/reboot.c Fri Sep 07 10:04:02 2007 +0100
@@ -8,7 +8,6 @@
#include <asm/hypervisor.h>
#include <xen/xenbus.h>
#include <linux/kmod.h>
-#include <linux/kthread.h>
#include <linux/slab.h>
#include <linux/workqueue.h>
@@ -68,36 +67,31 @@ static int shutdown_process(void *__unus
static int xen_suspend(void *__unused)
{
- int err = __xen_suspend(fast_suspend);
+ int err;
+
+ daemonize("suspend");
+ err = set_cpus_allowed(current, cpumask_of_cpu(0));
+ if (err) {
+ printk(KERN_ERR "Xen suspend can't run on CPU0 (%d)\n", err);
+ goto out;
+ }
+
+ err = __xen_suspend(fast_suspend);
if (err)
printk(KERN_ERR "Xen suspend failed (%d)\n", err);
+
+ out:
shutting_down = SHUTDOWN_INVALID;
return 0;
}
-static int kthread_create_on_cpu(int (*f)(void *arg),
- void *arg,
- const char *name,
- int cpu)
-{
- struct task_struct *p;
- p = kthread_create(f, arg, name);
- if (IS_ERR(p))
- return PTR_ERR(p);
- kthread_bind(p, cpu);
- wake_up_process(p);
- return 0;
-}
-
static void __shutdown_handler(void *unused)
{
int err;
- if (shutting_down != SHUTDOWN_SUSPEND)
- err = kernel_thread(shutdown_process, NULL,
- CLONE_FS | CLONE_FILES);
- else
- err = kthread_create_on_cpu(xen_suspend, NULL, "suspend", 0);
+ err = kernel_thread((shutting_down == SHUTDOWN_SUSPEND) ?
+ xen_suspend : shutdown_process,
+ NULL, CLONE_FS | CLONE_FILES);
if (err < 0) {
printk(KERN_WARNING "Error creating shutdown process (%d): "
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|