lkml.org 
[lkml]   [2022]   [Sep]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH v2 9/9] KVM: x86: never write to memory from kvm_vcpu_check_block
    On Thu, Aug 11, 2022, Paolo Bonzini wrote:
    > kvm_vcpu_check_block() is called while not in TASK_RUNNING, and therefore
    > it cannot sleep. Writing to guest memory is therefore forbidden, but it
    > can happen on AMD processors if kvm_check_nested_events() causes a vmexit.
    >
    > Fortunately, all events that are caught by kvm_check_nested_events() are
    > also recognized by kvm_vcpu_has_events() through vendor callbacks such as
    > kvm_x86_interrupt_allowed() or kvm_x86_ops.nested_ops->has_events(), so
    > remove the call and postpone the actual processing to vcpu_block().
    >
    > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    > ---
    > arch/x86/kvm/x86.c | 14 +++++++++++---
    > 1 file changed, 11 insertions(+), 3 deletions(-)
    >
    > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
    > index 5e9358ea112b..9226fd536783 100644
    > --- a/arch/x86/kvm/x86.c
    > +++ b/arch/x86/kvm/x86.c
    > @@ -10639,6 +10639,17 @@ static inline int vcpu_block(struct kvm_vcpu *vcpu)
    > return 1;
    > }
    >
    > + if (is_guest_mode(vcpu)) {
    > + /*
    > + * Evaluate nested events before exiting the halted state.
    > + * This allows the halt state to be recorded properly in
    > + * the VMCS12's activity state field (AMD does not have
    > + * a similar field and a vmexit always causes a spurious
    > + * wakeup from HLT).
    > + */
    > + kvm_check_nested_events(vcpu);

    Continuing the conversation with myself, this "needs" to check the return of
    kvm_check_nested_events(). In quotes because KVM just signals "internal error"
    if vmx_complete_nested_posted_interrupt() fails, i.e. the VM is likely dead anyways,
    but again it's odd that the return of kvm_apic_accept_events() is checked but the
    direct call to kvm_check_nested_events() is not.

    > + }
    > +
    > if (kvm_apic_accept_events(vcpu) < 0)
    > return 0;
    > switch(vcpu->arch.mp_state) {
    > @@ -10662,9 +10673,6 @@ static inline int vcpu_block(struct kvm_vcpu *vcpu)
    >
    > static inline bool kvm_vcpu_running(struct kvm_vcpu *vcpu)
    > {
    > - if (is_guest_mode(vcpu))
    > - kvm_check_nested_events(vcpu);
    > -
    > return (vcpu->arch.mp_state == KVM_MP_STATE_RUNNABLE &&
    > !vcpu->arch.apf.halted);
    > }
    > --
    > 2.31.1
    >

    \
     
     \ /
      Last update: 2022-09-20 02:57    [W:5.678 / U:0.684 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site