Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a6c372de authored by Rusty Russell's avatar Rusty Russell
Browse files

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
Loading
Loading
Loading
Loading
+3 −3
Original line number Original line Diff line number Diff line
@@ -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;
}
}


+2 −2
Original line number Original line Diff line number Diff line
@@ -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 {