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-head
mailing list