Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 30 Sep 2012 03:54:57 +0000 (UTC)
From:      Alan Cox <alc@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r241063 - head/sys/arm/arm
Message-ID:  <201209300354.q8U3svar054213@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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))



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201209300354.q8U3svar054213>