--- //depot/vendor/freebsd/src/sys/sys/mman.h 2008/03/28 04:30:29 +++ //depot/user/jhb/pat/sys/mman.h 2009/05/13 13:56:34 @@ -87,6 +87,8 @@ * Extended flags */ #define MAP_NOCORE 0x00020000 /* dont include these pages in a coredump */ +#define MAP_PREFAULT_READ 0x00040000 /* prefault mapping for reading */ +#define MAP_PREFAULT_WRITE 0x00080000 /* prefault mapping for writing */ #endif /* __BSD_VISIBLE */ #if __POSIX_VISIBLE >= 199309 --- //depot/vendor/freebsd/src/sys/vm/vm_mmap.c 2009/04/04 23:15:14 +++ //depot/user/jhb/pat/vm/vm_mmap.c 2009/05/14 19:54:38 @@ -1471,6 +1507,22 @@ if ((rv == KERN_SUCCESS) && (map->flags & MAP_WIREFUTURE)) vm_map_wire(map, *addr, *addr + size, VM_MAP_WIRE_USER|VM_MAP_WIRE_NOHOLES); + else if ((rv == KERN_SUCCESS) && + (flags & (MAP_PREFAULT_READ | MAP_PREFAULT_WRITE))) { + vm_offset_t va; + vm_size_t len; + int prot; + + prot = VM_PROT_READ; + if (flags & MAP_PREFAULT_WRITE) + prot |= VM_PROT_WRITE; + va = trunc_page(*addr); + len = size + (*addr - va); + for (; len > 0; va += PAGE_SIZE, len -= PAGE_SIZE) { + vm_fault(map, va, prot, (prot & VM_PROT_WRITE) ? + VM_FAULT_DIRTY : VM_FAULT_NORMAL); + } + } switch (rv) { case KERN_SUCCESS: