vmm(4): fix race condition related to incorrect physical cpu tracking
authordv <dv@openbsd.org>
Mon, 17 May 2021 23:36:40 +0000 (23:36 +0000)
committerdv <dv@openbsd.org>
Mon, 17 May 2021 23:36:40 +0000 (23:36 +0000)
commitb931547982ad0bc035ad5580896a428a8fb01525
treef6d19671802691498a1102c9ce53083da8089b37
parent83714fa12aa34703bf2fcc5e2d25f7f8a463dae7
vmm(4): fix race condition related to incorrect physical cpu tracking

The race condition results in vmread errors when disabling interrupt
window exiting. The vmd(8) guest gets an EINVAL response to it's
VMM_IOC_RUN ioctl and aborts, sending the guest to an abrupt end.

Similarly to the recent SVM commit, this changes the vcpu run loop
logic to check for resuming on a different cpu. If so, the VMCS is
loaded onto the new cpu.

Instead of using just a "resume" flag, the real reason (other than cpu
switch) that would require reloading the VMCS is vmm may have cleared
the VMCS before yielding to the scheduler. The "resume" flag is still
used in vmx_enter_guest to toggle between vmlaunch/vmresume calls, but
is no longer the arbiter of if vmm reloads the VMCS or not.

A more subtle race condition still exists related to clearing the VMCS
on the previous cpu, but that's for a future commit.

OK mlarkin@
sys/arch/amd64/amd64/vmm.c