svn commit: r202838 - stable/7/sys/amd64/amd64
John Baldwin
jhb at FreeBSD.org
Fri Jan 22 21:36:34 UTC 2010
Author: jhb
Date: Fri Jan 22 21:36:34 2010
New Revision: 202838
URL: http://svn.freebsd.org/changeset/base/202838
Log:
MFC 189783:
Correct accounting errors in _pmap_allocpte(). Specifically, the pmap's
resident page count and the global wired page count were not correctly
maintained when page table page allocation failed.
Modified:
stable/7/sys/amd64/amd64/pmap.c
Directory Properties:
stable/7/sys/ (props changed)
stable/7/sys/cddl/contrib/opensolaris/ (props changed)
stable/7/sys/contrib/dev/acpica/ (props changed)
stable/7/sys/contrib/pf/ (props changed)
Modified: stable/7/sys/amd64/amd64/pmap.c
==============================================================================
--- stable/7/sys/amd64/amd64/pmap.c Fri Jan 22 21:23:09 2010 (r202837)
+++ stable/7/sys/amd64/amd64/pmap.c Fri Jan 22 21:36:34 2010 (r202838)
@@ -1442,8 +1442,6 @@ _pmap_allocpte(pmap_t pmap, vm_pindex_t
* it isn't already there.
*/
- pmap->pm_stats.resident_count++;
-
if (ptepindex >= (NUPDE + NUPDPE)) {
pml4_entry_t *pml4;
vm_pindex_t pml4index;
@@ -1469,7 +1467,8 @@ _pmap_allocpte(pmap_t pmap, vm_pindex_t
if (_pmap_allocpte(pmap, NUPDE + NUPDPE + pml4index,
flags) == NULL) {
--m->wire_count;
- vm_page_free(m);
+ atomic_subtract_int(&cnt.v_wire_count, 1);
+ vm_page_free_zero(m);
return (NULL);
}
} else {
@@ -1501,7 +1500,8 @@ _pmap_allocpte(pmap_t pmap, vm_pindex_t
if (_pmap_allocpte(pmap, NUPDE + pdpindex,
flags) == NULL) {
--m->wire_count;
- vm_page_free(m);
+ atomic_subtract_int(&cnt.v_wire_count, 1);
+ vm_page_free_zero(m);
return (NULL);
}
pdp = (pdp_entry_t *)PHYS_TO_DMAP(*pml4 & PG_FRAME);
@@ -1514,7 +1514,9 @@ _pmap_allocpte(pmap_t pmap, vm_pindex_t
if (_pmap_allocpte(pmap, NUPDE + pdpindex,
flags) == NULL) {
--m->wire_count;
- vm_page_free(m);
+ atomic_subtract_int(&cnt.v_wire_count,
+ 1);
+ vm_page_free_zero(m);
return (NULL);
}
} else {
@@ -1530,6 +1532,8 @@ _pmap_allocpte(pmap_t pmap, vm_pindex_t
*pd = VM_PAGE_TO_PHYS(m) | PG_U | PG_RW | PG_V | PG_A | PG_M;
}
+ pmap->pm_stats.resident_count++;
+
return m;
}
More information about the svn-src-all
mailing list