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