Add the MAP_PREFAULT_READ option to mmap(2).

Reviewed by:	jhb, kib
This commit is contained in:
Alan Cox 2010-08-28 16:57:07 +00:00
parent e7f8dd75b3
commit 74ffb9af15
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=211937
4 changed files with 19 additions and 4 deletions

View File

@ -28,7 +28,7 @@
.\" @(#)mmap.2 8.4 (Berkeley) 5/11/95
.\" $FreeBSD$
.\"
.Dd November 6, 2009
.Dd August 28, 2010
.Dt MMAP 2
.Os
.Sh NAME
@ -211,6 +211,19 @@ implements a coherent file system buffer cache.
However, it may be
used to associate dirty VM pages with file system buffers and thus cause
them to be flushed to physical media sooner rather than later.
.It Dv MAP_PREFAULT_READ
Immediately update the calling process's lowest-level virtual address
translation structures, such as its page table, so that every memory
resident page within the region is mapped for read access.
Ordinarily these structures are updated lazily.
The effect of this option is to eliminate any soft faults that would
otherwise occur on the initial read accesses to the region.
Although this option does not preclude
.Fa prot
from including
.Dv PROT_WRITE ,
it does not eliminate soft faults on the initial write accesses to the
region.
.It Dv MAP_PRIVATE
Modifications are private.
.It Dv MAP_SHARED

View File

@ -90,6 +90,7 @@
* Extended flags
*/
#define MAP_NOCORE 0x00020000 /* dont include these pages in a coredump */
#define MAP_PREFAULT_READ 0x00040000 /* prefault mapping for reading */
#endif /* __BSD_VISIBLE */
#if __POSIX_VISIBLE >= 199309

View File

@ -58,7 +58,7 @@
* in the range 5 to 9.
*/
#undef __FreeBSD_version
#define __FreeBSD_version 900018 /* Master, propagated to newvers */
#define __FreeBSD_version 900019 /* Master, propagated to newvers */
#ifndef LOCORE
#include <sys/types.h>

View File

@ -1467,9 +1467,10 @@ vm_mmap(vm_map_t map, vm_offset_t *addr, vm_size_t size, vm_prot_t prot,
*/
if (handle == 0)
foff = 0;
} else {
} else if (flags & MAP_PREFAULT_READ)
docow = MAP_PREFAULT;
else
docow = MAP_PREFAULT_PARTIAL;
}
if ((flags & (MAP_ANON|MAP_SHARED)) == 0)
docow |= MAP_COPY_ON_WRITE;