kvm: x86: hyperv: Use APICv update request interface
Since disabling APICv has to be done for all vcpus on AMD-based system, adopt the newly introduced kvm_request_apicv_update() interface, and introduce a new APICV_INHIBIT_REASON_HYPERV. Also, remove the kvm_vcpu_deactivate_apicv() since no longer used. Cc: Roman Kagan <rkagan@virtuozzo.com> Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:

committed by
Paolo Bonzini

parent
6c3e4422dd
commit
f4fdc0a2ed
@@ -876,6 +876,7 @@ enum kvm_irqchip_mode {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#define APICV_INHIBIT_REASON_DISABLE 0
|
#define APICV_INHIBIT_REASON_DISABLE 0
|
||||||
|
#define APICV_INHIBIT_REASON_HYPERV 1
|
||||||
|
|
||||||
struct kvm_arch {
|
struct kvm_arch {
|
||||||
unsigned long n_used_mmu_pages;
|
unsigned long n_used_mmu_pages;
|
||||||
@@ -1483,7 +1484,6 @@ gpa_t kvm_mmu_gva_to_gpa_write(struct kvm_vcpu *vcpu, gva_t gva,
|
|||||||
gpa_t kvm_mmu_gva_to_gpa_system(struct kvm_vcpu *vcpu, gva_t gva,
|
gpa_t kvm_mmu_gva_to_gpa_system(struct kvm_vcpu *vcpu, gva_t gva,
|
||||||
struct x86_exception *exception);
|
struct x86_exception *exception);
|
||||||
|
|
||||||
void kvm_vcpu_deactivate_apicv(struct kvm_vcpu *vcpu);
|
|
||||||
bool kvm_apicv_activated(struct kvm *kvm);
|
bool kvm_apicv_activated(struct kvm *kvm);
|
||||||
void kvm_apicv_init(struct kvm *kvm, bool enable);
|
void kvm_apicv_init(struct kvm *kvm, bool enable);
|
||||||
void kvm_vcpu_update_apicv(struct kvm_vcpu *vcpu);
|
void kvm_vcpu_update_apicv(struct kvm_vcpu *vcpu);
|
||||||
|
@@ -776,9 +776,10 @@ int kvm_hv_activate_synic(struct kvm_vcpu *vcpu, bool dont_zero_synic_pages)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Hyper-V SynIC auto EOI SINT's are
|
* Hyper-V SynIC auto EOI SINT's are
|
||||||
* not compatible with APICV, so deactivate APICV
|
* not compatible with APICV, so request
|
||||||
|
* to deactivate APICV permanently.
|
||||||
*/
|
*/
|
||||||
kvm_vcpu_deactivate_apicv(vcpu);
|
kvm_request_apicv_update(vcpu->kvm, false, APICV_INHIBIT_REASON_HYPERV);
|
||||||
synic->active = true;
|
synic->active = true;
|
||||||
synic->dont_zero_synic_pages = dont_zero_synic_pages;
|
synic->dont_zero_synic_pages = dont_zero_synic_pages;
|
||||||
return 0;
|
return 0;
|
||||||
|
@@ -7318,7 +7318,8 @@ static bool svm_apic_init_signal_blocked(struct kvm_vcpu *vcpu)
|
|||||||
|
|
||||||
static bool svm_check_apicv_inhibit_reasons(ulong bit)
|
static bool svm_check_apicv_inhibit_reasons(ulong bit)
|
||||||
{
|
{
|
||||||
ulong supported = BIT(APICV_INHIBIT_REASON_DISABLE);
|
ulong supported = BIT(APICV_INHIBIT_REASON_DISABLE) |
|
||||||
|
BIT(APICV_INHIBIT_REASON_HYPERV);
|
||||||
|
|
||||||
return supported & BIT(bit);
|
return supported & BIT(bit);
|
||||||
}
|
}
|
||||||
|
@@ -7712,7 +7712,8 @@ static __exit void hardware_unsetup(void)
|
|||||||
|
|
||||||
static bool vmx_check_apicv_inhibit_reasons(ulong bit)
|
static bool vmx_check_apicv_inhibit_reasons(ulong bit)
|
||||||
{
|
{
|
||||||
ulong supported = BIT(APICV_INHIBIT_REASON_DISABLE);
|
ulong supported = BIT(APICV_INHIBIT_REASON_DISABLE) |
|
||||||
|
BIT(APICV_INHIBIT_REASON_HYPERV);
|
||||||
|
|
||||||
return supported & BIT(bit);
|
return supported & BIT(bit);
|
||||||
}
|
}
|
||||||
|
@@ -7457,19 +7457,6 @@ static void kvm_pv_kick_cpu_op(struct kvm *kvm, unsigned long flags, int apicid)
|
|||||||
kvm_irq_delivery_to_apic(kvm, NULL, &lapic_irq, NULL);
|
kvm_irq_delivery_to_apic(kvm, NULL, &lapic_irq, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void kvm_vcpu_deactivate_apicv(struct kvm_vcpu *vcpu)
|
|
||||||
{
|
|
||||||
if (!lapic_in_kernel(vcpu)) {
|
|
||||||
WARN_ON_ONCE(vcpu->arch.apicv_active);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!vcpu->arch.apicv_active)
|
|
||||||
return;
|
|
||||||
|
|
||||||
vcpu->arch.apicv_active = false;
|
|
||||||
kvm_x86_ops->refresh_apicv_exec_ctrl(vcpu);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool kvm_apicv_activated(struct kvm *kvm)
|
bool kvm_apicv_activated(struct kvm *kvm)
|
||||||
{
|
{
|
||||||
return (READ_ONCE(kvm->arch.apicv_inhibit_reasons) == 0);
|
return (READ_ONCE(kvm->arch.apicv_inhibit_reasons) == 0);
|
||||||
|
Reference in New Issue
Block a user