Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 24 Oct 2011 01:19:34 +0000 (UTC)
From:      Alan Cox <alc@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r226677 - user/attilio/vmcontention/sys/sparc64/sparc64
Message-ID:  <201110240119.p9O1JYQb065506@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: alc
Date: Mon Oct 24 01:19:34 2011
New Revision: 226677
URL: http://svn.freebsd.org/changeset/base/226677

Log:
  Acquire the pmap lock in order to prevent a race that might lead to the
  machine-independent layer mistakenly believing that a dirty page is clean.

Modified:
  user/attilio/vmcontention/sys/sparc64/sparc64/pmap.c

Modified: user/attilio/vmcontention/sys/sparc64/sparc64/pmap.c
==============================================================================
--- user/attilio/vmcontention/sys/sparc64/sparc64/pmap.c	Mon Oct 24 00:38:09 2011	(r226676)
+++ user/attilio/vmcontention/sys/sparc64/sparc64/pmap.c	Mon Oct 24 01:19:34 2011	(r226677)
@@ -2057,6 +2057,7 @@ boolean_t
 pmap_is_modified(vm_page_t m)
 {
 	struct tte *tp;
+	pmap_t pmap;
 	boolean_t rv;
 
 	KASSERT((m->oflags & VPO_UNMANAGED) == 0,
@@ -2076,10 +2077,13 @@ pmap_is_modified(vm_page_t m)
 	TAILQ_FOREACH(tp, &m->md.tte_list, tte_link) {
 		if ((tp->tte_data & TD_PV) == 0)
 			continue;
-		if ((tp->tte_data & TD_W) != 0) {
+		pmap = TTE_GET_PMAP(tp);
+		PMAP_LOCK(pmap);
+		if ((tp->tte_data & TD_W) != 0)
 			rv = TRUE;
+		PMAP_UNLOCK(pmap);
+		if (rv)
 			break;
-		}
 	}
 	MDPAGE_RUNLOCK();
 	return (rv);
@@ -2181,6 +2185,7 @@ void
 pmap_remove_write(vm_page_t m)
 {
 	struct tte *tp;
+	pmap_t pmap;
 	u_long data;
 
 	KASSERT((m->oflags & VPO_UNMANAGED) == 0,
@@ -2199,11 +2204,14 @@ pmap_remove_write(vm_page_t m)
 	TAILQ_FOREACH(tp, &m->md.tte_list, tte_link) {
 		if ((tp->tte_data & TD_PV) == 0)
 			continue;
+		pmap = TTE_GET_PMAP(tp);
+		PMAP_LOCK(pmap);
 		data = atomic_clear_long(&tp->tte_data, TD_SW | TD_W);
 		if ((data & TD_W) != 0) {
 			vm_page_dirty(m);
-			tlb_page_demap(TTE_GET_PMAP(tp), TTE_GET_VA(tp));
+			tlb_page_demap(pmap, TTE_GET_VA(tp));
 		}
+		PMAP_UNLOCK(pmap);
 	}
 	MDPAGE_RUNLOCK();
 	vm_page_aflag_clear(m, PGA_WRITEABLE);



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