Module Name:    src
Committed By:   uebayasi
Date:           Wed Feb 10 15:37:48 UTC 2010

Modified Files:
        src/sys/arch/arm/arm32 [uebayasi-xip]: pmap.c

Log Message:
Replace all remaining pg->mdpage references with VM_PAGE_TO_MD().  Now struct
vm_page * is fully opaque.


To generate a diff of this commit:
cvs rdiff -u -r1.211.2.5 -r1.211.2.6 src/sys/arch/arm/arm32/pmap.c

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/arm/arm32/pmap.c
diff -u src/sys/arch/arm/arm32/pmap.c:1.211.2.5 src/sys/arch/arm/arm32/pmap.c:1.211.2.6
--- src/sys/arch/arm/arm32/pmap.c:1.211.2.5	Wed Feb 10 14:18:30 2010
+++ src/sys/arch/arm/arm32/pmap.c	Wed Feb 10 15:37:48 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.211.2.5 2010/02/10 14:18:30 uebayasi Exp $	*/
+/*	$NetBSD: pmap.c,v 1.211.2.6 2010/02/10 15:37:48 uebayasi Exp $	*/
 
 /*
  * Copyright 2003 Wasabi Systems, Inc.
@@ -211,7 +211,7 @@
 #include <machine/param.h>
 #include <arm/arm32/katelib.h>
 
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.211.2.5 2010/02/10 14:18:30 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.211.2.6 2010/02/10 15:37:48 uebayasi Exp $");
 
 #ifdef PMAP_DEBUG
 
@@ -2122,6 +2122,7 @@
 static void
 pmap_clearbit(struct vm_page *pg, u_int maskbits)
 {
+	struct vm_page_md *md = VM_PAGE_TO_MD(pg);
 	struct l2_bucket *l2b;
 	struct pv_entry *pv;
 	pt_entry_t *ptep, npte, opte;
@@ -2129,7 +2130,7 @@
 	vaddr_t va;
 	u_int oflags;
 #ifdef PMAP_CACHE_VIPT
-	const bool want_syncicache = PV_IS_EXEC_P(pg->mdpage.pvh_attrs);
+	const bool want_syncicache = PV_IS_EXEC_P(md->pvh_attrs);
 	bool need_syncicache = false;
 	bool did_syncicache = false;
 	bool need_vac_me_harder = false;
@@ -2140,7 +2141,7 @@
 	    pg, VM_PAGE_TO_PHYS(pg), maskbits));
 
 	PMAP_HEAD_TO_MAP_LOCK();
-	simple_lock(&pg->mdpage.pvh_slock);
+	simple_lock(&md->pvh_slock);
 
 #ifdef PMAP_CACHE_VIPT
 	/*
@@ -2148,25 +2149,25 @@
 	 * then we know we definitely need to sync or discard it.
 	 */
 	if (want_syncicache)
-		need_syncicache = pg->mdpage.pvh_attrs & PVF_MOD;
+		need_syncicache = md->pvh_attrs & PVF_MOD;
 #endif
 	/*
 	 * Clear saved attributes (modify, reference)
 	 */
-	pg->mdpage.pvh_attrs &= ~(maskbits & (PVF_MOD | PVF_REF));
+	md->pvh_attrs &= ~(maskbits & (PVF_MOD | PVF_REF));
 
-	if (SLIST_EMPTY(&pg->mdpage.pvh_list)) {
+	if (SLIST_EMPTY(&md->pvh_list)) {
 #ifdef PMAP_CACHE_VIPT
 		if (need_syncicache) {
 			/*
 			 * No one has it mapped, so just discard it.  The next
 			 * exec remapping will cause it to be synced.
 			 */
-			pg->mdpage.pvh_attrs &= ~PVF_EXEC;
+			md->pvh_attrs &= ~PVF_EXEC;
 			PMAPCOUNT(exec_discarded_clearbit);
 		}
 #endif
-		simple_unlock(&pg->mdpage.pvh_slock);
+		simple_unlock(&md->pvh_slock);
 		PMAP_HEAD_TO_MAP_UNLOCK();
 		return;
 	}
@@ -2174,7 +2175,7 @@
 	/*
 	 * Loop over all current mappings setting/clearing as appropos
 	 */
-	SLIST_FOREACH(pv, &pg->mdpage.pvh_list, pv_link) {
+	SLIST_FOREACH(pv, &md->pvh_list, pv_link) {
 		va = pv->pv_va;
 		pm = pv->pv_pmap;
 		oflags = pv->pv_flags;
@@ -2244,15 +2245,15 @@
 				 * Keep alias accounting up to date
 				 */
 				if (pv->pv_pmap == pmap_kernel()) {
-					pg->mdpage.krw_mappings--;
-					pg->mdpage.kro_mappings++;
+					md->krw_mappings--;
+					md->kro_mappings++;
 				} else {
-					pg->mdpage.urw_mappings--;
-					pg->mdpage.uro_mappings++;
+					md->urw_mappings--;
+					md->uro_mappings++;
 				}
 #ifdef PMAP_CACHE_VIPT
-				if (pg->mdpage.urw_mappings + pg->mdpage.krw_mappings == 0)
-					pg->mdpage.pvh_attrs &= ~PVF_WRITE;
+				if (md->urw_mappings + md->krw_mappings == 0)
+					md->pvh_attrs &= ~PVF_WRITE;
 				if (want_syncicache)
 					need_syncicache = true;
 				need_vac_me_harder = true;
@@ -2315,7 +2316,7 @@
 	 * If we need to sync the I-cache and we haven't done it yet, do it.
 	 */
 	if (need_syncicache && !did_syncicache) {
-		pmap_syncicache_page(&pg->mdpage, VM_PAGE_TO_PHYS(pg));
+		pmap_syncicache_page(md, VM_PAGE_TO_PHYS(pg));
 		PMAPCOUNT(exec_synced_clearbit);
 	}
 	/*
@@ -2324,12 +2325,12 @@
 	 * this as a page deletion.
 	 */
 	if (need_vac_me_harder) {
-		if (pg->mdpage.pvh_attrs & PVF_NC)
-			pmap_vac_me_harder(&pg->mdpage, VM_PAGE_TO_PHYS(pg), NULL, 0);
+		if (md->pvh_attrs & PVF_NC)
+			pmap_vac_me_harder(md, VM_PAGE_TO_PHYS(pg), NULL, 0);
 	}
 #endif
 
-	simple_unlock(&pg->mdpage.pvh_slock);
+	simple_unlock(&md->pvh_slock);
 	PMAP_HEAD_TO_MAP_UNLOCK();
 }
 
@@ -2567,6 +2568,7 @@
 static void
 pmap_page_remove(struct vm_page *pg)
 {
+	struct vm_page_md *md = VM_PAGE_TO_MD(pg);
 	struct l2_bucket *l2b;
 	struct pv_entry *pv, *npv, **pvp;
 	pmap_t pm;
@@ -2579,35 +2581,35 @@
 	    VM_PAGE_TO_PHYS(pg)));
 
 	PMAP_HEAD_TO_MAP_LOCK();
-	simple_lock(&pg->mdpage.pvh_slock);
+	simple_lock(&md->pvh_slock);
 
-	pv = SLIST_FIRST(&pg->mdpage.pvh_list);
+	pv = SLIST_FIRST(&md->pvh_list);
 	if (pv == NULL) {
 #ifdef PMAP_CACHE_VIPT
 		/*
 		 * We *know* the page contents are about to be replaced.
 		 * Discard the exec contents
 		 */
-		if (PV_IS_EXEC_P(pg->mdpage.pvh_attrs))
+		if (PV_IS_EXEC_P(md->pvh_attrs))
 			PMAPCOUNT(exec_discarded_page_protect);
-		pg->mdpage.pvh_attrs &= ~PVF_EXEC;
-		KASSERT((pg->mdpage.urw_mappings + pg->mdpage.krw_mappings == 0) == !(pg->mdpage.pvh_attrs & PVF_WRITE));
+		md->pvh_attrs &= ~PVF_EXEC;
+		KASSERT((md->urw_mappings + md->krw_mappings == 0) == !(md->pvh_attrs & PVF_WRITE));
 #endif
-		simple_unlock(&pg->mdpage.pvh_slock);
+		simple_unlock(&md->pvh_slock);
 		PMAP_HEAD_TO_MAP_UNLOCK();
 		return;
 	}
 #ifdef PMAP_CACHE_VIPT
-	KASSERT(arm_cache_prefer_mask == 0 || pmap_is_page_colored_p(&pg->mdpage));
+	KASSERT(arm_cache_prefer_mask == 0 || pmap_is_page_colored_p(md));
 #endif
 
 	/*
 	 * Clear alias counts
 	 */
 #ifdef PMAP_CACHE_VIVT
-	pg->mdpage.k_mappings = 0;
+	md->k_mappings = 0;
 #endif
-	pg->mdpage.urw_mappings = pg->mdpage.uro_mappings = 0;
+	md->urw_mappings = md->uro_mappings = 0;
 
 	flush = false;
 	flags = 0;
@@ -2616,7 +2618,7 @@
 	pmap_clean_page(pv, false);
 #endif
 
-	pvp = &SLIST_FIRST(&pg->mdpage.pvh_list);
+	pvp = &SLIST_FIRST(&md->pvh_list);
 	while (pv) {
 		pm = pv->pv_pmap;
 		npv = SLIST_NEXT(pv, pv_link);
@@ -2637,9 +2639,9 @@
 				continue;
 			}
 			if (pv->pv_flags & PVF_WRITE)
-				pg->mdpage.krw_mappings--;
+				md->krw_mappings--;
 			else
-				pg->mdpage.kro_mappings--;
+				md->kro_mappings--;
 #endif
 			PMAPCOUNT(kernel_unmappings);
 		}
@@ -2678,8 +2680,8 @@
 		 */
 		if (pv == NULL) {
 			*pvp = NULL;
-			if (!SLIST_EMPTY(&pg->mdpage.pvh_list))
-				pmap_vac_me_harder(&pg->mdpage, VM_PAGE_TO_PHYS(pg), pm, 0);
+			if (!SLIST_EMPTY(&md->pvh_list))
+				pmap_vac_me_harder(md, VM_PAGE_TO_PHYS(pg), pm, 0);
 		}
 		pmap_release_pmap_lock(pm);
 	}
@@ -2687,16 +2689,16 @@
 	/*
 	 * Its EXEC cache is now gone.
 	 */
-	if (PV_IS_EXEC_P(pg->mdpage.pvh_attrs))
+	if (PV_IS_EXEC_P(md->pvh_attrs))
 		PMAPCOUNT(exec_discarded_page_protect);
-	pg->mdpage.pvh_attrs &= ~PVF_EXEC;
-	KASSERT(pg->mdpage.urw_mappings == 0);
-	KASSERT(pg->mdpage.uro_mappings == 0);
-	if (pg->mdpage.krw_mappings == 0)
-		pg->mdpage.pvh_attrs &= ~PVF_WRITE;
-	KASSERT((pg->mdpage.urw_mappings + pg->mdpage.krw_mappings == 0) == !(pg->mdpage.pvh_attrs & PVF_WRITE));
+	md->pvh_attrs &= ~PVF_EXEC;
+	KASSERT(md->urw_mappings == 0);
+	KASSERT(md->uro_mappings == 0);
+	if (md->krw_mappings == 0)
+		md->pvh_attrs &= ~PVF_WRITE;
+	KASSERT((md->urw_mappings + md->krw_mappings == 0) == !(md->pvh_attrs & PVF_WRITE));
 #endif
-	simple_unlock(&pg->mdpage.pvh_slock);
+	simple_unlock(&md->pvh_slock);
 	PMAP_HEAD_TO_MAP_UNLOCK();
 
 	if (flush) {
@@ -2940,7 +2942,7 @@
 				return (ENOMEM);
 			}
 
-			pmap_enter_pv(&pg->mdpage, VM_PAGE_TO_PHYS(pg), pv, pm, va, nflags);
+			pmap_enter_pv(md, VM_PAGE_TO_PHYS(pg), pv, pm, va, nflags);
 		}
 	} else {
 		/*
@@ -2963,10 +2965,11 @@
 			 * Looks like there's an existing 'managed' mapping
 			 * at this address.
 			 */
-			simple_lock(&opg->mdpage.pvh_slock);
-			pv = pmap_remove_pv(&opg->mdpage, VM_PAGE_TO_PHYS(opg), pm, va);
-			pmap_vac_me_harder(&opg->mdpage, VM_PAGE_TO_PHYS(opg), pm, 0);
-			simple_unlock(&opg->mdpage.pvh_slock);
+			struct vm_page_md *omd = VM_PAGE_TO_MD(opg);
+			simple_lock(&omd->pvh_slock);
+			pv = pmap_remove_pv(omd, VM_PAGE_TO_PHYS(opg), pm, va);
+			pmap_vac_me_harder(omd, VM_PAGE_TO_PHYS(opg), pm, 0);
+			simple_unlock(&omd->pvh_slock);
 			oflags = pv->pv_flags;
 
 #ifdef PMAP_CACHE_VIVT
@@ -3045,17 +3048,19 @@
 		    is_cached, pm->pm_cstate.cs_all));
 
 		if (pg != NULL) {
-			simple_lock(&pg->mdpage.pvh_slock);
-			pmap_vac_me_harder(&pg->mdpage, VM_PAGE_TO_PHYS(pg), pm, va);
-			simple_unlock(&pg->mdpage.pvh_slock);
+			struct vm_page_md *md = VM_PAGE_TO_MD(pg);
+			simple_lock(&md->pvh_slock);
+			pmap_vac_me_harder(md, VM_PAGE_TO_PHYS(pg), pm, va);
+			simple_unlock(&md->pvh_slock);
 		}
 	}
 #if defined(PMAP_CACHE_VIPT) && defined(DIAGNOSTIC)
 	if (pg) {
-		simple_lock(&pg->mdpage.pvh_slock);
-		KASSERT((pg->mdpage.pvh_attrs & PVF_DMOD) == 0 || (pg->mdpage.pvh_attrs & (PVF_DIRTY|PVF_NC)));
-		KASSERT(((pg->mdpage.pvh_attrs & PVF_WRITE) == 0) == (pg->mdpage.urw_mappings + pg->mdpage.krw_mappings == 0));
-		simple_unlock(&pg->mdpage.pvh_slock);
+		struct vm_page_md *md = VM_PAGE_TO_MD(pg);
+		simple_lock(&md->pvh_slock);
+		KASSERT((md->pvh_attrs & PVF_DMOD) == 0 || (md->pvh_attrs & (PVF_DIRTY|PVF_NC)));
+		KASSERT(((md->pvh_attrs & PVF_WRITE) == 0) == (md->urw_mappings + md->krw_mappings == 0));
+		simple_unlock(&md->pvh_slock);
 	}
 #endif
 
@@ -3156,11 +3161,12 @@
 			 * number of sequential pages in one go.
 			 */
 			if ((pg = PHYS_TO_VM_PAGE(pa)) != NULL) {
+				struct vm_page_md *md = VM_PAGE_TO_MD(pg);
 				struct pv_entry *pv;
-				simple_lock(&pg->mdpage.pvh_slock);
-				pv = pmap_remove_pv(&pg->mdpage, VM_PAGE_TO_PHYS(pg), pm, sva);
-				pmap_vac_me_harder(&pg->mdpage, VM_PAGE_TO_PHYS(pg), pm, 0);
-				simple_unlock(&pg->mdpage.pvh_slock);
+				simple_lock(&md->pvh_slock);
+				pv = pmap_remove_pv(md, VM_PAGE_TO_PHYS(pg), pm, sva);
+				pmap_vac_me_harder(md, VM_PAGE_TO_PHYS(pg), pm, 0);
+				simple_unlock(&md->pvh_slock);
 				if (pv != NULL) {
 					if (pm->pm_remove_all == false) {
 						is_exec =
@@ -3280,13 +3286,14 @@
 static struct pv_entry *
 pmap_kremove_pg(struct vm_page *pg, vaddr_t va)
 {
+	struct vm_page_md *md = VM_PAGE_TO_MD(pg);
 	struct pv_entry *pv;
 
-	simple_lock(&pg->mdpage.pvh_slock);
-	KASSERT(arm_cache_prefer_mask == 0 || pg->mdpage.pvh_attrs & (PVF_COLORED|PVF_NC));
-	KASSERT((pg->mdpage.pvh_attrs & PVF_KMPAGE) == 0);
+	simple_lock(&md->pvh_slock);
+	KASSERT(arm_cache_prefer_mask == 0 || md->pvh_attrs & (PVF_COLORED|PVF_NC));
+	KASSERT((md->pvh_attrs & PVF_KMPAGE) == 0);
 
-	pv = pmap_remove_pv(&pg->mdpage, VM_PAGE_TO_PHYS(pg), pmap_kernel(), va);
+	pv = pmap_remove_pv(md, VM_PAGE_TO_PHYS(pg), pmap_kernel(), va);
 	KASSERT(pv);
 	KASSERT(pv->pv_flags & PVF_KENTRY);
 
@@ -3295,18 +3302,18 @@
 	 * if it's the last mapping then clear it execness other sync
 	 * the page to the icache.
 	 */
-	if ((pg->mdpage.pvh_attrs & (PVF_NC|PVF_EXEC)) == PVF_EXEC
+	if ((md->pvh_attrs & (PVF_NC|PVF_EXEC)) == PVF_EXEC
 	    && (pv->pv_flags & PVF_WRITE) != 0) {
-		if (SLIST_EMPTY(&pg->mdpage.pvh_list)) {
-			pg->mdpage.pvh_attrs &= ~PVF_EXEC;
+		if (SLIST_EMPTY(&md->pvh_list)) {
+			md->pvh_attrs &= ~PVF_EXEC;
 			PMAPCOUNT(exec_discarded_kremove);
 		} else {
-			pmap_syncicache_page(&pg->mdpage, VM_PAGE_TO_PHYS(pg));
+			pmap_syncicache_page(md, VM_PAGE_TO_PHYS(pg));
 			PMAPCOUNT(exec_synced_kremove);
 		}
 	}
-	pmap_vac_me_harder(&pg->mdpage, VM_PAGE_TO_PHYS(pg), pmap_kernel(), 0);
-	simple_unlock(&pg->mdpage.pvh_slock);
+	pmap_vac_me_harder(md, VM_PAGE_TO_PHYS(pg), pmap_kernel(), 0);
+	simple_unlock(&md->pvh_slock);
 
 	return pv;
 }
@@ -3332,6 +3339,7 @@
 	struct vm_page *opg;
 	struct pv_entry *pv = NULL;
 #endif
+	struct vm_page_md *md = VM_PAGE_TO_MD(pg);
 
 	NPDEBUG(PDB_KENTER,
 	    printf("pmap_kenter_pa: va 0x%08lx, pa 0x%08lx, prot 0x%x\n",
@@ -3350,13 +3358,14 @@
 		PMAPCOUNT(kenter_remappings);
 #ifdef PMAP_CACHE_VIPT
 		opg = PHYS_TO_VM_PAGE(l2pte_pa(opte));
+		struct vm_page_md *omd = VM_PAGE_TO_MD(opg);
 		if (opg) {
 			KASSERT(opg != pg);
-			KASSERT((opg->mdpage.pvh_attrs & PVF_KMPAGE) == 0);
+			KASSERT((omd->pvh_attrs & PVF_KMPAGE) == 0);
 			KASSERT((prot & PMAP_KMPAGE) == 0);
-			simple_lock(&opg->mdpage.pvh_slock);
+			simple_lock(&omd->pvh_slock);
 			pv = pmap_kremove_pg(opg, va);
-			simple_unlock(&opg->mdpage.pvh_slock);
+			simple_unlock(&omd->pvh_slock);
 		}
 #endif
 		if (l2pte_valid(opte)) {
@@ -3374,54 +3383,54 @@
 
 	if (pg) {
 		if (prot & PMAP_KMPAGE) {
-			simple_lock(&pg->mdpage.pvh_slock);
-			KASSERT(pg->mdpage.urw_mappings == 0);
-			KASSERT(pg->mdpage.uro_mappings == 0);
-			KASSERT(pg->mdpage.krw_mappings == 0);
-			KASSERT(pg->mdpage.kro_mappings == 0);
+			simple_lock(&md->pvh_slock);
+			KASSERT(md->urw_mappings == 0);
+			KASSERT(md->uro_mappings == 0);
+			KASSERT(md->krw_mappings == 0);
+			KASSERT(md->kro_mappings == 0);
 #ifdef PMAP_CACHE_VIPT
 			KASSERT(pv == NULL);
 			KASSERT(arm_cache_prefer_mask == 0 || (va & PVF_COLORED) == 0);
-			KASSERT((pg->mdpage.pvh_attrs & PVF_NC) == 0);
+			KASSERT((md->pvh_attrs & PVF_NC) == 0);
 			/* if there is a color conflict, evict from cache. */
-			if (pmap_is_page_colored_p(&pg->mdpage)
-			    && ((va ^ pg->mdpage.pvh_attrs) & arm_cache_prefer_mask)) {
+			if (pmap_is_page_colored_p(md)
+			    && ((va ^ md->pvh_attrs) & arm_cache_prefer_mask)) {
 				PMAPCOUNT(vac_color_change);
-				pmap_flush_page(&pg->mdpage, VM_PAGE_TO_PHYS(pg), PMAP_FLUSH_PRIMARY);
-			} else if (pg->mdpage.pvh_attrs & PVF_MULTCLR) {
+				pmap_flush_page(md, VM_PAGE_TO_PHYS(pg), PMAP_FLUSH_PRIMARY);
+			} else if (md->pvh_attrs & PVF_MULTCLR) {
 				/*
 				 * If this page has multiple colors, expunge
 				 * them.
 				 */
 				PMAPCOUNT(vac_flush_lots2);
-				pmap_flush_page(&pg->mdpage, VM_PAGE_TO_PHYS(pg), PMAP_FLUSH_SECONDARY);
+				pmap_flush_page(md, VM_PAGE_TO_PHYS(pg), PMAP_FLUSH_SECONDARY);
 			}
-			pg->mdpage.pvh_attrs &= PAGE_SIZE - 1;
-			pg->mdpage.pvh_attrs |= PVF_KMPAGE
+			md->pvh_attrs &= PAGE_SIZE - 1;
+			md->pvh_attrs |= PVF_KMPAGE
 			    | PVF_COLORED | PVF_DIRTY
 			    | (va & arm_cache_prefer_mask);
 #endif
 #ifdef PMAP_CACHE_VIVT
-			pg->mdpage.pvh_attrs |= PVF_KMPAGE;
+			md->pvh_attrs |= PVF_KMPAGE;
 #endif
 			pmap_kmpages++;
-			simple_unlock(&pg->mdpage.pvh_slock);
+			simple_unlock(&md->pvh_slock);
 #ifdef PMAP_CACHE_VIPT
 		} else {
 			if (pv == NULL) {
 				pv = pool_get(&pmap_pv_pool, PR_NOWAIT);
 				KASSERT(pv != NULL);
 			}
-			pmap_enter_pv(&pg->mdpage, VM_PAGE_TO_PHYS(pg), pv, pmap_kernel(), va,
+			pmap_enter_pv(md, VM_PAGE_TO_PHYS(pg), pv, pmap_kernel(), va,
 			    PVF_WIRED | PVF_KENTRY
 			    | (prot & VM_PROT_WRITE ? PVF_WRITE : 0));
 			if ((prot & VM_PROT_WRITE)
-			    && !(pg->mdpage.pvh_attrs & PVF_NC))
-				pg->mdpage.pvh_attrs |= PVF_DIRTY;
-			KASSERT((prot & VM_PROT_WRITE) == 0 || (pg->mdpage.pvh_attrs & (PVF_DIRTY|PVF_NC)));
-			simple_lock(&pg->mdpage.pvh_slock);
-			pmap_vac_me_harder(&pg->mdpage, VM_PAGE_TO_PHYS(pg), pmap_kernel(), va);
-			simple_unlock(&pg->mdpage.pvh_slock);
+			    && !(md->pvh_attrs & PVF_NC))
+				md->pvh_attrs |= PVF_DIRTY;
+			KASSERT((prot & VM_PROT_WRITE) == 0 || (md->pvh_attrs & (PVF_DIRTY|PVF_NC)));
+			simple_lock(&md->pvh_slock);
+			pmap_vac_me_harder(md, VM_PAGE_TO_PHYS(pg), pmap_kernel(), va);
+			simple_unlock(&md->pvh_slock);
 #endif
 		}
 #ifdef PMAP_CACHE_VIPT
@@ -3462,19 +3471,20 @@
 		while (va < next_bucket) {
 			opte = *ptep;
 			opg = PHYS_TO_VM_PAGE(l2pte_pa(opte));
+			struct vm_page_md *omd = VM_PAGE_TO_MD(opg);
 			if (opg) {
-				if (opg->mdpage.pvh_attrs & PVF_KMPAGE) {
-					simple_lock(&opg->mdpage.pvh_slock);
-					KASSERT(opg->mdpage.urw_mappings == 0);
-					KASSERT(opg->mdpage.uro_mappings == 0);
-					KASSERT(opg->mdpage.krw_mappings == 0);
-					KASSERT(opg->mdpage.kro_mappings == 0);
-					opg->mdpage.pvh_attrs &= ~PVF_KMPAGE;
+				if (omd->pvh_attrs & PVF_KMPAGE) {
+					simple_lock(&omd->pvh_slock);
+					KASSERT(omd->urw_mappings == 0);
+					KASSERT(omd->uro_mappings == 0);
+					KASSERT(omd->krw_mappings == 0);
+					KASSERT(omd->kro_mappings == 0);
+					omd->pvh_attrs &= ~PVF_KMPAGE;
 #ifdef PMAP_CACHE_VIPT
-					opg->mdpage.pvh_attrs &= ~PVF_WRITE;
+					omd->pvh_attrs &= ~PVF_WRITE;
 #endif
 					pmap_kmpages--;
-					simple_unlock(&opg->mdpage.pvh_slock);
+					simple_unlock(&omd->pvh_slock);
 #ifdef PMAP_CACHE_VIPT
 				} else {
 					pool_put(&pmap_pv_pool,
@@ -3630,12 +3640,13 @@
 				*ptep = pte;
 				PTE_SYNC(ptep);
 
+				struct vm_page_md *md = VM_PAGE_TO_MD(pg);
 				if (pg != NULL) {
-					simple_lock(&pg->mdpage.pvh_slock);
-					f = pmap_modify_pv(&pg->mdpage, VM_PAGE_TO_PHYS(pg), pm, sva,
+					simple_lock(&md->pvh_slock);
+					f = pmap_modify_pv(md, VM_PAGE_TO_PHYS(pg), pm, sva,
 					    clr_mask, 0);
-					pmap_vac_me_harder(&pg->mdpage, VM_PAGE_TO_PHYS(pg), pm, sva);
-					simple_unlock(&pg->mdpage.pvh_slock);
+					pmap_vac_me_harder(md, VM_PAGE_TO_PHYS(pg), pm, sva);
+					simple_unlock(&md->pvh_slock);
 				} else
 					f = PVF_REF | PVF_EXEC;
 
@@ -3747,9 +3758,10 @@
 bool
 pmap_clear_modify(struct vm_page *pg)
 {
+	struct vm_page_md *md = VM_PAGE_TO_MD(pg);
 	bool rv;
 
-	if (pg->mdpage.pvh_attrs & PVF_MOD) {
+	if (md->pvh_attrs & PVF_MOD) {
 		rv = true;
 #ifdef PMAP_CACHE_VIPT
 		/*
@@ -3757,8 +3769,8 @@
 		 * no other modified bits set, flush the page to memory and
 		 * mark it clean.
 		 */
-		if ((pg->mdpage.pvh_attrs & (PVF_DMOD|PVF_NC)) == PVF_MOD)
-			pmap_flush_page(&pg->mdpage, VM_PAGE_TO_PHYS(pg), PMAP_CLEAN_PRIMARY);
+		if ((md->pvh_attrs & (PVF_DMOD|PVF_NC)) == PVF_MOD)
+			pmap_flush_page(md, VM_PAGE_TO_PHYS(pg), PMAP_CLEAN_PRIMARY);
 #endif
 		pmap_clearbit(pg, PVF_MOD);
 	} else
@@ -3775,9 +3787,10 @@
 bool
 pmap_clear_reference(struct vm_page *pg)
 {
+	struct vm_page_md *md = VM_PAGE_TO_MD(pg);
 	bool rv;
 
-	if (pg->mdpage.pvh_attrs & PVF_REF) {
+	if (md->pvh_attrs & PVF_REF) {
 		rv = true;
 		pmap_clearbit(pg, PVF_REF);
 	} else
@@ -3862,12 +3875,14 @@
 		if ((pg = PHYS_TO_VM_PAGE(pa)) == NULL)
 			goto out;
 
+		struct vm_page_md *md = VM_PAGE_TO_MD(pg);
+
 		/* Get the current flags for this page. */
-		simple_lock(&pg->mdpage.pvh_slock);
+		simple_lock(&md->pvh_slock);
 
-		pv = pmap_find_pv(&pg->mdpage, pm, va);
+		pv = pmap_find_pv(md, pm, va);
 		if (pv == NULL) {
-	    		simple_unlock(&pg->mdpage.pvh_slock);
+	    		simple_unlock(&md->pvh_slock);
 			goto out;
 		}
 
@@ -3879,7 +3894,7 @@
 		 * and also set the modified bit
 		 */
 		if ((pv->pv_flags & PVF_WRITE) == 0) {
-		    	simple_unlock(&pg->mdpage.pvh_slock);
+		    	simple_unlock(&md->pvh_slock);
 			goto out;
 		}
 
@@ -3887,16 +3902,16 @@
 		    printf("pmap_fault_fixup: mod emul. pm %p, va 0x%08lx, pa 0x%08lx\n",
 		    pm, va, VM_PAGE_TO_PHYS(pg)));
 
-		pg->mdpage.pvh_attrs |= PVF_REF | PVF_MOD;
+		md->pvh_attrs |= PVF_REF | PVF_MOD;
 		pv->pv_flags |= PVF_REF | PVF_MOD;
 #ifdef PMAP_CACHE_VIPT
 		/*
 		 * If there are cacheable mappings for this page, mark it dirty.
 		 */
-		if ((pg->mdpage.pvh_attrs & PVF_NC) == 0)
-			pg->mdpage.pvh_attrs |= PVF_DIRTY;
+		if ((md->pvh_attrs & PVF_NC) == 0)
+			md->pvh_attrs |= PVF_DIRTY;
 #endif
-		simple_unlock(&pg->mdpage.pvh_slock);
+		simple_unlock(&md->pvh_slock);
 
 		/* 
 		 * Re-enable write permissions for the page.  No need to call
@@ -3921,18 +3936,20 @@
 		if ((pg = PHYS_TO_VM_PAGE(pa)) == NULL)
 			goto out;
 
+		struct vm_page_md *md = VM_PAGE_TO_MD(pg);
+
 		/* Get the current flags for this page. */
-		simple_lock(&pg->mdpage.pvh_slock);
+		simple_lock(&md->pvh_slock);
 
-		pv = pmap_find_pv(&pg->mdpage, pm, va);
+		pv = pmap_find_pv(md, pm, va);
 		if (pv == NULL) {
-	    		simple_unlock(&pg->mdpage.pvh_slock);
+	    		simple_unlock(&md->pvh_slock);
 			goto out;
 		}
 
-		pg->mdpage.pvh_attrs |= PVF_REF;
+		md->pvh_attrs |= PVF_REF;
 		pv->pv_flags |= PVF_REF;
-		simple_unlock(&pg->mdpage.pvh_slock);
+		simple_unlock(&md->pvh_slock);
 
 		NPDEBUG(PDB_FOLLOW,
 		    printf("pmap_fault_fixup: ref emul. pm %p, va 0x%08lx, pa 0x%08lx\n",
@@ -4083,9 +4100,10 @@
 
 	if ((pg = PHYS_TO_VM_PAGE(pa)) != NULL) {
 		/* Update the wired bit in the pv entry for this page. */
-		simple_lock(&pg->mdpage.pvh_slock);
-		(void) pmap_modify_pv(&pg->mdpage, VM_PAGE_TO_PHYS(pg), pm, va, PVF_WIRED, 0);
-		simple_unlock(&pg->mdpage.pvh_slock);
+		struct vm_page_md *md = VM_PAGE_TO_MD(pg);
+		simple_lock(&md->pvh_slock);
+		(void) pmap_modify_pv(md, VM_PAGE_TO_PHYS(pg), pm, va, PVF_WIRED, 0);
+		simple_unlock(&md->pvh_slock);
 	}
 
 	pmap_release_pmap_lock(pm);
@@ -4406,17 +4424,18 @@
 {
 #if defined(PMAP_CACHE_VIPT) || defined(DEBUG)
 	struct vm_page *pg = PHYS_TO_VM_PAGE(phys);
+	struct vm_page_md *md = VM_PAGE_TO_MD(pg);
 #endif
 #ifdef PMAP_CACHE_VIPT
 	/* Choose the last page color it had, if any */
-	const vsize_t va_offset = pg->mdpage.pvh_attrs & arm_cache_prefer_mask;
+	const vsize_t va_offset = md->pvh_attrs & arm_cache_prefer_mask;
 #else
 	const vsize_t va_offset = 0;
 #endif
 	pt_entry_t * const ptep = &cdst_pte[va_offset >> PGSHIFT];
 
 #ifdef DEBUG
-	if (!SLIST_EMPTY(&pg->mdpage.pvh_list))
+	if (!SLIST_EMPTY(&md->pvh_list))
 		panic("pmap_zero_page: page has mappings");
 #endif
 
@@ -4446,15 +4465,15 @@
 	 * This page is now cache resident so it now has a page color.
 	 * Any contents have been obliterated so clear the EXEC flag.
 	 */
-	if (!pmap_is_page_colored_p(&pg->mdpage)) {
+	if (!pmap_is_page_colored_p(md)) {
 		PMAPCOUNT(vac_color_new);
-		pg->mdpage.pvh_attrs |= PVF_COLORED;
+		md->pvh_attrs |= PVF_COLORED;
 	}
-	if (PV_IS_EXEC_P(pg->mdpage.pvh_attrs)) {
-		pg->mdpage.pvh_attrs &= ~PVF_EXEC;
+	if (PV_IS_EXEC_P(md->pvh_attrs)) {
+		md->pvh_attrs &= ~PVF_EXEC;
 		PMAPCOUNT(exec_discarded_zero);
 	}
-	pg->mdpage.pvh_attrs |= PVF_DIRTY;
+	md->pvh_attrs |= PVF_DIRTY;
 #endif
 }
 #endif /* (ARM_MMU_GENERIC + ARM_MMU_SA1 + ARM_MMU_V6) != 0 */
@@ -4465,8 +4484,9 @@
 {
 #ifdef DEBUG
 	struct vm_page *pg = PHYS_TO_VM_PAGE(phys);
+	struct vm_page_md *md = VM_PAGE_TO_MD(pg);
 
-	if (!SLIST_EMPTY(&pg->mdpage.pvh_list))
+	if (!SLIST_EMPTY(&md->pvh_list))
 		panic("pmap_zero_page: page has mappings");
 #endif
 
@@ -4501,10 +4521,11 @@
 	bool rv = true;
 #if defined(PMAP_CACHE_VIPT) || defined(DEBUG)
 	struct vm_page * const pg = PHYS_TO_VM_PAGE(phys);
+	struct vm_page_md *md = VM_PAGE_TO_MD(pg);
 #endif
 #ifdef PMAP_CACHE_VIPT
 	/* Choose the last page color it had, if any */
-	const vsize_t va_offset = pg->mdpage.pvh_attrs & arm_cache_prefer_mask;
+	const vsize_t va_offset = md->pvh_attrs & arm_cache_prefer_mask;
 #else
 	const vsize_t va_offset = 0;
 #endif
@@ -4512,7 +4533,7 @@
 
 
 #ifdef DEBUG
-	if (!SLIST_EMPTY(&pg->mdpage.pvh_list))
+	if (!SLIST_EMPTY(&md->pvh_list))
 		panic("pmap_pageidlezero: page has mappings");
 #endif
 
@@ -4555,12 +4576,12 @@
 	 * This page is now cache resident so it now has a page color.
 	 * Any contents have been obliterated so clear the EXEC flag.
 	 */
-	if (!pmap_is_page_colored_p(&pg->mdpage)) {
+	if (!pmap_is_page_colored_p(md)) {
 		PMAPCOUNT(vac_color_new);
-		pg->mdpage.pvh_attrs |= PVF_COLORED;
+		md->pvh_attrs |= PVF_COLORED;
 	}
-	if (PV_IS_EXEC_P(pg->mdpage.pvh_attrs)) {
-		pg->mdpage.pvh_attrs &= ~PVF_EXEC;
+	if (PV_IS_EXEC_P(md->pvh_attrs)) {
+		md->pvh_attrs &= ~PVF_EXEC;
 		PMAPCOUNT(exec_discarded_zero);
 	}
 #endif
@@ -4586,12 +4607,14 @@
 pmap_copy_page_generic(paddr_t src, paddr_t dst)
 {
 	struct vm_page * const src_pg = PHYS_TO_VM_PAGE(src);
+	struct vm_page_md *src_md = VM_PAGE_TO_MD(src_pg);
 #if defined(PMAP_CACHE_VIPT) || defined(DEBUG)
 	struct vm_page * const dst_pg = PHYS_TO_VM_PAGE(dst);
+	struct vm_page_md *dst_md = VM_PAGE_TO_MD(dst_pg);
 #endif
 #ifdef PMAP_CACHE_VIPT
-	const vsize_t src_va_offset = src_pg->mdpage.pvh_attrs & arm_cache_prefer_mask;
-	const vsize_t dst_va_offset = dst_pg->mdpage.pvh_attrs & arm_cache_prefer_mask;
+	const vsize_t src_va_offset = src_md->pvh_attrs & arm_cache_prefer_mask;
+	const vsize_t dst_va_offset = dst_md->pvh_attrs & arm_cache_prefer_mask;
 #else
 	const vsize_t src_va_offset = 0;
 	const vsize_t dst_va_offset = 0;
@@ -4600,12 +4623,12 @@
 	pt_entry_t * const dst_ptep = &cdst_pte[dst_va_offset >> PGSHIFT];
 
 #ifdef DEBUG
-	if (!SLIST_EMPTY(&dst_pg->mdpage.pvh_list))
+	if (!SLIST_EMPTY(&dst_md->pvh_list))
 		panic("pmap_copy_page: dst page has mappings");
 #endif
 
 #ifdef PMAP_CACHE_VIPT
-	KASSERT(arm_cache_prefer_mask == 0 || src_pg->mdpage.pvh_attrs & (PVF_COLORED|PVF_NC));
+	KASSERT(arm_cache_prefer_mask == 0 || src_md->pvh_attrs & (PVF_COLORED|PVF_NC));
 #endif
 	KDASSERT((src & PGOFSET) == 0);
 	KDASSERT((dst & PGOFSET) == 0);
@@ -4615,9 +4638,9 @@
 	 * the duration of the copy so that no other mappings can
 	 * be created while we have a potentially aliased mapping.
 	 */
-	simple_lock(&src_pg->mdpage.pvh_slock);
+	simple_lock(&src_md->pvh_slock);
 #ifdef PMAP_CACHE_VIVT
-	(void) pmap_clean_page(SLIST_FIRST(&src_pg->mdpage.pvh_list), true);
+	(void) pmap_clean_page(SLIST_FIRST(&src_md->pvh_list), true);
 #endif
 
 	/*
@@ -4628,7 +4651,7 @@
 	*src_ptep = L2_S_PROTO
 	    | src
 #ifdef PMAP_CACHE_VIPT
-	    | ((src_pg->mdpage.pvh_attrs & PVF_NC) ? 0 : pte_l2_s_cache_mode)
+	    | ((src_md->pvh_attrs & PVF_NC) ? 0 : pte_l2_s_cache_mode)
 #endif
 #ifdef PMAP_CACHE_VIVT
 	    | pte_l2_s_cache_mode
@@ -4645,7 +4668,7 @@
 #ifdef PMAP_CACHE_VIVT
 	cpu_dcache_inv_range(csrcp + src_va_offset, PAGE_SIZE);
 #endif
-	simple_unlock(&src_pg->mdpage.pvh_slock); /* cache is safe again */
+	simple_unlock(&src_md->pvh_slock); /* cache is safe again */
 #ifdef PMAP_CACHE_VIVT
 	cpu_dcache_wbinv_range(cdstp + dst_va_offset, PAGE_SIZE);
 #endif
@@ -4663,15 +4686,15 @@
 	 * Now that the destination page is in the cache, mark it as colored.
 	 * If this was an exec page, discard it.
 	 */
-	if (!pmap_is_page_colored_p(&dst_pg->mdpage)) {
+	if (!pmap_is_page_colored_p(dst_md)) {
 		PMAPCOUNT(vac_color_new);
-		dst_pg->mdpage.pvh_attrs |= PVF_COLORED;
+		dst_md->pvh_attrs |= PVF_COLORED;
 	}
-	if (PV_IS_EXEC_P(dst_pg->mdpage.pvh_attrs)) {
-		dst_pg->mdpage.pvh_attrs &= ~PVF_EXEC;
+	if (PV_IS_EXEC_P(dst_md->pvh_attrs)) {
+		dst_md->pvh_attrs &= ~PVF_EXEC;
 		PMAPCOUNT(exec_discarded_copy);
 	}
-	dst_pg->mdpage.pvh_attrs |= PVF_DIRTY;
+	dst_md->pvh_attrs |= PVF_DIRTY;
 #endif
 }
 #endif /* (ARM_MMU_GENERIC + ARM_MMU_SA1 + ARM_MMU_V6) != 0 */
@@ -4684,7 +4707,7 @@
 #ifdef DEBUG
 	struct vm_page *dst_pg = PHYS_TO_VM_PAGE(dst);
 
-	if (!SLIST_EMPTY(&dst_pg->mdpage.pvh_list))
+	if (!SLIST_EMPTY(&dst_md->pvh_list))
 		panic("pmap_copy_page: dst page has mappings");
 #endif
 
@@ -4696,9 +4719,9 @@
 	 * the duration of the copy so that no other mappings can
 	 * be created while we have a potentially aliased mapping.
 	 */
-	simple_lock(&src_pg->mdpage.pvh_slock);
+	simple_lock(&src_md->pvh_slock);
 #ifdef PMAP_CACHE_VIVT
-	(void) pmap_clean_page(SLIST_FIRST(&src_pg->mdpage.pvh_list), true);
+	(void) pmap_clean_page(SLIST_FIRST(&src_md->pvh_list), true);
 #endif
 
 	/*
@@ -4718,7 +4741,7 @@
 	cpu_tlb_flushD_SE(cdstp);
 	cpu_cpwait();
 	bcopy_page(csrcp, cdstp);
-	simple_unlock(&src_pg->mdpage.pvh_slock); /* cache is safe again */
+	simple_unlock(&src_md->pvh_slock); /* cache is safe again */
 	xscale_cache_clean_minidata();
 }
 #endif /* ARM_MMU_XSCALE == 1 */
@@ -4770,11 +4793,12 @@
 			return (1);
 		pa = VM_PAGE_TO_PHYS(pg);
 #ifdef PMAP_CACHE_VIPT
+		struct vm_page_md *md = VM_PAGE_TO_MD(pg);
 		/*
 		 * This new page must not have any mappings.  Enter it via
 		 * pmap_kenter_pa and let that routine do the hard work.
 		 */
-		KASSERT(SLIST_EMPTY(&pg->mdpage.pvh_list));
+		KASSERT(SLIST_EMPTY(&md->pvh_list));
 		pmap_kenter_pa(va, pa,
 		    VM_PROT_READ|VM_PROT_WRITE|PMAP_KMPAGE, 0);
 #endif
@@ -6388,6 +6412,7 @@
 pmap_dump_ncpg(pmap_t pm)
 {
 	struct vm_page *pg;
+	struct vm_page_md *md;
 	struct pv_entry *pv;
 	int i;
 
@@ -6398,13 +6423,14 @@
 		pg = PHYS_TO_VM_PAGE(l2pte_pa(ncptes[i]));
 		if (pg == NULL)
 			continue;
+		md = VM_PAGE_TO_MD(pg);
 
 		printf(" pa 0x%08lx: krw %d kro %d urw %d uro %d\n",
 		    VM_PAGE_TO_PHYS(pg),
-		    pg->mdpage.krw_mappings, pg->mdpage.kro_mappings,
-		    pg->mdpage.urw_mappings, pg->mdpage.uro_mappings);
+		    md->krw_mappings, md->kro_mappings,
+		    md->urw_mappings, md->uro_mappings);
 
-		SLIST_FOREACH(pv, &pg->mdpage.pvh_list, pv_link) {
+		SLIST_FOREACH(pv, &md->pvh_list, pv_link) {
 			printf("   %c va 0x%08lx, flags 0x%x\n",
 			    (pm == pv->pv_pmap) ? '*' : ' ',
 			    pv->pv_va, pv->pv_flags);

Reply via email to