Message ID | 20230110122042.1562155-13-dwmw2@infradead.org |
---|---|
State | New |
Headers | show |
Series | None | expand |
On 10/01/2023 12:20, David Woodhouse wrote: > From: David Woodhouse <dwmw@amazon.co.uk> > > They both do the same thing and just call sched_yield. This is enough to > stop the Linux guest panicking when running on a host kernel which doesn't > intercept SCHEDOP_poll and lets it reach userspace. > > Signed-off-by: David Woodhouse <dwmw@amazon.co.uk> Reviewed-by: Paul Durrant <paul@xen.org> ... with some observations... > --- > target/i386/kvm/xen-emu.c | 12 ++++++++++++ > 1 file changed, 12 insertions(+) > > diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c > index 5f2b55ef10..80005ea527 100644 > --- a/target/i386/kvm/xen-emu.c > +++ b/target/i386/kvm/xen-emu.c > @@ -227,6 +227,18 @@ static bool kvm_xen_hcall_sched_op(struct kvm_xen_exit *exit, X86CPU *cpu, > err = schedop_shutdown(cs, arg); > break; > > + case SCHEDOP_poll: > + /* > + * Linux will panic if this doesn't work. Just yield; it's not > + * worth overthinking it because wWith event channel handling Typo 'wWith'. Also possibly worth mentioning that the reason a yield is ok is because the semantics of the hypercall allow for spurious wake-up. > + * in KVM, the kernel will intercept this and it will never > + * reach QEMU anyway. > + */ > + case SCHEDOP_yield: > + sched_yield(); > + err = 0; > + break; > + > default: > return false; > }
diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 5f2b55ef10..80005ea527 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -227,6 +227,18 @@ static bool kvm_xen_hcall_sched_op(struct kvm_xen_exit *exit, X86CPU *cpu, err = schedop_shutdown(cs, arg); break; + case SCHEDOP_poll: + /* + * Linux will panic if this doesn't work. Just yield; it's not + * worth overthinking it because wWith event channel handling + * in KVM, the kernel will intercept this and it will never + * reach QEMU anyway. + */ + case SCHEDOP_yield: + sched_yield(); + err = 0; + break; + default: return false; }