Commit a6c372de authored by Rusty Russell's avatar Rusty Russell

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: default avatarRusty Russell <rusty@rustcorp.com.au>
parent b43e3521
...@@ -511,9 +511,9 @@ static enum hrtimer_restart clockdev_fn(struct hrtimer *timer) ...@@ -511,9 +511,9 @@ static enum hrtimer_restart clockdev_fn(struct hrtimer *timer)
/* Remember the first interrupt is the timer interrupt. */ /* Remember the first interrupt is the timer interrupt. */
set_bit(0, cpu->irqs_pending); set_bit(0, cpu->irqs_pending);
/* If the Guest is actually stopped, we need to wake it up. */ /* Guest may be stopped or running on another CPU. */
if (cpu->halted) if (!wake_up_process(cpu->tsk))
wake_up_process(cpu->tsk); kick_process(cpu->tsk);
return HRTIMER_NORESTART; return HRTIMER_NORESTART;
} }
......
...@@ -24,8 +24,8 @@ static int break_guest_out(struct lg_cpu *cpu, const unsigned long __user*input) ...@@ -24,8 +24,8 @@ static int break_guest_out(struct lg_cpu *cpu, const unsigned long __user*input)
if (on) { if (on) {
cpu->break_out = 1; cpu->break_out = 1;
/* Pop it out of the Guest (may be running on different CPU) */ if (!wake_up_process(cpu->tsk))
wake_up_process(cpu->tsk); kick_process(cpu->tsk);
/* Wait for them to reset it */ /* Wait for them to reset it */
return wait_event_interruptible(cpu->break_wq, !cpu->break_out); return wait_event_interruptible(cpu->break_wq, !cpu->break_out);
} else { } else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment