Module Name:    src
Committed By:   mrg
Date:           Wed Feb 24 09:49:36 UTC 2010

Modified Files:
        src/sys/arch/sparc64/sparc64: cache.h ipifuncs.c locore.s pmap.c

Log Message:
when handing back page table pages to UVM, flush them from the dcache
on all CPUs.

idea from skrll@, and makes my disk-based SB2000 stable.

tested on U60, SB2000 and SB2500.


To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/sparc64/sparc64/cache.h
cvs rdiff -u -r1.33 -r1.34 src/sys/arch/sparc64/sparc64/ipifuncs.c
cvs rdiff -u -r1.320 -r1.321 src/sys/arch/sparc64/sparc64/locore.s
cvs rdiff -u -r1.252 -r1.253 src/sys/arch/sparc64/sparc64/pmap.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/sparc64/sparc64/cache.h
diff -u src/sys/arch/sparc64/sparc64/cache.h:1.14 src/sys/arch/sparc64/sparc64/cache.h:1.15
--- src/sys/arch/sparc64/sparc64/cache.h:1.14	Wed Feb 24 06:05:35 2010
+++ src/sys/arch/sparc64/sparc64/cache.h	Wed Feb 24 09:49:36 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: cache.h,v 1.14 2010/02/24 06:05:35 mrg Exp $ */
+/*	$NetBSD: cache.h,v 1.15 2010/02/24 09:49:36 mrg Exp $ */
 
 /*
  * Copyright (c) 1996
@@ -138,8 +138,11 @@
 #ifdef MULTIPROCESSOR
 void smp_tlb_flush_pte(vaddr_t, struct pmap *);
 #define	tlb_flush_pte(va,pm)	smp_tlb_flush_pte(va, pm)
+void smp_dcache_flush_page_all(paddr_t pa);
+#define	dcache_flush_page_all(pa)	smp_dcache_flush_page_all(pa)
 #else
 #define	tlb_flush_pte(va,pm)	sp_tlb_flush_pte(va, (pm)->pm_ctx)
+#define	dcache_flush_page_all(pa)	dcache_flush_page(pa)
 #endif
 
 /* Various cache size/line sizes */

Index: src/sys/arch/sparc64/sparc64/ipifuncs.c
diff -u src/sys/arch/sparc64/sparc64/ipifuncs.c:1.33 src/sys/arch/sparc64/sparc64/ipifuncs.c:1.34
--- src/sys/arch/sparc64/sparc64/ipifuncs.c:1.33	Wed Feb 24 06:05:35 2010
+++ src/sys/arch/sparc64/sparc64/ipifuncs.c	Wed Feb 24 09:49:36 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: ipifuncs.c,v 1.33 2010/02/24 06:05:35 mrg Exp $ */
+/*	$NetBSD: ipifuncs.c,v 1.34 2010/02/24 09:49:36 mrg Exp $ */
 
 /*-
  * Copyright (c) 2004 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ipifuncs.c,v 1.33 2010/02/24 06:05:35 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ipifuncs.c,v 1.34 2010/02/24 09:49:36 mrg Exp $");
 
 #include "opt_ddb.h"
 
@@ -71,6 +71,8 @@
 void	sparc64_ipi_pause(void *);
 void	sparc64_ipi_flush_pte_us(void *);
 void	sparc64_ipi_flush_pte_usiii(void *);
+void	sparc64_ipi_dcache_flush_page_us(void *);
+void	sparc64_ipi_dcache_flush_page_usiii(void *);
 
 /*
  * Process cpu stop-self event.
@@ -409,6 +411,23 @@
 }
 
 /*
+ * Make sure this page is flushed from all CPUs.
+ */
+void
+smp_dcache_flush_page_all(paddr_t pa)
+{
+	ipifunc_t func;
+
+	if (CPU_IS_USIII_UP())
+		func = sparc64_ipi_dcache_flush_page_usiii;
+	else
+		func = sparc64_ipi_dcache_flush_page_us;
+
+	sparc64_broadcast_ipi(func, pa, dcache_line_size);
+	dcache_flush_page(pa);
+}
+
+/*
  * Print an error message.
  */
 void

Index: src/sys/arch/sparc64/sparc64/locore.s
diff -u src/sys/arch/sparc64/sparc64/locore.s:1.320 src/sys/arch/sparc64/sparc64/locore.s:1.321
--- src/sys/arch/sparc64/sparc64/locore.s:1.320	Wed Feb 24 01:58:53 2010
+++ src/sys/arch/sparc64/sparc64/locore.s	Wed Feb 24 09:49:36 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore.s,v 1.320 2010/02/24 01:58:53 mrg Exp $	*/
+/*	$NetBSD: locore.s,v 1.321 2010/02/24 09:49:36 mrg Exp $	*/
 
 /*
  * Copyright (c) 1996-2002 Eduardo Horvath
@@ -9047,6 +9047,65 @@
 	IPIEVC_INC(IPI_EVCNT_FPU_FLUSH,%g2,%g3)
 	ba,a	ret_from_intr_vector
 	 nop
+
+/*
+ * IPI handler to drop the current FPU state.
+ * void sparc64_ipi_dcache_flush_page_usiii(paddr_t pa, int line_size)
+ * void sparc64_ipi_dcache_flush_page_us(paddr_t pa, int line_size)
+ *
+ * On entry:
+ *	%g2 = pa
+ *	%g3 = line_size
+ */
+ENTRY(sparc64_ipi_dcache_flush_page_usiii)
+	set	NBPG, %g1
+	add	%g2, %g1, %g1	! end address
+
+1:
+	stxa	%g0, [%g2] ASI_DCACHE_INVALIDATE
+	add	%g2, %g3, %g2
+	cmp	%g2, %g1
+	bl,pt	%xcc, 1b
+	 nop
+
+	sethi	%hi(KERNBASE), %g5
+	flush	%g5
+	membar	#Sync
+	ba,a	ret_from_intr_vector
+	 nop
+
+ENTRY(sparc64_ipi_dcache_flush_page_us)
+	mov	-1, %g1		! Generate mask for tag: bits [29..2]
+	srlx	%g2, 13-2, %g5	! Tag is PA bits <40:13> in bits <29:2>
+	clr	%g4
+	srl	%g1, 2, %g1	! Now we have bits <29:0> set
+	set	(2*NBPG), %g7
+	ba,pt	%icc, 1f
+	 andn	%g1, 3, %g1	! Now we have bits <29:2> set
+
+	.align 8
+1:
+	ldxa	[%g4] ASI_DCACHE_TAG, %g6
+	mov	%g4, %g2
+	deccc	32, %g7
+	bl,pn	%icc, 2f
+	 inc	32, %g4
+
+	xor	%g6, %g5, %g6
+	andcc	%g6, %g1, %g0
+	bne,pt	%xcc, 1b
+	 membar	#LoadStore
+
+	stxa	%g0, [%g2] ASI_DCACHE_TAG
+	ba,pt	%icc, 1b
+	 membar	#StoreLoad
+2:
+
+	sethi	%hi(KERNBASE), %g5
+	flush	%g5
+	membar	#Sync
+	ba,a	ret_from_intr_vector
+	 nop
 #endif
 
 /*

Index: src/sys/arch/sparc64/sparc64/pmap.c
diff -u src/sys/arch/sparc64/sparc64/pmap.c:1.252 src/sys/arch/sparc64/sparc64/pmap.c:1.253
--- src/sys/arch/sparc64/sparc64/pmap.c:1.252	Wed Feb 24 01:58:53 2010
+++ src/sys/arch/sparc64/sparc64/pmap.c	Wed Feb 24 09:49:36 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.252 2010/02/24 01:58:53 mrg Exp $	*/
+/*	$NetBSD: pmap.c,v 1.253 2010/02/24 09:49:36 mrg Exp $	*/
 /*
  *
  * Copyright (C) 1996-1999 Eduardo Horvath.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.252 2010/02/24 01:58:53 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.253 2010/02/24 09:49:36 mrg Exp $");
 
 #undef	NO_VCACHE /* Don't forget the locked TLB in dostart */
 #define	HWREF
@@ -1405,6 +1405,7 @@
 		nextpg = TAILQ_NEXT(pg, listq.queue);
 		TAILQ_REMOVE(&pm->pm_obj.memq, pg, listq.queue);
 		KASSERT(pg->mdpage.mdpg_pvh.pv_pmap == NULL);
+		dcache_flush_page_all(VM_PAGE_TO_PHYS(pg));
 		uvm_pagefree(pg);
 	}
 	pmap_free_page((paddr_t)(u_long)pm->pm_segs);
@@ -3385,6 +3386,7 @@
 {
 	struct vm_page *pg = PHYS_TO_VM_PAGE(pa);
 
+	dcache_flush_page_all(pa);
 	uvm_pagefree(pg);
 }
 

Reply via email to