Module Name:    src
Committed By:   thorpej
Date:           Sun May 30 06:41:19 UTC 2021

Modified Files:
        src/sys/arch/alpha/alpha: pmap.c
        src/sys/arch/alpha/include: pmap.h

Log Message:
Store the modified / referenced attribute bits in the lower 2 bits of
the PV entry list pointer in struct vm_page_md.  This reduces the size
of that structure from 16 bytes to 8, and will go a fair way to making
up for increasing the size of struct pv_entry in a future commit.


To generate a diff of this commit:
cvs rdiff -u -r1.286 -r1.287 src/sys/arch/alpha/alpha/pmap.c
cvs rdiff -u -r1.92 -r1.93 src/sys/arch/alpha/include/pmap.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/alpha/alpha/pmap.c
diff -u src/sys/arch/alpha/alpha/pmap.c:1.286 src/sys/arch/alpha/alpha/pmap.c:1.287
--- src/sys/arch/alpha/alpha/pmap.c:1.286	Sun May 30 05:26:09 2021
+++ src/sys/arch/alpha/alpha/pmap.c	Sun May 30 06:41:19 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.286 2021/05/30 05:26:09 thorpej Exp $ */
+/* $NetBSD: pmap.c,v 1.287 2021/05/30 06:41:19 thorpej Exp $ */
 
 /*-
  * Copyright (c) 1998, 1999, 2000, 2001, 2007, 2008, 2020
@@ -135,7 +135,7 @@
 
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.286 2021/05/30 05:26:09 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.287 2021/05/30 06:41:19 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -2233,17 +2233,18 @@ pmap_enter(pmap_t pmap, vaddr_t va, padd
 	npte = ((pa >> PGSHIFT) << PG_SHIFT) | pte_prot(pmap, prot) | PG_V;
 	if (pg != NULL) {
 		struct vm_page_md * const md = VM_PAGE_TO_MD(pg);
-		int attrs;
+		uintptr_t attrs = 0;
 
 		KASSERT(((flags & VM_PROT_ALL) & ~prot) == 0);
 
-		lock = pmap_pvh_lock(pg);
-		mutex_enter(lock);
 		if (flags & VM_PROT_WRITE)
-			md->pvh_attrs |= (PGA_REFERENCED|PGA_MODIFIED);
+			attrs |= (PGA_REFERENCED|PGA_MODIFIED);
 		else if (flags & VM_PROT_ALL)
-			md->pvh_attrs |= PGA_REFERENCED;
-		attrs = md->pvh_attrs;
+			attrs |= PGA_REFERENCED;
+
+		lock = pmap_pvh_lock(pg);
+		mutex_enter(lock);
+		md->pvh_listx |= attrs;
 		mutex_exit(lock);
 
 		/* Set up referenced/modified emulation for new mapping. */
@@ -2779,10 +2780,10 @@ pmap_clear_modify(struct vm_page *pg)
 	lock = pmap_pvh_lock(pg);
 	mutex_enter(lock);
 
-	if (md->pvh_attrs & PGA_MODIFIED) {
+	if (md->pvh_listx & PGA_MODIFIED) {
 		rv = true;
 		pmap_changebit(pg, PG_FOW, ~0UL, &tlbctx);
-		md->pvh_attrs &= ~PGA_MODIFIED;
+		md->pvh_listx &= ~PGA_MODIFIED;
 	}
 
 	mutex_exit(lock);
@@ -2818,10 +2819,10 @@ pmap_clear_reference(struct vm_page *pg)
 	lock = pmap_pvh_lock(pg);
 	mutex_enter(lock);
 
-	if (md->pvh_attrs & PGA_REFERENCED) {
+	if (md->pvh_listx & PGA_REFERENCED) {
 		rv = true;
 		pmap_changebit(pg, PG_FOR | PG_FOW | PG_FOE, ~0UL, &tlbctx);
-		md->pvh_attrs &= ~PGA_REFERENCED;
+		md->pvh_listx &= ~PGA_REFERENCED;
 	}
 
 	mutex_exit(lock);
@@ -3133,10 +3134,10 @@ pmap_emulate_reference(struct lwp *l, va
 	mutex_enter(lock);
 
 	if (type == ALPHA_MMCSR_FOW) {
-		md->pvh_attrs |= (PGA_REFERENCED|PGA_MODIFIED);
+		md->pvh_listx |= (PGA_REFERENCED|PGA_MODIFIED);
 		faultoff = PG_FOR | PG_FOW;
 	} else {
-		md->pvh_attrs |= PGA_REFERENCED;
+		md->pvh_listx |= PGA_REFERENCED;
 		faultoff = PG_FOR;
 		if (exec) {
 			faultoff |= PG_FOE;
@@ -3173,7 +3174,7 @@ pmap_pv_dump(paddr_t pa)
 	lock = pmap_pvh_lock(pg);
 	mutex_enter(lock);
 
-	printf("pa 0x%lx (attrs = 0x%x):\n", pa, md->pvh_attrs);
+	printf("pa 0x%lx (attrs = 0x%x):\n", pa, md->pvh_listx & PGA_ATTRS);
 	for (pv = VM_MDPAGE_PVS(pg); pv != NULL; pv = pv->pv_next)
 		printf("     pmap %p, va 0x%lx\n",
 		    pv->pv_pmap, pv->pv_va);
@@ -3274,8 +3275,9 @@ pmap_pv_enter(pmap_t pmap, struct vm_pag
 	/*
 	 * ...and put it in the list.
 	 */
-	newpv->pv_next = md->pvh_list;
-	md->pvh_list = newpv;
+	uintptr_t const attrs = md->pvh_listx & PGA_ATTRS;
+	newpv->pv_next = (struct pv_entry *)(md->pvh_listx & ~PGA_ATTRS);
+	md->pvh_listx = (uintptr_t)newpv | attrs;
 
 	if (dolock) {
 		mutex_exit(lock);
@@ -3307,14 +3309,15 @@ pmap_pv_remove(pmap_t pmap, struct vm_pa
 	/*
 	 * Find the entry to remove.
 	 */
-	for (pvp = &md->pvh_list, pv = *pvp;
+	for (pvp = (struct pv_entry **)&md->pvh_listx, pv = VM_MDPAGE_PVS(pg);
 	     pv != NULL; pvp = &pv->pv_next, pv = *pvp)
 		if (pmap == pv->pv_pmap && va == pv->pv_va)
 			break;
 
 	KASSERT(pv != NULL);
 
-	*pvp = pv->pv_next;
+	*pvp = (pv_entry_t)((uintptr_t)pv->pv_next |
+			    (((uintptr_t)*pvp) & PGA_ATTRS));
 
 	if (dolock) {
 		mutex_exit(lock);

Index: src/sys/arch/alpha/include/pmap.h
diff -u src/sys/arch/alpha/include/pmap.h:1.92 src/sys/arch/alpha/include/pmap.h:1.93
--- src/sys/arch/alpha/include/pmap.h:1.92	Sun May 30 05:26:09 2021
+++ src/sys/arch/alpha/include/pmap.h	Sun May 30 06:41:19 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.h,v 1.92 2021/05/30 05:26:09 thorpej Exp $ */
+/* $NetBSD: pmap.h,v 1.93 2021/05/30 06:41:19 thorpej Exp $ */
 
 /*-
  * Copyright (c) 1998, 1999, 2000, 2001, 2007 The NetBSD Foundation, Inc.
@@ -177,9 +177,10 @@ typedef struct pv_entry {
 	pt_entry_t	*pv_pte;	/* PTE that maps the VA */
 } *pv_entry_t;
 
-/* pvh_attrs */
-#define	PGA_MODIFIED		0x01		/* modified */
-#define	PGA_REFERENCED		0x02		/* referenced */
+/* attrs in pvh_listx */
+#define	PGA_MODIFIED		0x01UL		/* modified */
+#define	PGA_REFERENCED		0x02UL		/* referenced */
+#define	PGA_ATTRS		(PGA_MODIFIED | PGA_REFERENCED)
 
 /* pvh_usage */
 #define	PGU_NORMAL		0		/* free or normal use */
@@ -214,9 +215,9 @@ pmap_remove_all(struct pmap *pmap)
 }
 
 #define	pmap_is_referenced(pg)						\
-	(((pg)->mdpage.pvh_attrs & PGA_REFERENCED) != 0)
+	(((pg)->mdpage.pvh_listx & PGA_REFERENCED) != 0)
 #define	pmap_is_modified(pg)						\
-	(((pg)->mdpage.pvh_attrs & PGA_MODIFIED) != 0)
+	(((pg)->mdpage.pvh_listx & PGA_MODIFIED) != 0)
 
 #define	PMAP_STEAL_MEMORY		/* enable pmap_steal_memory() */
 #define	PMAP_GROWKERNEL			/* enable pmap_growkernel() */
@@ -359,17 +360,15 @@ do {									\
  */
 #define	__HAVE_VM_PAGE_MD
 struct vm_page_md {
-	struct pv_entry *pvh_list;		/* pv_entry list */
-	int pvh_attrs;				/* page attributes */
+	uintptr_t pvh_listx;			/* pv_entry list + attrs */
 };
 
 #define	VM_MDPAGE_PVS(pg)						\
-	((pg)->mdpage.pvh_list)
+	((struct pv_entry *)((pg)->mdpage.pvh_listx & ~3UL))
 
 #define	VM_MDPAGE_INIT(pg)						\
 do {									\
-	(pg)->mdpage.pvh_list = NULL;					\
-	(pg)->mdpage.pvh_attrs = 0;					\
+	(pg)->mdpage.pvh_listx = 0UL;					\
 } while (/*CONSTCOND*/0)
 
 #endif /* _KERNEL */

Reply via email to