From owner-svn-src-head@FreeBSD.ORG Fri Sep 27 13:11:21 2013 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 57F3BDEB; Fri, 27 Sep 2013 13:11:21 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 2BE022C44; Fri, 27 Sep 2013 13:11:21 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r8RDBKeQ090627; Fri, 27 Sep 2013 13:11:20 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r8RDBKPH090625; Fri, 27 Sep 2013 13:11:20 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201309271311.r8RDBKPH090625@svn.freebsd.org> From: Nathan Whitehorn Date: Fri, 27 Sep 2013 13:11:20 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r255909 - head/sys/powerpc/pseries X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 27 Sep 2013 13:11:21 -0000 Author: nwhitehorn Date: Fri Sep 27 13:11:20 2013 New Revision: 255909 URL: http://svnweb.freebsd.org/changeset/base/255909 Log: Make sure that ref and changed bits propagate back to the VM layer whenever pages are unmapped. The old code had several races that could allow these to become stale. Approved by: re (kib) Modified: head/sys/powerpc/pseries/mmu_phyp.c Modified: head/sys/powerpc/pseries/mmu_phyp.c ============================================================================== --- head/sys/powerpc/pseries/mmu_phyp.c Fri Sep 27 11:25:37 2013 (r255908) +++ head/sys/powerpc/pseries/mmu_phyp.c Fri Sep 27 13:11:20 2013 (r255909) @@ -201,6 +201,7 @@ mphyp_pte_synch(mmu_t mmu, uintptr_t slo struct lpte pte; uint64_t junk; + __asm __volatile("ptesync"); phyp_pft_hcall(H_READ, 0, slot, 0, 0, &pte.pte_hi, &pte.pte_lo, &junk); @@ -221,9 +222,16 @@ mphyp_pte_clear(mmu_t mmu, uintptr_t slo static void mphyp_pte_unset(mmu_t mmu, uintptr_t slot, struct lpte *pvo_pt, uint64_t vpn) { + struct lpte pte; + uint64_t junk; + int err; + + err = phyp_pft_hcall(H_REMOVE, 1UL << 31, slot, + pvo_pt->pte_hi & LPTE_AVPN_MASK, 0, &pte.pte_hi, &pte.pte_lo, + &junk); + KASSERT(err == H_SUCCESS, ("Error removing page: %d", err)); - /* XXX: last argument can check the VPN -- set flag to enable */ - phyp_hcall(H_REMOVE, 0, slot, vpn); + pvo_pt->pte_lo |= pte.pte_lo & (LPTE_CHG | LPTE_REF); } static void @@ -242,9 +250,7 @@ mphyp_pte_change(mmu_t mmu, uintptr_t sl ("Locked pages not supported on PHYP")); /* XXX: optimization using H_PROTECT for common case? */ - result = phyp_hcall(H_REMOVE, 0, slot, vpn); - if (result != H_SUCCESS) - panic("mphyp_pte_change() invalidation failure: %ld\n", result); + mphyp_pte_unset(mmu, slot, pvo_pt, vpn); result = phyp_pft_hcall(H_ENTER, H_EXACT, slot, pvo_pt->pte_hi, pvo_pt->pte_lo, &index, &evicted.pte_lo, &junk); if (result != H_SUCCESS) @@ -360,7 +366,8 @@ mphyp_pte_insert(mmu_t mmu, u_int ptegid if (pvo->pvo_pte.lpte.pte_hi == evicted.pte_hi) { KASSERT(pvo->pvo_pte.lpte.pte_hi & LPTE_VALID, ("Invalid PVO for valid PTE!")); - phyp_hcall(H_REMOVE, 0, index, 0); + mphyp_pte_unset(mmu, index, &pvo->pvo_pte.lpte, + pvo->pvo_vpn); PVO_PTEGIDX_CLR(pvo); moea64_pte_overflow++; break;