On Mon, Feb 5, 2018 at 10:49 AM KarimAllah Ahmed <karahmed@xxxxxxxxx> wrote: > @@ -7410,19 +7410,17 @@ static int handle_vmon(struct kvm_vcpu *vcpu) > return kvm_skip_emulated_instruction(vcpu); > } > - page = kvm_vcpu_gpa_to_page(vcpu, vmptr); > - if (is_error_page(page)) { > + if (!kvm_vcpu_gpa_to_host_mapping(vcpu, vmptr, &mapping, true)) { > nested_vmx_failInvalid(vcpu); > return kvm_skip_emulated_instruction(vcpu); > } > - if (*(u32 *)kmap(page) != VMCS12_REVISION) { > - kunmap(page); > - kvm_release_page_clean(page); > + if (*(u32 *)mapping.kaddr != VMCS12_REVISION) { > + kvm_release_host_mapping(&mapping, false); > nested_vmx_failInvalid(vcpu); > return kvm_skip_emulated_instruction(vcpu); > } > - kunmap(page); > - kvm_release_page_clean(page); > + > + kvm_release_host_mapping(&mapping, false); Why go through this explicit mapping/release dance? Why not just: uint32_t revision; ... if (kvm_read_guest(vcpu->kvm, vmptr, &revision, sizeof(revision)) || revision != VMCS12_REVISION) { nested_vmx_failInvalid(vcpu); return kvm_skip_emulated_instruction(vcpu); }