lkml.org 
[lkml]   [2019]   [Jan]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 11/13] KVM/nVMX: Use kvm_vcpu_map for accessing the shadow VMCS
    Date
    Use kvm_vcpu_map for accessing the shadow VMCS since using
    kvm_vcpu_gpa_to_page() and kmap() will only work for guest memory that has
    a "struct page".

    Signed-off-by: KarimAllah Ahmed <karahmed@amazon.de>
    ---
    v4 -> v5:
    - unmap with dirty flag
    ---
    arch/x86/kvm/vmx/nested.c | 25 ++++++++++++-------------
    1 file changed, 12 insertions(+), 13 deletions(-)

    diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c
    index b4230ce..04a8b43 100644
    --- a/arch/x86/kvm/vmx/nested.c
    +++ b/arch/x86/kvm/vmx/nested.c
    @@ -588,20 +588,20 @@ static inline bool nested_vmx_prepare_msr_bitmap(struct kvm_vcpu *vcpu,
    static void nested_cache_shadow_vmcs12(struct kvm_vcpu *vcpu,
    struct vmcs12 *vmcs12)
    {
    + struct kvm_host_map map;
    struct vmcs12 *shadow;
    - struct page *page;

    if (!nested_cpu_has_shadow_vmcs(vmcs12) ||
    vmcs12->vmcs_link_pointer == -1ull)
    return;

    shadow = get_shadow_vmcs12(vcpu);
    - page = kvm_vcpu_gpa_to_page(vcpu, vmcs12->vmcs_link_pointer);

    - memcpy(shadow, kmap(page), VMCS12_SIZE);
    + if (kvm_vcpu_map(vcpu, gpa_to_gfn(vmcs12->vmcs_link_pointer), &map))
    + return;

    - kunmap(page);
    - kvm_release_page_clean(page);
    + memcpy(shadow, map.hva, VMCS12_SIZE);
    + kvm_vcpu_unmap(&map, false);
    }

    static void nested_flush_cached_shadow_vmcs12(struct kvm_vcpu *vcpu,
    @@ -2637,9 +2637,9 @@ static int nested_vmx_check_vmentry_prereqs(struct kvm_vcpu *vcpu,
    static int nested_vmx_check_vmcs_link_ptr(struct kvm_vcpu *vcpu,
    struct vmcs12 *vmcs12)
    {
    - int r;
    - struct page *page;
    + int r = 0;
    struct vmcs12 *shadow;
    + struct kvm_host_map map;

    if (vmcs12->vmcs_link_pointer == -1ull)
    return 0;
    @@ -2647,17 +2647,16 @@ static int nested_vmx_check_vmcs_link_ptr(struct kvm_vcpu *vcpu,
    if (!page_address_valid(vcpu, vmcs12->vmcs_link_pointer))
    return -EINVAL;

    - page = kvm_vcpu_gpa_to_page(vcpu, vmcs12->vmcs_link_pointer);
    - if (is_error_page(page))
    + if (kvm_vcpu_map(vcpu, gpa_to_gfn(vmcs12->vmcs_link_pointer), &map))
    return -EINVAL;

    - r = 0;
    - shadow = kmap(page);
    + shadow = map.hva;
    +
    if (shadow->hdr.revision_id != VMCS12_REVISION ||
    shadow->hdr.shadow_vmcs != nested_cpu_has_shadow_vmcs(vmcs12))
    r = -EINVAL;
    - kunmap(page);
    - kvm_release_page_clean(page);
    +
    + kvm_vcpu_unmap(&map, false);
    return r;
    }

    --
    2.7.4
    \
     
     \ /
      Last update: 2019-01-09 10:43    [W:4.712 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site