kernel - Fix i386 pmap bug
authorMatthew Dillon <dillon@apollo.backplane.com>
Thu, 11 Oct 2012 21:34:09 +0000 (14:34 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Thu, 11 Oct 2012 21:40:43 +0000 (14:40 -0700)
* mpte will be NULL for KVM page table pages, there is no need to track
  the wire count.  Conditionalize-out the unwiring call.

* This is believed to be (this time for sure to the third power!) the
  PG_BUSY crash that vsrinivas was getting on i386 related to paging
  in a swapped kernel pipe buffer.

sys/platform/pc32/i386/pmap.c

index c8da413..1381a84 100644 (file)
@@ -2422,7 +2422,7 @@ validate:
 
                if (*pte) {
                        KKASSERT((*pte & PG_FRAME) == (newpte & PG_FRAME));
-                       if (vm_page_unwire_quick(mpte))
+                       if (mpte && vm_page_unwire_quick(mpte))
                                panic("pmap_enter: Insufficient wire_count");
                }
 
@@ -2434,7 +2434,7 @@ validate:
        } else {
                if (*pte) {
                        KKASSERT((*pte & PG_FRAME) == (newpte & PG_FRAME));
-                       if (vm_page_unwire_quick(mpte))
+                       if (mpte && vm_page_unwire_quick(mpte))
                                panic("pmap_enter: Insufficient wire_count");
                }
        }