aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/lguest
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2009-06-13 00:27:01 -0400
committerRusty Russell <rusty@rustcorp.com.au>2009-06-12 08:57:01 -0400
commita6c372de6e4b9a8188b66badcee3e3792eccdd26 (patch)
treeb6b67f4cc447cc0ee8ae617bb503ef7d7f6e4958 /drivers/lguest
parentb43e352139f51216a8c56b0bd5fc3d4e05c65619 (diff)
lguest: fix lguest wake on guest clock tick, or fd activity
The Launcher could be inside the Guest on another CPU; wake_up_process will do nothing because it is "running". kick_process will knock it back into our kernel in this case, otherwise we'll miss it until the next guest exit. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'drivers/lguest')
-rw-r--r--drivers/lguest/interrupts_and_traps.c6
-rw-r--r--drivers/lguest/lguest_user.c4
2 files changed, 5 insertions, 5 deletions
diff --git a/drivers/lguest/interrupts_and_traps.c b/drivers/lguest/interrupts_and_traps.c
index 6e99adbe1946..9ea26ad88c9d 100644
--- a/drivers/lguest/interrupts_and_traps.c
+++ b/drivers/lguest/interrupts_and_traps.c
@@ -511,9 +511,9 @@ static enum hrtimer_restart clockdev_fn(struct hrtimer *timer)
511 511
512 /* Remember the first interrupt is the timer interrupt. */ 512 /* Remember the first interrupt is the timer interrupt. */
513 set_bit(0, cpu->irqs_pending); 513 set_bit(0, cpu->irqs_pending);
514 /* If the Guest is actually stopped, we need to wake it up. */ 514 /* Guest may be stopped or running on another CPU. */
515 if (cpu->halted) 515 if (!wake_up_process(cpu->tsk))
516 wake_up_process(cpu->tsk); 516 kick_process(cpu->tsk);
517 return HRTIMER_NORESTART; 517 return HRTIMER_NORESTART;
518} 518}
519 519
diff --git a/drivers/lguest/lguest_user.c b/drivers/lguest/lguest_user.c
index b8ee103eed5f..bcdcf3453e78 100644
--- a/drivers/lguest/lguest_user.c
+++ b/drivers/lguest/lguest_user.c
@@ -24,8 +24,8 @@ static int break_guest_out(struct lg_cpu *cpu, const unsigned long __user*input)
24 24
25 if (on) { 25 if (on) {
26 cpu->break_out = 1; 26 cpu->break_out = 1;
27 /* Pop it out of the Guest (may be running on different CPU) */ 27 if (!wake_up_process(cpu->tsk))
28 wake_up_process(cpu->tsk); 28 kick_process(cpu->tsk);
29 /* Wait for them to reset it */ 29 /* Wait for them to reset it */
30 return wait_event_interruptible(cpu->break_wq, !cpu->break_out); 30 return wait_event_interruptible(cpu->break_wq, !cpu->break_out);
31 } else { 31 } else {