From owner-svn-src-projects@FreeBSD.ORG Fri Mar 19 17:05:41 2010 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id C2475106566B; Fri, 19 Mar 2010 17:05:41 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id B22EE8FC18; Fri, 19 Mar 2010 17:05:41 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o2JH5ft4011520; Fri, 19 Mar 2010 17:05:41 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o2JH5fCT011519; Fri, 19 Mar 2010 17:05:41 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201003191705.o2JH5fCT011519@svn.freebsd.org> From: Nathan Whitehorn Date: Fri, 19 Mar 2010 17:05:41 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r205339 - projects/ppc64/sys/powerpc/aim X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 19 Mar 2010 17:05:41 -0000 Author: nwhitehorn Date: Fri Mar 19 17:05:41 2010 New Revision: 205339 URL: http://svn.freebsd.org/changeset/base/205339 Log: Fix some minor races during SLB spills, and correct a comment that no longer reflects the truth. Modified: projects/ppc64/sys/powerpc/aim/slb.c Modified: projects/ppc64/sys/powerpc/aim/slb.c ============================================================================== --- projects/ppc64/sys/powerpc/aim/slb.c Fri Mar 19 16:25:05 2010 (r205338) +++ projects/ppc64/sys/powerpc/aim/slb.c Fri Mar 19 17:05:41 2010 (r205339) @@ -174,10 +174,8 @@ slb_insert(pmap_t pm, struct slb *slbcac uint64_t slbe, slbv; int i, j, to_spill; - /* - * Note: no locking is necessary in this function because all slbcaches - * are either for the current thread or per-CPU. - */ + /* We don't want to be preempted while modifying the kernel map */ + critical_enter(); to_spill = -1; slbv = slb_entry->slbv; @@ -203,6 +201,11 @@ slb_insert(pmap_t pm, struct slb *slbcac panic("SLB spill on ESID %#lx, but no available candidates!\n", (slbe & SLBE_ESID_MASK) >> SLBE_ESID_SHIFT); + if (slbcache[to_spill].slbe & SLBE_VALID) { + /* Invalidate this first to avoid races */ + slbcache[to_spill].slbe = 0; + mb(); + } slbcache[to_spill].slbv = slbv; slbcache[to_spill].slbe = slbe | (uint64_t)to_spill; @@ -213,6 +216,8 @@ slb_insert(pmap_t pm, struct slb *slbcac "r"(slbcache[to_spill].slbv), "r"(slbcache[to_spill].slbe)); } + + critical_exit(); } int