Add a tunable which changes mincore(2) algorithm to only report data

from the local mapping.

Enable the setting by default.
The article behind the change: https://arxiv.org/abs/1901.01161

Reviewed by:	markj
Discussed with:	emaste
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D18764
This commit is contained in:
Konstantin Belousov 2019-01-07 22:10:48 +00:00
parent bba9cbe374
commit 3fbc2e00d1
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=342853
2 changed files with 28 additions and 3 deletions

View File

@ -28,7 +28,7 @@
.\" @(#)mincore.2 8.1 (Berkeley) 6/9/93
.\" $FreeBSD$
.\"
.Dd June 1, 2018
.Dd January 7, 2019
.Dt MINCORE 2
.Os
.Sh NAME
@ -47,7 +47,8 @@ system call determines whether each of the pages in the region beginning at
.Fa addr
and continuing for
.Fa len
bytes is resident.
bytes is resident or mapped, depending on the value of sysctl
.Va vm.mincore_mapped .
.\"The beginning address,
.\".Fa addr ,
.\"is first rounded down to a multiple of the page size (see
@ -85,6 +86,18 @@ The only way to ensure that a page is resident is to lock it into memory
with the
.Xr mlock 2
system call.
.Pp
If the
.Va vm.mincore_mapped
sysctl is set to a non-zero value (default), only the current process'
mappings of the pages in the specified virtual address range are examined.
This does not preclude the system from returning
.Dv MINCORE_REFERENCED_OTHER
and
.Dv MINCORE_MODIFIED_OTHER
statuses.
Otherwise, if the sysctl value is zero, all resident pages backing the
specified address range are examined, regardless of the mapping state.
.Sh RETURN VALUES
.Rv -std mincore
.Sh ERRORS

View File

@ -97,6 +97,9 @@ __FBSDID("$FreeBSD$");
int old_mlock = 0;
SYSCTL_INT(_vm, OID_AUTO, old_mlock, CTLFLAG_RWTUN, &old_mlock, 0,
"Do not apply RLIMIT_MEMLOCK on mlockall");
static int mincore_mapped = 1;
SYSCTL_INT(_vm, OID_AUTO, mincore_mapped, CTLFLAG_RWTUN, &mincore_mapped, 0,
"mincore reports mappings, not residency");
#ifdef MAP_32BIT
#define MAP_32BIT_MAX_ADDR ((vm_offset_t)1 << 31)
@ -808,7 +811,16 @@ kern_mincore(struct thread *td, uintptr_t addr0, size_t len, char *vec)
retry:
m = NULL;
mincoreinfo = pmap_mincore(pmap, addr, &locked_pa);
if (locked_pa != 0) {
if (mincore_mapped) {
/*
* We only care about this pmap's
* mapping of the page, if any.
*/
if (locked_pa != 0) {
vm_page_unlock(PHYS_TO_VM_PAGE(
locked_pa));
}
} else if (locked_pa != 0) {
/*
* The page is mapped by this process but not
* both accessed and modified. It is also