diff options
| -rw-r--r-- | arch/x86/kvm/vmx/nested.c | 43 | ||||
| -rw-r--r-- | arch/x86/kvm/vmx/vmx.h | 2 |
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 | ||
