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