Author: alc
Date: Sun Sep 30 03:54:57 2012
New Revision: 241063
URL: http://svn.freebsd.org/changeset/base/241063

Log:
  Stop calling pmap_remove_write() from pmap_remove_all().  Doing so is not
  only inefficient but also leads to recursive lock acquisition.
  
  Tested by:    ray

Modified:
  head/sys/arm/arm/pmap-v6.c

Modified: head/sys/arm/arm/pmap-v6.c
==============================================================================
--- head/sys/arm/arm/pmap-v6.c  Sun Sep 30 03:25:04 2012        (r241062)
+++ head/sys/arm/arm/pmap-v6.c  Sun Sep 30 03:54:57 2012        (r241063)
@@ -2307,7 +2307,6 @@ pmap_remove_all(vm_page_t m)
        if (TAILQ_EMPTY(&m->md.pv_list))
                return;
        rw_wlock(&pvh_global_lock);
-       pmap_remove_write(m);
        curpm = vmspace_pmap(curproc->p_vmspace);
        while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
                if (flush == FALSE && (pv->pv_pmap == curpm ||
@@ -2318,6 +2317,8 @@ pmap_remove_all(vm_page_t m)
                l2b = pmap_get_l2_bucket(pv->pv_pmap, pv->pv_va);
                KASSERT(l2b != NULL, ("No l2 bucket"));
                ptep = &l2b->l2b_kva[l2pte_index(pv->pv_va)];
+               if (L2_S_WRITABLE(*ptep))
+                       vm_page_dirty(m);
                *ptep = 0;
                if (pmap_is_current(pv->pv_pmap))
                        PTE_SYNC(ptep);
@@ -2328,6 +2329,7 @@ pmap_remove_all(vm_page_t m)
                PMAP_UNLOCK(pv->pv_pmap);
                pmap_free_pv_entry(pv);
        }
+       m->md.pvh_attrs &= ~(PVF_MOD | PVF_REF);
 
        if (flush) {
                if (PV_BEEN_EXECD(flags))
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to