|
Alexander Graf |
18480d |
From: David Hildenbrand <david@redhat.com>
|
|
Alexander Graf |
18480d |
Date: Thu, 3 Aug 2017 18:11:04 +0200
|
|
Alexander Graf |
18480d |
Subject: KVM: nVMX: get rid of nested_get_page()
|
|
Alexander Graf |
18480d |
MIME-Version: 1.0
|
|
Alexander Graf |
18480d |
Content-Type: text/plain; charset=UTF-8
|
|
Alexander Graf |
18480d |
Content-Transfer-Encoding: 8bit
|
|
Alexander Graf |
18480d |
Patch-mainline: v4.14-rc1
|
|
Alexander Graf |
18480d |
Git-commit: 5e2f30b756a37bd80c5b0471d0e10d769ab2eb9a
|
|
Alexander Graf |
18480d |
References: bsc#1077761
|
|
Alexander Graf |
18480d |
|
|
Alexander Graf |
18480d |
nested_get_page() just sounds confusing. All we want is a page from G1.
|
|
Alexander Graf |
18480d |
This is even unrelated to nested.
|
|
Alexander Graf |
18480d |
|
|
Alexander Graf |
18480d |
Let's introduce kvm_vcpu_gpa_to_page() so we don't get too lengthy
|
|
Alexander Graf |
18480d |
lines.
|
|
Alexander Graf |
18480d |
|
|
Alexander Graf |
18480d |
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
Alexander Graf |
18480d |
Signed-off-by: David Hildenbrand <david@redhat.com>
|
|
Alexander Graf |
18480d |
Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
|
|
Alexander Graf |
18480d |
[Squash pasto fix from Wanpeng Li. - Paolo]
|
|
Alexander Graf |
18480d |
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
Alexander Graf |
18480d |
Acked-by: Alexander Graf <agraf@suse.de>
|
|
Alexander Graf |
18480d |
---
|
|
Alexander Graf |
18480d |
arch/x86/kvm/vmx.c | 57 +++++++++++++++++++++--------------------------
|
|
Alexander Graf |
18480d |
include/linux/kvm_host.h | 6 ++++
|
|
Alexander Graf |
18480d |
2 files changed, 32 insertions(+), 31 deletions(-)
|
|
Alexander Graf |
18480d |
|
|
Alexander Graf |
18480d |
--- a/arch/x86/kvm/vmx.c
|
|
Alexander Graf |
18480d |
+++ b/arch/x86/kvm/vmx.c
|
|
Alexander Graf |
18480d |
@@ -886,14 +886,6 @@
|
|
Alexander Graf |
18480d |
return to_vmx(vcpu)->nested.cached_vmcs12;
|
|
Alexander Graf |
18480d |
}
|
|
Alexander Graf |
18480d |
|
|
Alexander Graf |
18480d |
-static struct page *nested_get_page(struct kvm_vcpu *vcpu, gpa_t addr)
|
|
Alexander Graf |
18480d |
-{
|
|
Alexander Graf |
18480d |
- struct page *page = kvm_vcpu_gfn_to_page(vcpu, addr >> PAGE_SHIFT);
|
|
Alexander Graf |
18480d |
- if (is_error_page(page))
|
|
Alexander Graf |
18480d |
- return NULL;
|
|
Alexander Graf |
18480d |
-
|
|
Alexander Graf |
18480d |
- return page;
|
|
Alexander Graf |
18480d |
-}
|
|
Alexander Graf |
18480d |
|
|
Alexander Graf |
18480d |
static void nested_release_page(struct page *page)
|
|
Alexander Graf |
18480d |
{
|
|
Alexander Graf |
18480d |
@@ -7139,8 +7131,8 @@
|
|
Alexander Graf |
18480d |
return kvm_skip_emulated_instruction(vcpu);
|
|
Alexander Graf |
18480d |
}
|
|
Alexander Graf |
18480d |
|
|
Alexander Graf |
18480d |
- page = nested_get_page(vcpu, vmptr);
|
|
Alexander Graf |
18480d |
- if (page == NULL) {
|
|
Alexander Graf |
18480d |
+ page = kvm_vcpu_gpa_to_page(vcpu, vmptr);
|
|
Alexander Graf |
18480d |
+ if (is_error_page(page)) {
|
|
Alexander Graf |
18480d |
nested_vmx_failInvalid(vcpu);
|
|
Alexander Graf |
18480d |
return kvm_skip_emulated_instruction(vcpu);
|
|
Alexander Graf |
18480d |
}
|
|
Alexander Graf |
18480d |
@@ -7608,8 +7600,8 @@
|
|
Alexander Graf |
18480d |
if (vmx->nested.current_vmptr != vmptr) {
|
|
Alexander Graf |
18480d |
struct vmcs12 *new_vmcs12;
|
|
Alexander Graf |
18480d |
struct page *page;
|
|
Alexander Graf |
18480d |
- page = nested_get_page(vcpu, vmptr);
|
|
Alexander Graf |
18480d |
- if (page == NULL) {
|
|
Alexander Graf |
18480d |
+ page = kvm_vcpu_gpa_to_page(vcpu, vmptr);
|
|
Alexander Graf |
18480d |
+ if (is_error_page(page)) {
|
|
Alexander Graf |
18480d |
nested_vmx_failInvalid(vcpu);
|
|
Alexander Graf |
18480d |
return kvm_skip_emulated_instruction(vcpu);
|
|
Alexander Graf |
18480d |
}
|
|
Alexander Graf |
18480d |
@@ -9607,6 +9599,7 @@
|
|
Alexander Graf |
18480d |
struct vmcs12 *vmcs12)
|
|
Alexander Graf |
18480d |
{
|
|
Alexander Graf |
18480d |
struct vcpu_vmx *vmx = to_vmx(vcpu);
|
|
Alexander Graf |
18480d |
+ struct page *page;
|
|
Alexander Graf |
18480d |
u64 hpa;
|
|
Alexander Graf |
18480d |
|
|
Alexander Graf |
18480d |
if (nested_cpu_has2(vmcs12, SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES)) {
|
|
Alexander Graf |
18480d |
@@ -9616,17 +9609,19 @@
|
|
Alexander Graf |
18480d |
* physical address remains valid. We keep a reference
|
|
Alexander Graf |
18480d |
* to it so we can release it later.
|
|
Alexander Graf |
18480d |
*/
|
|
Alexander Graf |
18480d |
- if (vmx->nested.apic_access_page) /* shouldn't happen */
|
|
Alexander Graf |
18480d |
+ if (vmx->nested.apic_access_page) { /* shouldn't happen */
|
|
Alexander Graf |
18480d |
nested_release_page(vmx->nested.apic_access_page);
|
|
Alexander Graf |
18480d |
- vmx->nested.apic_access_page =
|
|
Alexander Graf |
18480d |
- nested_get_page(vcpu, vmcs12->apic_access_addr);
|
|
Alexander Graf |
18480d |
+ vmx->nested.apic_access_page = NULL;
|
|
Alexander Graf |
18480d |
+ }
|
|
Alexander Graf |
18480d |
+ page = kvm_vcpu_gpa_to_page(vcpu, vmcs12->apic_access_addr);
|
|
Alexander Graf |
18480d |
/*
|
|
Alexander Graf |
18480d |
* If translation failed, no matter: This feature asks
|
|
Alexander Graf |
18480d |
* to exit when accessing the given address, and if it
|
|
Alexander Graf |
18480d |
* can never be accessed, this feature won't do
|
|
Alexander Graf |
18480d |
* anything anyway.
|
|
Alexander Graf |
18480d |
*/
|
|
Alexander Graf |
18480d |
- if (vmx->nested.apic_access_page) {
|
|
Alexander Graf |
18480d |
+ if (!is_error_page(page)) {
|
|
Alexander Graf |
18480d |
+ vmx->nested.apic_access_page = page;
|
|
Alexander Graf |
18480d |
hpa = page_to_phys(vmx->nested.apic_access_page);
|
|
Alexander Graf |
18480d |
vmcs_write64(APIC_ACCESS_ADDR, hpa);
|
|
Alexander Graf |
18480d |
} else {
|
|
Alexander Graf |
18480d |
@@ -9641,10 +9636,11 @@
|
|
Alexander Graf |
18480d |
}
|
|
Alexander Graf |
18480d |
|
|
Alexander Graf |
18480d |
if (nested_cpu_has(vmcs12, CPU_BASED_TPR_SHADOW)) {
|
|
Alexander Graf |
18480d |
- if (vmx->nested.virtual_apic_page) /* shouldn't happen */
|
|
Alexander Graf |
18480d |
+ if (vmx->nested.virtual_apic_page) { /* shouldn't happen */
|
|
Alexander Graf |
18480d |
nested_release_page(vmx->nested.virtual_apic_page);
|
|
Alexander Graf |
18480d |
- vmx->nested.virtual_apic_page =
|
|
Alexander Graf |
18480d |
- nested_get_page(vcpu, vmcs12->virtual_apic_page_addr);
|
|
Alexander Graf |
18480d |
+ vmx->nested.virtual_apic_page = NULL;
|
|
Alexander Graf |
18480d |
+ }
|
|
Alexander Graf |
18480d |
+ page = kvm_vcpu_gpa_to_page(vcpu, vmcs12->virtual_apic_page_addr);
|
|
Alexander Graf |
18480d |
|
|
Alexander Graf |
18480d |
/*
|
|
Alexander Graf |
18480d |
* If translation failed, VM entry will fail because
|
|
Alexander Graf |
18480d |
@@ -9659,7 +9655,8 @@
|
|
Alexander Graf |
18480d |
* control. But such a configuration is useless, so
|
|
Alexander Graf |
18480d |
* let's keep the code simple.
|
|
Alexander Graf |
18480d |
*/
|
|
Alexander Graf |
18480d |
- if (vmx->nested.virtual_apic_page) {
|
|
Alexander Graf |
18480d |
+ if (!is_error_page(page)) {
|
|
Alexander Graf |
18480d |
+ vmx->nested.virtual_apic_page = page;
|
|
Alexander Graf |
18480d |
hpa = page_to_phys(vmx->nested.virtual_apic_page);
|
|
Alexander Graf |
18480d |
vmcs_write64(VIRTUAL_APIC_PAGE_ADDR, hpa);
|
|
Alexander Graf |
18480d |
}
|
|
Alexander Graf |
18480d |
@@ -9669,15 +9666,13 @@
|
|
Alexander Graf |
18480d |
if (vmx->nested.pi_desc_page) { /* shouldn't happen */
|
|
Alexander Graf |
18480d |
kunmap(vmx->nested.pi_desc_page);
|
|
Alexander Graf |
18480d |
nested_release_page(vmx->nested.pi_desc_page);
|
|
Alexander Graf |
18480d |
+ vmx->nested.pi_desc_page = NULL;
|
|
Alexander Graf |
18480d |
}
|
|
Alexander Graf |
18480d |
- vmx->nested.pi_desc_page =
|
|
Alexander Graf |
18480d |
- nested_get_page(vcpu, vmcs12->posted_intr_desc_addr);
|
|
Alexander Graf |
18480d |
- vmx->nested.pi_desc =
|
|
Alexander Graf |
18480d |
- (struct pi_desc *)kmap(vmx->nested.pi_desc_page);
|
|
Alexander Graf |
18480d |
- if (!vmx->nested.pi_desc) {
|
|
Alexander Graf |
18480d |
- nested_release_page_clean(vmx->nested.pi_desc_page);
|
|
Alexander Graf |
18480d |
+ page = kvm_vcpu_gpa_to_page(vcpu, vmcs12->posted_intr_desc_addr);
|
|
Alexander Graf |
18480d |
+ if (is_error_page(page))
|
|
Alexander Graf |
18480d |
return;
|
|
Alexander Graf |
18480d |
- }
|
|
Alexander Graf |
18480d |
+ vmx->nested.pi_desc_page = page;
|
|
Alexander Graf |
18480d |
+ vmx->nested.pi_desc = kmap(vmx->nested.pi_desc_page);
|
|
Alexander Graf |
18480d |
vmx->nested.pi_desc =
|
|
Alexander Graf |
18480d |
(struct pi_desc *)((void *)vmx->nested.pi_desc +
|
|
Alexander Graf |
18480d |
(unsigned long)(vmcs12->posted_intr_desc_addr &
|
|
Alexander Graf |
18480d |
@@ -9759,8 +9754,8 @@
|
|
Alexander Graf |
18480d |
if (!nested_cpu_has_virt_x2apic_mode(vmcs12))
|
|
Alexander Graf |
18480d |
return false;
|
|
Alexander Graf |
18480d |
|
|
Alexander Graf |
18480d |
- page = nested_get_page(vcpu, vmcs12->msr_bitmap);
|
|
Alexander Graf |
18480d |
- if (!page)
|
|
Alexander Graf |
18480d |
+ page = kvm_vcpu_gpa_to_page(vcpu, vmcs12->msr_bitmap);
|
|
Alexander Graf |
18480d |
+ if (is_error_page(page))
|
|
Alexander Graf |
18480d |
return false;
|
|
Alexander Graf |
18480d |
msr_bitmap_l1 = (unsigned long *)kmap(page);
|
|
Alexander Graf |
18480d |
|
|
Alexander Graf |
18480d |
@@ -11368,8 +11363,8 @@
|
|
Alexander Graf |
18480d |
|
|
Alexander Graf |
18480d |
gpa = vmcs_read64(GUEST_PHYSICAL_ADDRESS) & ~0xFFFull;
|
|
Alexander Graf |
18480d |
|
|
Alexander Graf |
18480d |
- page = nested_get_page(vcpu, vmcs12->pml_address);
|
|
Alexander Graf |
18480d |
- if (!page)
|
|
Alexander Graf |
18480d |
+ page = kvm_vcpu_gpa_to_page(vcpu, vmcs12->pml_address);
|
|
Alexander Graf |
18480d |
+ if (is_error_page(page))
|
|
Alexander Graf |
18480d |
return 0;
|
|
Alexander Graf |
18480d |
|
|
Alexander Graf |
18480d |
pml_address = kmap(page);
|
|
Alexander Graf |
18480d |
--- a/include/linux/kvm_host.h
|
|
Alexander Graf |
18480d |
+++ b/include/linux/kvm_host.h
|
|
Alexander Graf |
18480d |
@@ -985,6 +985,12 @@
|
|
Alexander Graf |
18480d |
return (hpa_t)pfn << PAGE_SHIFT;
|
|
Alexander Graf |
18480d |
}
|
|
Alexander Graf |
18480d |
|
|
Alexander Graf |
18480d |
+static inline struct page *kvm_vcpu_gpa_to_page(struct kvm_vcpu *vcpu,
|
|
Alexander Graf |
18480d |
+ gpa_t gpa)
|
|
Alexander Graf |
18480d |
+{
|
|
Alexander Graf |
18480d |
+ return kvm_vcpu_gfn_to_page(vcpu, gpa_to_gfn(gpa));
|
|
Alexander Graf |
18480d |
+}
|
|
Alexander Graf |
18480d |
+
|
|
Alexander Graf |
18480d |
static inline bool kvm_is_error_gpa(struct kvm *kvm, gpa_t gpa)
|
|
Alexander Graf |
18480d |
{
|
|
Alexander Graf |
18480d |
unsigned long hva = gfn_to_hva(kvm, gpa_to_gfn(gpa));
|