On Wed, Apr 03, 2024 at 07:49:28AM -0700, Sean Christopherson <seanjc@xxxxxxxxxx> wrote: > On Wed, Apr 03, 2024, Chao Gao wrote: > > On Mon, Feb 26, 2024 at 12:26:50AM -0800, isaku.yamahata@xxxxxxxxx wrote: > > >From: Isaku Yamahata <isaku.yamahata@xxxxxxxxx> > > > > > >Wire up TDX PV HLT hypercall to the KVM backend function. > > > > > >Signed-off-by: Isaku Yamahata <isaku.yamahata@xxxxxxxxx> > > >--- > > >v19: > > >- move tdvps_state_non_arch_check() to this patch > > > > > >v18: > > >- drop buggy_hlt_workaround and use TDH.VP.RD(TD_VCPU_STATE_DETAILS) > > > > > >Signed-off-by: Isaku Yamahata <isaku.yamahata@xxxxxxxxx> > > >--- > > > arch/x86/kvm/vmx/tdx.c | 26 +++++++++++++++++++++++++- > > > arch/x86/kvm/vmx/tdx.h | 4 ++++ > > > 2 files changed, 29 insertions(+), 1 deletion(-) > > > > > >diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c > > >index eb68d6c148b6..a2caf2ae838c 100644 > > >--- a/arch/x86/kvm/vmx/tdx.c > > >+++ b/arch/x86/kvm/vmx/tdx.c > > >@@ -688,7 +688,18 @@ void tdx_vcpu_load(struct kvm_vcpu *vcpu, int cpu) > > > > > > bool tdx_protected_apic_has_interrupt(struct kvm_vcpu *vcpu) > > > { > > >- return pi_has_pending_interrupt(vcpu); > > >+ bool ret = pi_has_pending_interrupt(vcpu); > > > > Maybe > > bool has_pending_interrupt = pi_has_pending_interrupt(vcpu); > > > > "ret" isn't a good name. or even call pi_has_pending_interrupt() directly in > > the if statement below. > > Ya, or split the if-statement into multiple chucks, with comments explaining > what each non-intuitive chunk is doing. The pi_has_pending_interrupt(vcpu) check > is self-explanatory, the halted thing, not so much. They are terminal statements, > there's zero reason to pre-check the PID. > > E.g. > > /* > * Comment explaining why KVM needs to assume a non-halted vCPU has a > * pending interrupt (KVM can't see RFLAGS.IF). > */ > if (vcpu->arch.mp_state != KVM_MP_STATE_HALTED) > return true; > > if (pi_has_pending_interrupt(vcpu)) > return; > > > >+ union tdx_vcpu_state_details details; > > >+ struct vcpu_tdx *tdx = to_tdx(vcpu); > > >+ > > >+ if (ret || vcpu->arch.mp_state != KVM_MP_STATE_HALTED) > > >+ return true; > > > > Question: why mp_state matters here? > > >+ > > >+ if (tdx->interrupt_disabled_hlt) > > >+ return false; > > > > Shouldn't we move this into vt_interrupt_allowed()? VMX calls the function to > > check if interrupt is disabled. Chao, are you suggesting to implement tdx_interrupt_allowed() as "EXIT_REASON_HLT && a0" instead of "return true"? I don't think it makes sense because it's rare case and we can't avoid spurious wakeup for TDX case. > >KVM can clear tdx->interrupt_disabled_hlt on > > every TD-enter and set it only on TD-exit due to the guest making a > > TDVMCALL(hlt) w/ interrupt disabled. > > I'm pretty sure interrupt_disabled_hlt shouldn't exist, should "a0", a.k.a. r12, > be preserved at this point? > > /* Another comment explaning magic code. */ > if (to_vmx(vcpu)->exit_reason.basic == EXIT_REASON_HLT && > tdvmcall_a0_read(vcpu)) > return false; > > > Actually, can't this all be: > > if (to_vmx(vcpu)->exit_reason.basic != EXIT_REASON_HLT) > return true; > > if (!tdvmcall_a0_read(vcpu)) > return false; > > if (pi_has_pending_interrupt(vcpu)) > return true; > > return tdx_has_pending_virtual_interrupt(vcpu); > Thanks for the suggestion. This is much cleaner. Will update the function. -- Isaku Yamahata <isaku.yamahata@xxxxxxxxx>