[03/10] X86/nVMX: Update the PML table without mapping and unmapping the page
diff mbox

Message ID 1519235241-6500-4-git-send-email-karahmed@amazon.de
State New
Headers show

Commit Message

KarimAllah Ahmed Feb. 21, 2018, 5:47 p.m. UTC
... which also avoids using kvm_vcpu_gpa_to_page(..) which assumes that
there is a "struct page" for guest memory.

Signed-off-by: KarimAllah Ahmed <karahmed@amazon.de>
---
 arch/x86/kvm/vmx.c | 13 ++++---------
 1 file changed, 4 insertions(+), 9 deletions(-)

Comments

kernel test robot Feb. 23, 2018, 2:02 a.m. UTC | #1
Hi KarimAllah,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on tip/auto-latest]
[also build test WARNING on v4.16-rc2 next-20180222]
[cannot apply to kvm/linux-next]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/KarimAllah-Ahmed/KVM-X86-Handle-guest-memory-that-does-not-have-a-struct-page/20180223-064826
config: i386-allmodconfig (attached as .config)
compiler: gcc-7 (Debian 7.3.0-1) 7.3.0
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

All warnings (new ones prefixed by >>):

   arch/x86/kvm/vmx.c: In function 'vmx_write_pml_buffer':
>> arch/x86/kvm/vmx.c:11951:18: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
      dst = (gpa_t)(((u64 *)vmcs12->pml_address) + vmcs12->guest_pml_index);
                     ^
>> arch/x86/kvm/vmx.c:11951:9: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
      dst = (gpa_t)(((u64 *)vmcs12->pml_address) + vmcs12->guest_pml_index);
            ^

vim +11951 arch/x86/kvm/vmx.c

 11926	
 11927	static int vmx_write_pml_buffer(struct kvm_vcpu *vcpu)
 11928	{
 11929		struct vmcs12 *vmcs12;
 11930		struct vcpu_vmx *vmx = to_vmx(vcpu);
 11931		gpa_t gpa, dst;
 11932	
 11933		if (is_guest_mode(vcpu)) {
 11934			WARN_ON_ONCE(vmx->nested.pml_full);
 11935	
 11936			/*
 11937			 * Check if PML is enabled for the nested guest.
 11938			 * Whether eptp bit 6 is set is already checked
 11939			 * as part of A/D emulation.
 11940			 */
 11941			vmcs12 = get_vmcs12(vcpu);
 11942			if (!nested_cpu_has_pml(vmcs12))
 11943				return 0;
 11944	
 11945			if (vmcs12->guest_pml_index >= PML_ENTITY_NUM) {
 11946				vmx->nested.pml_full = true;
 11947				return 1;
 11948			}
 11949	
 11950			gpa = vmcs_read64(GUEST_PHYSICAL_ADDRESS) & ~0xFFFull;
 11951			dst = (gpa_t)(((u64 *)vmcs12->pml_address) + vmcs12->guest_pml_index);
 11952	
 11953			if (kvm_write_guest(vcpu->kvm, dst, &gpa, sizeof(gpa)))
 11954				return 0;
 11955	
 11956			vmcs12->guest_pml_index--;
 11957		}
 11958	
 11959		return 0;
 11960	}
 11961	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
Paolo Bonzini April 12, 2018, 3:03 p.m. UTC | #2
On 21/02/2018 18:47, KarimAllah Ahmed wrote:
> +		dst = (gpa_t)(((u64 *)vmcs12->pml_address) + vmcs12->guest_pml_index);

This is not a pointer, since it's in the guest.  Please use

  dst = vmcs12->pml_address + sizeof(u64) * vmcs12->guest_pml_index;

(It may also make sense to use kvm_write_guest_page if you prefer).

Thanks,

Paolo

> -		page = kvm_vcpu_gpa_to_page(vcpu, vmcs12->pml_address);
> -		if (is_error_page(page))
> +		if (kvm_write_guest(vcpu->kvm, dst, &gpa, sizeof(gpa)))
>  			return 0;

Patch
diff mbox

diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index e5653d2..0a98d1a 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -12111,9 +12111,7 @@  static int vmx_write_pml_buffer(struct kvm_vcpu *vcpu)
 {
 	struct vmcs12 *vmcs12;
 	struct vcpu_vmx *vmx = to_vmx(vcpu);
-	gpa_t gpa;
-	struct page *page = NULL;
-	u64 *pml_address;
+	gpa_t gpa, dst;
 
 	if (is_guest_mode(vcpu)) {
 		WARN_ON_ONCE(vmx->nested.pml_full);
@@ -12133,15 +12131,12 @@  static int vmx_write_pml_buffer(struct kvm_vcpu *vcpu)
 		}
 
 		gpa = vmcs_read64(GUEST_PHYSICAL_ADDRESS) & ~0xFFFull;
+		dst = (gpa_t)(((u64 *)vmcs12->pml_address) + vmcs12->guest_pml_index);
 
-		page = kvm_vcpu_gpa_to_page(vcpu, vmcs12->pml_address);
-		if (is_error_page(page))
+		if (kvm_write_guest(vcpu->kvm, dst, &gpa, sizeof(gpa)))
 			return 0;
 
-		pml_address = kmap(page);
-		pml_address[vmcs12->guest_pml_index--] = gpa;
-		kunmap(page);
-		kvm_release_page_clean(page);
+		vmcs12->guest_pml_index--;
 	}
 
 	return 0;