svn commit: r210914 - in head/sys/mips: include mips

Jayachandran C. jchandra at FreeBSD.org
Fri Aug 6 07:32:34 UTC 2010


Author: jchandra
Date: Fri Aug  6 07:32:33 2010
New Revision: 210914
URL: http://svn.freebsd.org/changeset/base/210914

Log:
  Fix the issue reported by alc:
  
   pmap_page_wired_mappings() counts the number of pv entries for the
   specified page that have the pv entry wired flag set to TRUE.
   pmap_enter() correctly initializes this flag.  However,
   pmap_change_wiring() doesn't update the corresponding pv entry flag,
   only the PTE.  So, the count returned by pmap_page_wired_mappings()
   will sometimes be wrong.
  
   In the short term, the best fix would be to eliminate the pv entry
   flag and use only the PTE.  That flag is wasting non-trivial memory.
  
  Remove pv_wired flag, and use PTE flag to count the wired mappings.
  
  Reviewed by:	alc

Modified:
  head/sys/mips/include/pmap.h
  head/sys/mips/mips/pmap.c

Modified: head/sys/mips/include/pmap.h
==============================================================================
--- head/sys/mips/include/pmap.h	Fri Aug  6 07:03:22 2010	(r210913)
+++ head/sys/mips/include/pmap.h	Fri Aug  6 07:32:33 2010	(r210914)
@@ -124,7 +124,6 @@ typedef struct pv_entry {
 	TAILQ_ENTRY(pv_entry) pv_list;
 	TAILQ_ENTRY(pv_entry) pv_plist;
 	vm_page_t pv_ptem;	/* VM page for pte */
-	boolean_t pv_wired;	/* whether this entry is wired */
 }       *pv_entry_t;
 
 

Modified: head/sys/mips/mips/pmap.c
==============================================================================
--- head/sys/mips/mips/pmap.c	Fri Aug  6 07:03:22 2010	(r210913)
+++ head/sys/mips/mips/pmap.c	Fri Aug  6 07:32:33 2010	(r210914)
@@ -1473,7 +1473,6 @@ pmap_try_insert_pv_entry(pmap_t pmap, vm
 		pv->pv_va = va;
 		pv->pv_pmap = pmap;
 		pv->pv_ptem = mpte;
-		pv->pv_wired = FALSE;
 		TAILQ_INSERT_TAIL(&pmap->pm_pvlist, pv, pv_plist);
 		TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
 		m->md.pv_list_count++;
@@ -1897,7 +1896,6 @@ pmap_enter(pmap_t pmap, vm_offset_t va, 
 		pv->pv_va = va;
 		pv->pv_pmap = pmap;
 		pv->pv_ptem = mpte;
-		pv->pv_wired = wired;
 		TAILQ_INSERT_TAIL(&pmap->pm_pvlist, pv, pv_plist);
 		TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
 		m->md.pv_list_count++;
@@ -2655,15 +2653,22 @@ int
 pmap_page_wired_mappings(vm_page_t m)
 {
 	pv_entry_t pv;
+	pmap_t pmap;
+	pt_entry_t *pte;
 	int count;
 
 	count = 0;
 	if ((m->flags & PG_FICTITIOUS) != 0)
 		return (count);
 	vm_page_lock_queues();
-	TAILQ_FOREACH(pv, &m->md.pv_list, pv_list)
-	    if (pv->pv_wired)
-		count++;
+	TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
+		pmap = pv->pv_pmap;
+		PMAP_LOCK(pmap);
+		pte = pmap_pte(pmap, pv->pv_va);
+		if (pte_test(pte, PTE_W))
+			count++;
+		PMAP_UNLOCK(pmap);
+	}
 	vm_page_unlock_queues();
 	return (count);
 }


More information about the svn-src-all mailing list