From owner-svn-src-user@FreeBSD.ORG  Mon Oct 24 01:19:34 2011
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 79C7C106566C;
	Mon, 24 Oct 2011 01:19:34 +0000 (UTC) (envelope-from alc@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
	by mx1.freebsd.org (Postfix) with ESMTP id 6A6EC8FC18;
	Mon, 24 Oct 2011 01:19:34 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
	by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p9O1JYX9065508;
	Mon, 24 Oct 2011 01:19:34 GMT (envelope-from alc@svn.freebsd.org)
Received: (from alc@localhost)
	by svn.freebsd.org (8.14.4/8.14.4/Submit) id p9O1JYQb065506;
	Mon, 24 Oct 2011 01:19:34 GMT (envelope-from alc@svn.freebsd.org)
Message-Id: <201110240119.p9O1JYQb065506@svn.freebsd.org>
From: Alan Cox <alc@FreeBSD.org>
Date: Mon, 24 Oct 2011 01:19:34 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Cc: 
Subject: svn commit: r226677 - user/attilio/vmcontention/sys/sparc64/sparc64
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Mon, 24 Oct 2011 01:19:34 -0000

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);