Author: alc
Date: Sat Mar 14 05:33:09 2009
New Revision: 189783
URL: http://svn.freebsd.org/changeset/base/189783

Log:
  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.
  
  MFC after:    6 weeks

Modified:
  head/sys/amd64/amd64/pmap.c

Modified: head/sys/amd64/amd64/pmap.c
==============================================================================
--- head/sys/amd64/amd64/pmap.c Sat Mar 14 02:31:48 2009        (r189782)
+++ head/sys/amd64/amd64/pmap.c Sat Mar 14 05:33:09 2009        (r189783)
@@ -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;
 }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to