lkml.org 
[lkml]   [2010]   [Nov]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [RFC PATCH v2 7/7] KVM: KVM: don't break vcpu 'halt' state due to apfs
    On 11/01/2010 08:55 PM, Gleb Natapov wrote:

    > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
    > index 2cfdf2d..f7aed95 100644
    > --- a/arch/x86/kvm/x86.c
    > +++ b/arch/x86/kvm/x86.c
    > @@ -5295,8 +5295,9 @@ static int __vcpu_run(struct kvm_vcpu *vcpu)
    > {
    > switch(vcpu->arch.mp_state) {
    > case KVM_MP_STATE_HALTED:
    > - vcpu->arch.mp_state =
    > - KVM_MP_STATE_RUNNABLE;
    > + if (list_empty_careful(&vcpu->async_pf.done))
    > + vcpu->arch.mp_state =
    > + KVM_MP_STATE_RUNNABLE;

    if nmi/interrupt and apfs completed event occur at the same time, we will miss to
    exit halt sate. Maybe we can check the pending event here, see below patch please.

    > case KVM_MP_STATE_RUNNABLE:
    > vcpu->arch.apf.halted = false;
    > break;
    > @@ -6279,6 +6280,7 @@ void kvm_arch_async_page_present(struct kvm_vcpu *vcpu,
    > vcpu->arch.fault.error_code = 0;
    > vcpu->arch.fault.address = work->arch.token;
    > kvm_inject_page_fault(vcpu);
    > + vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE;
    > }
    > }

    Have a stupid question, why we make the vcpu runnable here? Sorry i don't know
    kvm pv guest to much. :-(

    diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
    index 2044302..27a712b 100644
    --- a/arch/x86/kvm/x86.c
    +++ b/arch/x86/kvm/x86.c
    @@ -5267,6 +5267,12 @@ out:
    return r;
    }

    +static bool kvm_vcpu_leave_halt_state(struct kvm_vcpu *vcpu)
    +{
    + return vcpu->arch.nmi_pending ||
    + (kvm_arch_interrupt_allowed(vcpu) &&
    + kvm_cpu_has_interrupt(vcpu));
    +}

    static int __vcpu_run(struct kvm_vcpu *vcpu)
    {
    @@ -5299,8 +5305,9 @@ static int __vcpu_run(struct kvm_vcpu *vcpu)
    {
    switch(vcpu->arch.mp_state) {
    case KVM_MP_STATE_HALTED:
    - vcpu->arch.mp_state =
    - KVM_MP_STATE_RUNNABLE;
    + if (kvm_vcpu_leave_halt_state(vcpu))
    + vcpu->arch.mp_state =
    + KVM_MP_STATE_RUNNABLE;
    case KVM_MP_STATE_RUNNABLE:
    vcpu->arch.apf.halted = false;
    break;
    @@ -6113,9 +6120,7 @@ int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu)
    !vcpu->arch.apf.halted)
    || !list_empty_careful(&vcpu->async_pf.done)
    || vcpu->arch.mp_state == KVM_MP_STATE_SIPI_RECEIVED
    - || vcpu->arch.nmi_pending ||
    - (kvm_arch_interrupt_allowed(vcpu) &&
    - kvm_cpu_has_interrupt(vcpu));
    + || kvm_vcpu_leave_halt_state(vcpu);
    }

    void kvm_vcpu_kick(struct kvm_vcpu *vcpu)

    \
     
     \ /
      Last update: 2010-11-02 03:29    [W:0.028 / U:61.080 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site