Author: andrew
Date: Mon Aug 22 14:53:39 2016
New Revision: 304604
URL: https://svnweb.freebsd.org/changeset/base/304604

Log:
  Use switch statements in pmap_remove_pages. While only one level of
  pagetable is supported more will be added soon to support removing
  superpages.
  
  Obtained from:        ABT Systems Ltd
  MFC after:    1 month
  Sponsored by: The FreeBSD Foundation

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

Modified: head/sys/arm64/arm64/pmap.c
==============================================================================
--- head/sys/arm64/arm64/pmap.c Mon Aug 22 14:51:09 2016        (r304603)
+++ head/sys/arm64/arm64/pmap.c Mon Aug 22 14:53:39 2016        (r304604)
@@ -3115,14 +3115,21 @@ pmap_remove_pages(pmap_t pmap)
                                pde = pmap_pde(pmap, pv->pv_va, &lvl);
                                KASSERT(pde != NULL,
                                    ("Attempting to remove an unmapped page"));
-                               KASSERT(lvl == 2,
-                                   ("Invalid page directory level: %d", lvl));
 
-                               pte = pmap_l2_to_l3(pde, pv->pv_va);
-                               KASSERT(pte != NULL,
-                                   ("Attempting to remove an unmapped page"));
-
-                               tpte = pmap_load(pte);
+                               switch(lvl) {
+                               case 2:
+                                       pte = pmap_l2_to_l3(pde, pv->pv_va);
+                                       tpte = pmap_load(pte);
+                                       KASSERT((tpte & ATTR_DESCR_MASK) ==
+                                           L3_PAGE,
+                                           ("Attempting to remove an invalid "
+                                            "page: %lx", tpte));
+                                       break;
+                               default:
+                                       panic(
+                                           "Invalid page directory level: %d",
+                                           lvl);
+                               }
 
 /*
  * We cannot remove wired pages from a process' mapping at this time
@@ -3156,18 +3163,27 @@ pmap_remove_pages(pmap_t pmap)
                                /*
                                 * Update the vm_page_t clean/reference bits.
                                 */
-                               if ((tpte & ATTR_AP_RW_BIT) == 
ATTR_AP(ATTR_AP_RW))
-                                       vm_page_dirty(m);
+                               if ((tpte & ATTR_AP_RW_BIT) ==
+                                   ATTR_AP(ATTR_AP_RW)) {
+                                       switch (lvl) {
+                                       case 2:
+                                               vm_page_dirty(m);
+                                               break;
+                                       }
+                               }
 
                                CHANGE_PV_LIST_LOCK_TO_VM_PAGE(&lock, m);
 
                                /* Mark free */
                                pc->pc_map[field] |= bitmask;
-
-                               pmap_resident_count_dec(pmap, 1);
-                               TAILQ_REMOVE(&m->md.pv_list, pv, pv_next);
-                               m->md.pv_gen++;
-
+                               switch (lvl) {
+                               case 2:
+                                       pmap_resident_count_dec(pmap, 1);
+                                       TAILQ_REMOVE(&m->md.pv_list, pv,
+                                           pv_next);
+                                       m->md.pv_gen++;
+                                       break;
+                               }
                                pmap_unuse_l3(pmap, pv->pv_va, pmap_load(pde),
                                    &free);
                                freed++;
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to