svn commit: r365267 - in head: lib/libc/sys sys/amd64/amd64 sys/arm/arm sys/arm64/arm64 sys/i386/i386 sys/powerpc/aim sys/riscv/riscv sys/sys sys/vm
Mark Johnston
markj at FreeBSD.org
Wed Sep 2 18:16:45 UTC 2020
Author: markj
Date: Wed Sep 2 18:16:43 2020
New Revision: 365267
URL: https://svnweb.freebsd.org/changeset/base/365267
Log:
Include the psind in data returned by mincore(2).
Currently we use a single bit to indicate whether the virtual page is
part of a superpage. To support a forthcoming implementation of
non-transparent 1GB superpages, it is useful to provide more detailed
information about large page sizes.
The change converts MINCORE_SUPER into a mask for MINCORE_PSIND(psind)
values, indicating a mapping of size psind, where psind is an index into
the pagesizes array returned by getpagesizes(3), which in turn comes
from the hw.pagesizes sysctl. MINCORE_PSIND(1) is equal to the old
value of MINCORE_SUPER.
For now, two bits are used to record the page size, permitting values
of MAXPAGESIZES up to 4.
Reviewed by: alc, kib
Sponsored by: Juniper Networks, Inc.
Sponsored by: Klara, Inc.
Differential Revision: https://reviews.freebsd.org/D26238
Modified:
head/lib/libc/sys/mincore.2
head/sys/amd64/amd64/pmap.c
head/sys/arm/arm/pmap-v6.c
head/sys/arm64/arm64/pmap.c
head/sys/i386/i386/pmap.c
head/sys/powerpc/aim/mmu_radix.c
head/sys/riscv/riscv/pmap.c
head/sys/sys/mman.h
head/sys/vm/vm_mmap.c
Modified: head/lib/libc/sys/mincore.2
==============================================================================
--- head/lib/libc/sys/mincore.2 Wed Sep 2 18:15:57 2020 (r365266)
+++ head/lib/libc/sys/mincore.2 Wed Sep 2 18:16:43 2020 (r365267)
@@ -28,7 +28,7 @@
.\" @(#)mincore.2 8.1 (Berkeley) 6/9/93
.\" $FreeBSD$
.\"
-.Dd January 7, 2019
+.Dd August 23, 2020
.Dt MINCORE 2
.Os
.Sh NAME
@@ -73,9 +73,19 @@ Page has been modified by us.
Page has been referenced.
.It Dv MINCORE_MODIFIED_OTHER
Page has been modified.
-.It Dv MINCORE_SUPER
+.It Dv MINCORE_PSIND(i)
Page is part of a large
.Pq Dq super
+page with size given by index
+.Dv i
+in the array returned by
+.Xr getpagesizes 3 .
+.It Dv MINCORE_SUPER
+A mask of the valid
+.Dv MINCORE_PSIND()
+values.
+If any bits in this mask are set, the page is part of a large
+.Pq Dq super
page.
.El
.Pp
@@ -98,6 +108,17 @@ and
statuses.
Otherwise, if the sysctl value is zero, all resident pages backing the
specified address range are examined, regardless of the mapping state.
+.Sh IMPLEMENTATION NOTES
+Prior to the introduction of
+.Dv MINCORE_PSIND()
+in
+.Fx 13.0 ,
+.Dv MINCORE_SUPER
+consisted of a single bit equal to
+.Dv MINCORE_PSIND(1) .
+In particular, applications compiled using the old value of
+.Dv MINCORE_SUPER
+will not identify large pages with size index 2 as being large pages.
.Sh RETURN VALUES
.Rv -std mincore
.Sh ERRORS
@@ -122,7 +143,8 @@ argument points to an illegal address.
.Xr mprotect 2 ,
.Xr msync 2 ,
.Xr munmap 2 ,
-.Xr getpagesize 3
+.Xr getpagesize 3 ,
+.Xr getpagesizes 3
.Sh HISTORY
The
.Fn mincore
Modified: head/sys/amd64/amd64/pmap.c
==============================================================================
--- head/sys/amd64/amd64/pmap.c Wed Sep 2 18:15:57 2020 (r365266)
+++ head/sys/amd64/amd64/pmap.c Wed Sep 2 18:16:43 2020 (r365267)
@@ -9149,7 +9149,7 @@ pmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t
/* Compute the physical address of the 4KB page. */
pa = ((*pdep & PG_PS_FRAME) | (addr & PDRMASK)) &
PG_FRAME;
- val = MINCORE_SUPER;
+ val = MINCORE_PSIND(1);
} else {
pte = *pmap_pde_to_pte(pdep, addr);
pa = pte & PG_FRAME;
Modified: head/sys/arm/arm/pmap-v6.c
==============================================================================
--- head/sys/arm/arm/pmap-v6.c Wed Sep 2 18:15:57 2020 (r365266)
+++ head/sys/arm/arm/pmap-v6.c Wed Sep 2 18:16:43 2020 (r365267)
@@ -6235,7 +6235,7 @@ pmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t
if (pte1_is_section(pte1)) {
pa = trunc_page(pte1_pa(pte1) | (addr & PTE1_OFFSET));
managed = pte1_is_managed(pte1);
- val = MINCORE_SUPER | MINCORE_INCORE;
+ val = MINCORE_PSIND(1) | MINCORE_INCORE;
if (pte1_is_dirty(pte1))
val |= MINCORE_MODIFIED | MINCORE_MODIFIED_OTHER;
if (pte1 & PTE1_A)
Modified: head/sys/arm64/arm64/pmap.c
==============================================================================
--- head/sys/arm64/arm64/pmap.c Wed Sep 2 18:15:57 2020 (r365266)
+++ head/sys/arm64/arm64/pmap.c Wed Sep 2 18:16:43 2020 (r365267)
@@ -5956,7 +5956,7 @@ pmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t
managed = (tpte & ATTR_SW_MANAGED) != 0;
val = MINCORE_INCORE;
if (lvl != 3)
- val |= MINCORE_SUPER;
+ val |= MINCORE_PSIND(3 - lvl);
if ((managed && pmap_pte_dirty(pmap, tpte)) || (!managed &&
(tpte & ATTR_S1_AP_RW_BIT) == ATTR_S1_AP(ATTR_S1_AP_RW)))
val |= MINCORE_MODIFIED | MINCORE_MODIFIED_OTHER;
Modified: head/sys/i386/i386/pmap.c
==============================================================================
--- head/sys/i386/i386/pmap.c Wed Sep 2 18:15:57 2020 (r365266)
+++ head/sys/i386/i386/pmap.c Wed Sep 2 18:16:43 2020 (r365267)
@@ -5755,7 +5755,7 @@ __CONCAT(PMTYPE, mincore)(pmap_t pmap, vm_offset_t add
/* Compute the physical address of the 4KB page. */
pa = ((pde & PG_PS_FRAME) | (addr & PDRMASK)) &
PG_FRAME;
- val = MINCORE_SUPER;
+ val = MINCORE_PSIND(1);
} else {
pte = pmap_pte_ufast(pmap, addr, pde);
pa = pte & PG_FRAME;
Modified: head/sys/powerpc/aim/mmu_radix.c
==============================================================================
--- head/sys/powerpc/aim/mmu_radix.c Wed Sep 2 18:15:57 2020 (r365266)
+++ head/sys/powerpc/aim/mmu_radix.c Wed Sep 2 18:16:43 2020 (r365267)
@@ -5689,7 +5689,7 @@ mmu_radix_mincore(pmap_t pmap, vm_offset_t addr, vm_pa
/* Compute the physical address of the 4KB page. */
pa = ((*l3ep & PG_PS_FRAME) | (addr & L3_PAGE_MASK)) &
PG_FRAME;
- val = MINCORE_SUPER;
+ val = MINCORE_PSIND(1);
} else {
pte = *pmap_l3e_to_pte(l3ep, addr);
pa = pte & PG_FRAME;
Modified: head/sys/riscv/riscv/pmap.c
==============================================================================
--- head/sys/riscv/riscv/pmap.c Wed Sep 2 18:15:57 2020 (r365266)
+++ head/sys/riscv/riscv/pmap.c Wed Sep 2 18:16:43 2020 (r365267)
@@ -4217,7 +4217,7 @@ pmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t
if (l2 != NULL && ((tpte = pmap_load(l2)) & PTE_V) != 0) {
if ((tpte & PTE_RWX) != 0) {
pa = PTE_TO_PHYS(tpte) | (addr & L2_OFFSET);
- val = MINCORE_INCORE | MINCORE_SUPER;
+ val = MINCORE_INCORE | MINCORE_PSIND(1);
} else {
l3 = pmap_l2_to_l3(l2, addr);
tpte = pmap_load(l3);
Modified: head/sys/sys/mman.h
==============================================================================
--- head/sys/sys/mman.h Wed Sep 2 18:15:57 2020 (r365266)
+++ head/sys/sys/mman.h Wed Sep 2 18:16:43 2020 (r365267)
@@ -179,7 +179,8 @@
#define MINCORE_MODIFIED 0x4 /* Page has been modified by us */
#define MINCORE_REFERENCED_OTHER 0x8 /* Page has been referenced */
#define MINCORE_MODIFIED_OTHER 0x10 /* Page has been modified */
-#define MINCORE_SUPER 0x20 /* Page is a "super" page */
+#define MINCORE_SUPER 0x60 /* Page is a "super" page */
+#define MINCORE_PSIND(i) (((i) << 5) & MINCORE_SUPER) /* Page size */
/*
* Anonymous object constant for shm_open().
Modified: head/sys/vm/vm_mmap.c
==============================================================================
--- head/sys/vm/vm_mmap.c Wed Sep 2 18:15:57 2020 (r365266)
+++ head/sys/vm/vm_mmap.c Wed Sep 2 18:16:43 2020 (r365267)
@@ -112,6 +112,8 @@ SYSCTL_INT(_vm, OID_AUTO, imply_prot_max, CTLFLAG_RWTU
#define MAP_32BIT_MAX_ADDR ((vm_offset_t)1 << 31)
#endif
+_Static_assert(MAXPAGESIZES <= 4, "MINCORE_SUPER too narrow");
+
#ifndef _SYS_SYSPROTO_H_
struct sbrk_args {
int incr;
More information about the svn-src-head
mailing list