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>
This commit is contained in:
Родитель
b43e352139
Коммит
a6c372de6e
|
@ -511,9 +511,9 @@ static enum hrtimer_restart clockdev_fn(struct hrtimer *timer)
|
|||
|
||||
/* 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;
|
||||
}
|
||||
|
||||
|
|
|
@ -24,8 +24,8 @@ static int break_guest_out(struct lg_cpu *cpu, const unsigned long __user*input)
|
|||
|
||||
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 {
|
||||
|
|
Загрузка…
Ссылка в новой задаче