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