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>
/* Remember the first interrupt is the timer interrupt. */
set_bit(0, cpu->irqs_pending);
- /* If the Guest is actually stopped, we need to wake it up. */
- if (cpu->halted)
- wake_up_process(cpu->tsk);
+ /* Guest may be stopped or running on another CPU. */
+ if (!wake_up_process(cpu->tsk))
+ kick_process(cpu->tsk);
return HRTIMER_NORESTART;
}
if (on) {
cpu->break_out = 1;
- /* Pop it out of the Guest (may be running on different CPU) */
- wake_up_process(cpu->tsk);
+ if (!wake_up_process(cpu->tsk))
+ kick_process(cpu->tsk);
/* Wait for them to reset it */
return wait_event_interruptible(cpu->break_wq, !cpu->break_out);
} else {