aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kvm/vmx/nested.c43
-rw-r--r--arch/x86/kvm/vmx/vmx.h2
2 files changed, 13 insertions, 32 deletions
diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c
index a00c4ded272d..69c505fcaad7 100644
--- a/arch/x86/kvm/vmx/nested.c
+++ b/arch/x86/kvm/vmx/nested.c
@@ -230,12 +230,8 @@ static void free_nested(struct kvm_vcpu *vcpu)
230 vmx->nested.apic_access_page = NULL; 230 vmx->nested.apic_access_page = NULL;
231 } 231 }
232 kvm_vcpu_unmap(vcpu, &vmx->nested.virtual_apic_map, true); 232 kvm_vcpu_unmap(vcpu, &vmx->nested.virtual_apic_map, true);
233 if (vmx->nested.pi_desc_page) { 233 kvm_vcpu_unmap(vcpu, &vmx->nested.pi_desc_map, true);
234 kunmap(vmx->nested.pi_desc_page); 234 vmx->nested.pi_desc = NULL;
235 kvm_release_page_dirty(vmx->nested.pi_desc_page);
236 vmx->nested.pi_desc_page = NULL;
237 vmx->nested.pi_desc = NULL;
238 }
239 235
240 kvm_mmu_free_roots(vcpu, &vcpu->arch.guest_mmu, KVM_MMU_ROOTS_ALL); 236 kvm_mmu_free_roots(vcpu, &vcpu->arch.guest_mmu, KVM_MMU_ROOTS_ALL);
241 237
@@ -2891,26 +2887,15 @@ static void nested_get_vmcs12_pages(struct kvm_vcpu *vcpu)
2891 } 2887 }
2892 2888
2893 if (nested_cpu_has_posted_intr(vmcs12)) { 2889 if (nested_cpu_has_posted_intr(vmcs12)) {
2894 if (vmx->nested.pi_desc_page) { /* shouldn't happen */ 2890 map = &vmx->nested.pi_desc_map;
2895 kunmap(vmx->nested.pi_desc_page); 2891
2896 kvm_release_page_dirty(vmx->nested.pi_desc_page); 2892 if (!kvm_vcpu_map(vcpu, gpa_to_gfn(vmcs12->posted_intr_desc_addr), map)) {
2897 vmx->nested.pi_desc_page = NULL; 2893 vmx->nested.pi_desc =
2898 vmx->nested.pi_desc = NULL; 2894 (struct pi_desc *)(((void *)map->hva) +
2899 vmcs_write64(POSTED_INTR_DESC_ADDR, -1ull); 2895 offset_in_page(vmcs12->posted_intr_desc_addr));
2896 vmcs_write64(POSTED_INTR_DESC_ADDR,
2897 pfn_to_hpa(map->pfn) + offset_in_page(vmcs12->posted_intr_desc_addr));
2900 } 2898 }
2901 page = kvm_vcpu_gpa_to_page(vcpu, vmcs12->posted_intr_desc_addr);
2902 if (is_error_page(page))
2903 return;
2904 vmx->nested.pi_desc_page = page;
2905 vmx->nested.pi_desc = kmap(vmx->nested.pi_desc_page);
2906 vmx->nested.pi_desc =
2907 (struct pi_desc *)((void *)vmx->nested.pi_desc +
2908 (unsigned long)(vmcs12->posted_intr_desc_addr &
2909 (PAGE_SIZE - 1)));
2910 vmcs_write64(POSTED_INTR_DESC_ADDR,
2911 page_to_phys(vmx->nested.pi_desc_page) +
2912 (unsigned long)(vmcs12->posted_intr_desc_addr &
2913 (PAGE_SIZE - 1)));
2914 } 2899 }
2915 if (nested_vmx_prepare_msr_bitmap(vcpu, vmcs12)) 2900 if (nested_vmx_prepare_msr_bitmap(vcpu, vmcs12))
2916 vmcs_set_bits(CPU_BASED_VM_EXEC_CONTROL, 2901 vmcs_set_bits(CPU_BASED_VM_EXEC_CONTROL,
@@ -3952,12 +3937,8 @@ void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason,
3952 vmx->nested.apic_access_page = NULL; 3937 vmx->nested.apic_access_page = NULL;
3953 } 3938 }
3954 kvm_vcpu_unmap(vcpu, &vmx->nested.virtual_apic_map, true); 3939 kvm_vcpu_unmap(vcpu, &vmx->nested.virtual_apic_map, true);
3955 if (vmx->nested.pi_desc_page) { 3940 kvm_vcpu_unmap(vcpu, &vmx->nested.pi_desc_map, true);
3956 kunmap(vmx->nested.pi_desc_page); 3941 vmx->nested.pi_desc = NULL;
3957 kvm_release_page_dirty(vmx->nested.pi_desc_page);
3958 vmx->nested.pi_desc_page = NULL;
3959 vmx->nested.pi_desc = NULL;
3960 }
3961 3942
3962 /* 3943 /*
3963 * We are now running in L2, mmu_notifier will force to reload the 3944 * We are now running in L2, mmu_notifier will force to reload the
diff --git a/arch/x86/kvm/vmx/vmx.h b/arch/x86/kvm/vmx/vmx.h
index b03b18cf9b6b..c0ff305d59f7 100644
--- a/arch/x86/kvm/vmx/vmx.h
+++ b/arch/x86/kvm/vmx/vmx.h
@@ -143,7 +143,7 @@ struct nested_vmx {
143 */ 143 */
144 struct page *apic_access_page; 144 struct page *apic_access_page;
145 struct kvm_host_map virtual_apic_map; 145 struct kvm_host_map virtual_apic_map;
146 struct page *pi_desc_page; 146 struct kvm_host_map pi_desc_map;
147 147
148 struct kvm_host_map msr_bitmap_map; 148 struct kvm_host_map msr_bitmap_map;
149 149