svn commit: r255858 - projects/bhyve_npt_pmap/sys/amd64/vmm

Neel Natu neel at FreeBSD.org
Tue Sep 24 18:46:18 UTC 2013


Author: neel
Date: Tue Sep 24 18:46:18 2013
New Revision: 255858
URL: http://svnweb.freebsd.org/changeset/base/255858

Log:
  Use 'vm_fault_quick_hold_pages()' to hold pages belonging to the guest address
  space before accessing them in the host.
  
  We used to use 'vm_fault_hold()' prior to this change. This worked correctly
  but had the drawback that it would 'pmap_enter()' the gpa->hpa mapping
  unconditionally in the nested pmap. This in turn would cause unnecessary
  superpage demotions and promotions if the 'gpa' happened to be a superpage
  mapping.
  
  Discussed with:	alc@, kib@

Modified:
  projects/bhyve_npt_pmap/sys/amd64/vmm/vmm.c

Modified: projects/bhyve_npt_pmap/sys/amd64/vmm/vmm.c
==============================================================================
--- projects/bhyve_npt_pmap/sys/amd64/vmm/vmm.c	Tue Sep 24 18:24:01 2013	(r255857)
+++ projects/bhyve_npt_pmap/sys/amd64/vmm/vmm.c	Tue Sep 24 18:46:18 2013	(r255858)
@@ -602,17 +602,17 @@ void *
 vm_gpa_hold(struct vm *vm, vm_paddr_t gpa, size_t len, int reqprot,
 	    void **cookie)
 {
-	int rv, pageoff;
+	int count, pageoff;
 	vm_page_t m;
 
 	pageoff = gpa & PAGE_MASK;
 	if (len > PAGE_SIZE - pageoff)
 		panic("vm_gpa_hold: invalid gpa/len: 0x%016lx/%lu", gpa, len);
 
-	rv = vm_fault_hold(&vm->vmspace->vm_map, trunc_page(gpa), reqprot,
-			   VM_FAULT_NORMAL, &m);
+	count = vm_fault_quick_hold_pages(&vm->vmspace->vm_map,
+	    trunc_page(gpa), PAGE_SIZE, reqprot, &m, 1);
 
-	if (rv == KERN_SUCCESS) {
+	if (count == 1) {
 		*cookie = m;
 		return ((void *)(PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m)) + pageoff));
 	} else {


More information about the svn-src-projects mailing list