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);
 }
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to