lkml.org 
[lkml]   [2019]   [Aug]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 09/15] svm: Add support for activate/deactivate AVIC at runtime
    Date
    Add necessary logics for supporting activate/deactivate AVIC at runtime.

    Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
    ---
    arch/x86/kvm/svm.c | 27 +++++++++++++++++++++++++--
    1 file changed, 25 insertions(+), 2 deletions(-)

    diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
    index 47f2439..cfa4b13 100644
    --- a/arch/x86/kvm/svm.c
    +++ b/arch/x86/kvm/svm.c
    @@ -385,6 +385,7 @@ struct amd_svm_iommu_ir {
    static void svm_flush_tlb(struct kvm_vcpu *vcpu, bool invalidate_gpa);
    static void svm_complete_interrupts(struct vcpu_svm *svm);
    static bool svm_get_enable_apicv(struct kvm *kvm);
    +static inline void avic_post_state_restore(struct kvm_vcpu *vcpu);

    static int nested_svm_exit_handled(struct vcpu_svm *svm);
    static int nested_svm_intercept(struct vcpu_svm *svm);
    @@ -2343,6 +2344,10 @@ static void svm_vcpu_blocking(struct kvm_vcpu *vcpu)

    static void svm_vcpu_unblocking(struct kvm_vcpu *vcpu)
    {
    + if (kvm_check_request(KVM_REQ_APICV_ACTIVATE, vcpu))
    + kvm_vcpu_activate_apicv(vcpu);
    + if (kvm_check_request(KVM_REQ_APICV_DEACTIVATE, vcpu))
    + kvm_vcpu_deactivate_apicv(vcpu);
    avic_set_running(vcpu, true);
    }

    @@ -5182,10 +5187,19 @@ static void svm_refresh_apicv_exec_ctrl(struct kvm_vcpu *vcpu)
    struct vcpu_svm *svm = to_svm(vcpu);
    struct vmcb *vmcb = svm->vmcb;

    - if (kvm_vcpu_apicv_active(vcpu))
    + if (kvm_vcpu_apicv_active(vcpu)) {
    + /**
    + * During AVIC temporary deactivation, guest could update
    + * APIC ID, DFR and LDR registers, which would not be trapped
    + * by avic_unaccelerated_ccess_interception(). In this case,
    + * we need to check and update the AVIC logical APIC ID table
    + * accordingly before re-activating.
    + */
    + avic_post_state_restore(vcpu);
    vmcb->control.int_ctl |= AVIC_ENABLE_MASK;
    - else
    + } else {
    vmcb->control.int_ctl &= ~AVIC_ENABLE_MASK;
    + }
    mark_dirty(vmcb, VMCB_AVIC);
    }

    @@ -7229,6 +7243,14 @@ static bool svm_need_emulation_on_page_fault(struct kvm_vcpu *vcpu)
    return false;
    }

    +static void svm_pre_update_apicv_exec_ctrl(struct kvm_vcpu *vcpu, bool activate)
    +{
    + if (activate)
    + avic_setup_access_page(vcpu, false);
    + else
    + avic_destroy_access_page(vcpu);
    +}
    +
    static struct kvm_x86_ops svm_x86_ops __ro_after_init = {
    .cpu_has_kvm_support = has_svm,
    .disabled_by_bios = is_disabled,
    @@ -7306,6 +7328,7 @@ static bool svm_need_emulation_on_page_fault(struct kvm_vcpu *vcpu)
    .set_virtual_apic_mode = svm_set_virtual_apic_mode,
    .get_enable_apicv = svm_get_enable_apicv,
    .refresh_apicv_exec_ctrl = svm_refresh_apicv_exec_ctrl,
    + .pre_update_apicv_exec_ctrl = svm_pre_update_apicv_exec_ctrl,
    .load_eoi_exitmap = svm_load_eoi_exitmap,
    .hwapic_irr_update = svm_hwapic_irr_update,
    .hwapic_isr_update = svm_hwapic_isr_update,
    --
    1.8.3.1
    \
     
     \ /
      Last update: 2019-08-15 18:56    [W:3.395 / U:0.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site