On Wed, Jan 09, 2019 at 10:42:05AM +0100, KarimAllah Ahmed wrote: > Use kvm_vcpu_map to the map the VMCS12 from guest memory because > kvm_vcpu_gpa_to_page() and kmap() will only work for guest memory that has > a "struct page". > > Signed-off-by: KarimAllah Ahmed <karahmed@xxxxxxxxx> Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> > --- > v4 -> v5: > - Switch to the new guest mapping API instead of reading directly from > guest. > - unmap with dirty flag > v3 -> v4: > - Return VMXERR_VMPTRLD_INCORRECT_VMCS_REVISION_ID on failure (jmattson@) > v1 -> v2: > - Massage commit message a bit. > --- > arch/x86/kvm/vmx/nested.c | 15 +++++++-------- > 1 file changed, 7 insertions(+), 8 deletions(-) > > diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c > index 536468a..5602b0c 100644 > --- a/arch/x86/kvm/vmx/nested.c > +++ b/arch/x86/kvm/vmx/nested.c > @@ -4521,11 +4521,10 @@ static int handle_vmptrld(struct kvm_vcpu *vcpu) > return 1; > > if (vmx->nested.current_vmptr != vmptr) { > + struct kvm_host_map map; > struct vmcs12 *new_vmcs12; > - struct page *page; > > - page = kvm_vcpu_gpa_to_page(vcpu, vmptr); > - if (is_error_page(page)) { > + if (kvm_vcpu_map(vcpu, gpa_to_gfn(vmptr), &map)) { > /* > * Reads from an unbacked page return all 1s, > * which means that the 32 bits located at the > @@ -4536,12 +4535,13 @@ static int handle_vmptrld(struct kvm_vcpu *vcpu) > VMXERR_VMPTRLD_INCORRECT_VMCS_REVISION_ID); > return kvm_skip_emulated_instruction(vcpu); > } > - new_vmcs12 = kmap(page); > + > + new_vmcs12 = map.hva; > + > if (new_vmcs12->hdr.revision_id != VMCS12_REVISION || > (new_vmcs12->hdr.shadow_vmcs && > !nested_cpu_has_vmx_shadow_vmcs(vcpu))) { > - kunmap(page); > - kvm_release_page_clean(page); > + kvm_vcpu_unmap(&map, false); > return nested_vmx_failValid(vcpu, > VMXERR_VMPTRLD_INCORRECT_VMCS_REVISION_ID); > } > @@ -4553,8 +4553,7 @@ static int handle_vmptrld(struct kvm_vcpu *vcpu) > * cached. > */ > memcpy(vmx->nested.cached_vmcs12, new_vmcs12, VMCS12_SIZE); > - kunmap(page); > - kvm_release_page_clean(page); > + kvm_vcpu_unmap(&map, false); > > set_current_vmptr(vmx, vmptr); > } > -- > 2.7.4 >