Merge branch 'kvm-lapic-fix-and-cleanup' into HEAD
[linux-block.git] / arch / x86 / kvm / vmx / vmx.c
index 73005d7e4e43c29bb03973bae40cc2bbe2ad1936..c788aa3826119fe051dcdd8dab7c0ae5857c4211 100644 (file)
@@ -3904,39 +3904,6 @@ static void seg_setup(int seg)
        vmcs_write32(sf->ar_bytes, ar);
 }
 
-static int alloc_apic_access_page(struct kvm *kvm)
-{
-       struct page *page;
-       void __user *hva;
-       int ret = 0;
-
-       mutex_lock(&kvm->slots_lock);
-       if (kvm->arch.apic_access_memslot_enabled)
-               goto out;
-       hva = __x86_set_memory_region(kvm, APIC_ACCESS_PAGE_PRIVATE_MEMSLOT,
-                                     APIC_DEFAULT_PHYS_BASE, PAGE_SIZE);
-       if (IS_ERR(hva)) {
-               ret = PTR_ERR(hva);
-               goto out;
-       }
-
-       page = gfn_to_page(kvm, APIC_DEFAULT_PHYS_BASE >> PAGE_SHIFT);
-       if (is_error_page(page)) {
-               ret = -EFAULT;
-               goto out;
-       }
-
-       /*
-        * Do not pin the page in memory, so that memory hot-unplug
-        * is able to migrate it.
-        */
-       put_page(page);
-       kvm->arch.apic_access_memslot_enabled = true;
-out:
-       mutex_unlock(&kvm->slots_lock);
-       return ret;
-}
-
 int allocate_vpid(void)
 {
        int vpid;
@@ -7490,7 +7457,7 @@ static int vmx_vcpu_create(struct kvm_vcpu *vcpu)
        vmx->loaded_vmcs = &vmx->vmcs01;
 
        if (cpu_need_virtualize_apic_accesses(vcpu)) {
-               err = alloc_apic_access_page(vcpu->kvm);
+               err = kvm_alloc_apic_access_page(vcpu->kvm);
                if (err)
                        goto free_vmcs;
        }
@@ -8129,17 +8096,16 @@ static void vmx_hardware_unsetup(void)
        free_kvm_area();
 }
 
-static bool vmx_check_apicv_inhibit_reasons(enum kvm_apicv_inhibit reason)
-{
-       ulong supported = BIT(APICV_INHIBIT_REASON_DISABLE) |
-                         BIT(APICV_INHIBIT_REASON_ABSENT) |
-                         BIT(APICV_INHIBIT_REASON_HYPERV) |
-                         BIT(APICV_INHIBIT_REASON_BLOCKIRQ) |
-                         BIT(APICV_INHIBIT_REASON_APIC_ID_MODIFIED) |
-                         BIT(APICV_INHIBIT_REASON_APIC_BASE_MODIFIED);
-
-       return supported & BIT(reason);
-}
+#define VMX_REQUIRED_APICV_INHIBITS                    \
+(                                                      \
+       BIT(APICV_INHIBIT_REASON_DISABLE)|              \
+       BIT(APICV_INHIBIT_REASON_ABSENT) |              \
+       BIT(APICV_INHIBIT_REASON_HYPERV) |              \
+       BIT(APICV_INHIBIT_REASON_BLOCKIRQ) |            \
+       BIT(APICV_INHIBIT_REASON_PHYSICAL_ID_ALIASED) | \
+       BIT(APICV_INHIBIT_REASON_APIC_ID_MODIFIED) |    \
+       BIT(APICV_INHIBIT_REASON_APIC_BASE_MODIFIED)    \
+)
 
 static void vmx_vm_destroy(struct kvm *kvm)
 {
@@ -8225,7 +8191,7 @@ static struct kvm_x86_ops vmx_x86_ops __initdata = {
        .refresh_apicv_exec_ctrl = vmx_refresh_apicv_exec_ctrl,
        .load_eoi_exitmap = vmx_load_eoi_exitmap,
        .apicv_post_state_restore = vmx_apicv_post_state_restore,
-       .check_apicv_inhibit_reasons = vmx_check_apicv_inhibit_reasons,
+       .required_apicv_inhibits = VMX_REQUIRED_APICV_INHIBITS,
        .hwapic_irr_update = vmx_hwapic_irr_update,
        .hwapic_isr_update = vmx_hwapic_isr_update,
        .guest_apic_has_interrupt = vmx_guest_apic_has_interrupt,