Message ID | 20190712082907.29137-4-tao3.xu@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: x86: Enable user wait instructions | expand |
On Fri, Jul 12, 2019 at 04:29:07PM +0800, Tao Xu wrote: > --- a/arch/x86/kvm/vmx/nested.c > +++ b/arch/x86/kvm/vmx/nested.c > @@ -5213,6 +5213,9 @@ bool nested_vmx_exit_reflected(struct kvm_vcpu *vcpu, u32 exit_reason) > case EXIT_REASON_ENCLS: > /* SGX is never exposed to L1 */ > return false; > + case EXIT_REASON_UMWAIT: case EXIT_REASON_TPAUSE: Grouped case statements are usually stacked vertically, e.g.: case EXIT_REASON_UMWAIT: case EXIT_REASON_TPAUSE: > + return nested_cpu_has2(vmcs12, > + SECONDARY_EXEC_ENABLE_USR_WAIT_PAUSE); > default: > return true; > } > diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c > index 0787f140d155..e026b1313dc3 100644 > --- a/arch/x86/kvm/vmx/vmx.c > +++ b/arch/x86/kvm/vmx/vmx.c > @@ -5349,6 +5349,20 @@ static int handle_monitor(struct kvm_vcpu *vcpu) > return handle_nop(vcpu); > } > > +static int handle_umwait(struct kvm_vcpu *vcpu) > +{ > + kvm_skip_emulated_instruction(vcpu); > + WARN(1, "this should never happen\n"); Blech. I'm guessing this code was copy-pasted from handle_xsaves() and handle_xrstors(). The blurb of "this should never happen" isn't very helpful, e.g. the WARN itself makes it pretty obvious that we don't expect to reach this point. WARN_ONCE would also be preferable, no need to spam the log in the event things go completely haywire. Rather than propagate ugly code, what about defining a common helper, e.g. static int handle_unexpected_vmexit(struct kvm_vcpu *vcpu) { kvm_skip_emulated_instruction(vcpu); WARN_ONCE(1, "Unexpected VM-Exit = 0x%x", vmcs_read32(VM_EXIT_REASON)); return 1; } ... { [EXIT_REASON_XSAVES] = handle_unexpected_vmexit, [EXIT_REASON_XRSTORS] = handle_unexpected_vmexit, [EXIT_REASON_UMWAIT] = handle_unexpected_vmexit, [EXIT_REASON_TPAUSE] = handle_unexpected_vmexit, } > + return 1; > +} > + > +static int handle_tpause(struct kvm_vcpu *vcpu) > +{ > + kvm_skip_emulated_instruction(vcpu); > + WARN(1, "this should never happen\n"); > + return 1; > +} > + > static int handle_invpcid(struct kvm_vcpu *vcpu) > { > u32 vmx_instruction_info; > @@ -5559,6 +5573,8 @@ static int (*kvm_vmx_exit_handlers[])(struct kvm_vcpu *vcpu) = { > [EXIT_REASON_VMFUNC] = handle_vmx_instruction, > [EXIT_REASON_PREEMPTION_TIMER] = handle_preemption_timer, > [EXIT_REASON_ENCLS] = handle_encls, > + [EXIT_REASON_UMWAIT] = handle_umwait, > + [EXIT_REASON_TPAUSE] = handle_tpause, > }; > > static const int kvm_vmx_max_exit_handlers = > -- > 2.20.1 >
On 7/13/2019 12:03 AM, Sean Christopherson wrote: > On Fri, Jul 12, 2019 at 04:29:07PM +0800, Tao Xu wrote: >> --- a/arch/x86/kvm/vmx/nested.c >> +++ b/arch/x86/kvm/vmx/nested.c >> @@ -5213,6 +5213,9 @@ bool nested_vmx_exit_reflected(struct kvm_vcpu *vcpu, u32 exit_reason) >> case EXIT_REASON_ENCLS: >> /* SGX is never exposed to L1 */ >> return false; >> + case EXIT_REASON_UMWAIT: case EXIT_REASON_TPAUSE: > > Grouped case statements are usually stacked vertically, e.g.: > > case EXIT_REASON_UMWAIT: > case EXIT_REASON_TPAUSE: >Ok, thank you for your suggestion. >> + return nested_cpu_has2(vmcs12, >> + SECONDARY_EXEC_ENABLE_USR_WAIT_PAUSE); >> default: >> return true; >> } >> diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c >> index 0787f140d155..e026b1313dc3 100644 >> --- a/arch/x86/kvm/vmx/vmx.c >> +++ b/arch/x86/kvm/vmx/vmx.c >> @@ -5349,6 +5349,20 @@ static int handle_monitor(struct kvm_vcpu *vcpu) >> return handle_nop(vcpu); >> } >> >> +static int handle_umwait(struct kvm_vcpu *vcpu) >> +{ >> + kvm_skip_emulated_instruction(vcpu); >> + WARN(1, "this should never happen\n"); > > Blech. I'm guessing this code was copy-pasted from handle_xsaves() and > handle_xrstors(). The blurb of "this should never happen" isn't very > helpful, e.g. the WARN itself makes it pretty obvious that we don't expect > to reach this point. WARN_ONCE would also be preferable, no need to spam > the log in the event things go completely haywire. > > Rather than propagate ugly code, what about defining a common helper, e.g. > > static int handle_unexpected_vmexit(struct kvm_vcpu *vcpu) > { > kvm_skip_emulated_instruction(vcpu); > WARN_ONCE(1, "Unexpected VM-Exit = 0x%x", vmcs_read32(VM_EXIT_REASON)); > return 1; > } > > ... > { > [EXIT_REASON_XSAVES] = handle_unexpected_vmexit, > [EXIT_REASON_XRSTORS] = handle_unexpected_vmexit, > > [EXIT_REASON_UMWAIT] = handle_unexpected_vmexit, > [EXIT_REASON_TPAUSE] = handle_unexpected_vmexit, > > } > Thank you Sean, I will do this in next version of patch. >> + return 1; >> +} >> + >> +static int handle_tpause(struct kvm_vcpu *vcpu) >> +{ >> + kvm_skip_emulated_instruction(vcpu); >> + WARN(1, "this should never happen\n"); >> + return 1; >> +} >> + >> static int handle_invpcid(struct kvm_vcpu *vcpu) >> { >> u32 vmx_instruction_info; >> @@ -5559,6 +5573,8 @@ static int (*kvm_vmx_exit_handlers[])(struct kvm_vcpu *vcpu) = { >> [EXIT_REASON_VMFUNC] = handle_vmx_instruction, >> [EXIT_REASON_PREEMPTION_TIMER] = handle_preemption_timer, >> [EXIT_REASON_ENCLS] = handle_encls, >> + [EXIT_REASON_UMWAIT] = handle_umwait, >> + [EXIT_REASON_TPAUSE] = handle_tpause, >> }; >> >> static const int kvm_vmx_max_exit_handlers = >> -- >> 2.20.1 >>
diff --git a/arch/x86/include/uapi/asm/vmx.h b/arch/x86/include/uapi/asm/vmx.h index d213ec5c3766..d88d7a68849b 100644 --- a/arch/x86/include/uapi/asm/vmx.h +++ b/arch/x86/include/uapi/asm/vmx.h @@ -85,6 +85,8 @@ #define EXIT_REASON_PML_FULL 62 #define EXIT_REASON_XSAVES 63 #define EXIT_REASON_XRSTORS 64 +#define EXIT_REASON_UMWAIT 67 +#define EXIT_REASON_TPAUSE 68 #define VMX_EXIT_REASONS \ { EXIT_REASON_EXCEPTION_NMI, "EXCEPTION_NMI" }, \ @@ -142,7 +144,9 @@ { EXIT_REASON_RDSEED, "RDSEED" }, \ { EXIT_REASON_PML_FULL, "PML_FULL" }, \ { EXIT_REASON_XSAVES, "XSAVES" }, \ - { EXIT_REASON_XRSTORS, "XRSTORS" } + { EXIT_REASON_XRSTORS, "XRSTORS" }, \ + { EXIT_REASON_UMWAIT, "UMWAIT" }, \ + { EXIT_REASON_TPAUSE, "TPAUSE" } #define VMX_ABORT_SAVE_GUEST_MSR_FAIL 1 #define VMX_ABORT_LOAD_HOST_PDPTE_FAIL 2 diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c index a4d5da34b306..9f91f834ec43 100644 --- a/arch/x86/kvm/vmx/nested.c +++ b/arch/x86/kvm/vmx/nested.c @@ -5213,6 +5213,9 @@ bool nested_vmx_exit_reflected(struct kvm_vcpu *vcpu, u32 exit_reason) case EXIT_REASON_ENCLS: /* SGX is never exposed to L1 */ return false; + case EXIT_REASON_UMWAIT: case EXIT_REASON_TPAUSE: + return nested_cpu_has2(vmcs12, + SECONDARY_EXEC_ENABLE_USR_WAIT_PAUSE); default: return true; } diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index 0787f140d155..e026b1313dc3 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -5349,6 +5349,20 @@ static int handle_monitor(struct kvm_vcpu *vcpu) return handle_nop(vcpu); } +static int handle_umwait(struct kvm_vcpu *vcpu) +{ + kvm_skip_emulated_instruction(vcpu); + WARN(1, "this should never happen\n"); + return 1; +} + +static int handle_tpause(struct kvm_vcpu *vcpu) +{ + kvm_skip_emulated_instruction(vcpu); + WARN(1, "this should never happen\n"); + return 1; +} + static int handle_invpcid(struct kvm_vcpu *vcpu) { u32 vmx_instruction_info; @@ -5559,6 +5573,8 @@ static int (*kvm_vmx_exit_handlers[])(struct kvm_vcpu *vcpu) = { [EXIT_REASON_VMFUNC] = handle_vmx_instruction, [EXIT_REASON_PREEMPTION_TIMER] = handle_preemption_timer, [EXIT_REASON_ENCLS] = handle_encls, + [EXIT_REASON_UMWAIT] = handle_umwait, + [EXIT_REASON_TPAUSE] = handle_tpause, }; static const int kvm_vmx_max_exit_handlers =