Module Name:    src
Committed By:   chs
Date:           Sun Nov  4 00:32:47 UTC 2012

Modified Files:
        src/sys/arch/sparc/sparc: locore.s pmap.c

Log Message:
in cpu_switchto(), remove the MP-unsafe code to mark a pmap active on a CPU,
pmap_activate() already does this.  add MP locking to pmap_activate()
and pmap_deactivate().  move flushing of user windows and virtual caches
from pamp_activate() to pmap_deactivate().


To generate a diff of this commit:
cvs rdiff -u -r1.267 -r1.268 src/sys/arch/sparc/sparc/locore.s
cvs rdiff -u -r1.348 -r1.349 src/sys/arch/sparc/sparc/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/sparc/sparc/locore.s
diff -u src/sys/arch/sparc/sparc/locore.s:1.267 src/sys/arch/sparc/sparc/locore.s:1.268
--- src/sys/arch/sparc/sparc/locore.s:1.267	Fri Nov  2 00:01:19 2012
+++ src/sys/arch/sparc/sparc/locore.s	Sun Nov  4 00:32:47 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore.s,v 1.267 2012/11/02 00:01:19 chs Exp $	*/
+/*	$NetBSD: locore.s,v 1.268 2012/11/04 00:32:47 chs Exp $	*/
 
 /*
  * Copyright (c) 1996 Paul Kranenburg
@@ -4935,19 +4935,6 @@ Lnosaveoldlwp:
 	/*
 	 * Now running p.  
 	 */
-#if defined(MULTIPROCESSOR)
-	ld	[%g3 + L_PROC], %o2	! p = l->l_proc;
-	ld	[%o2 + P_VMSPACE], %o3	! vm = p->p_vmspace;
-	ld	[%o3 + VM_PMAP], %o4	! pm = vm->vm_map.vm_pmap;
-	/* Add this CPU to the pmap's CPU set */
-	sethi	%hi(CPUINFO_VA + CPUINFO_CPUNO), %o0
-	ld	[%o0 + %lo(CPUINFO_VA + CPUINFO_CPUNO)], %o1
-	mov	1, %o2
-	ld	[%o4 + PMAP_CPUSET], %o0
-	sll	%o2, %o1, %o2
-	or	%o0, %o2, %o0		! pm->pm_cpuset |= cpu_number();
-	st	%o0, [%o4 + PMAP_CPUSET]
-#endif
 
 	/*
 	 * Check for restartable atomic sequences (RAS)

Index: src/sys/arch/sparc/sparc/pmap.c
diff -u src/sys/arch/sparc/sparc/pmap.c:1.348 src/sys/arch/sparc/sparc/pmap.c:1.349
--- src/sys/arch/sparc/sparc/pmap.c:1.348	Sun Jan 29 11:49:58 2012
+++ src/sys/arch/sparc/sparc/pmap.c	Sun Nov  4 00:32:47 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.348 2012/01/29 11:49:58 para Exp $ */
+/*	$NetBSD: pmap.c,v 1.349 2012/11/04 00:32:47 chs Exp $ */
 
 /*
  * Copyright (c) 1996
@@ -56,7 +56,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.348 2012/01/29 11:49:58 para Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.349 2012/11/04 00:32:47 chs Exp $");
 
 #include "opt_ddb.h"
 #include "opt_kgdb.h"
@@ -7440,31 +7440,19 @@ void
 pmap_activate(struct lwp *l)
 {
 	pmap_t pm = l->l_proc->p_vmspace->vm_map.pmap;
-	int s;
 
-	/*
-	 * This is essentially the same thing that happens in cpu_switch()
-	 * when the newly selected process is about to run, except that we
-	 * have to make sure to clean the register windows before we set
-	 * the new context.
-	 */
+	if (pm == pmap_kernel() || l != curlwp) {
+		return;
+	}
 
-	s = splvm();
-	if (l == curlwp) {
-		write_user_windows();
-		if (pm->pm_ctx == NULL) {
-			ctx_alloc(pm);	/* performs setcontext() */
-		} else {
-			/* Do any cache flush needed on context switch */
-			(*cpuinfo.pure_vcache_flush)();
-			setcontext(pm->pm_ctxnum);
-		}
-#if defined(MULTIPROCESSOR)
-		if (pm != pmap_kernel())
-			PMAP_SET_CPUSET(pm, &cpuinfo);
-#endif
+	PMAP_LOCK();
+	if (pm->pm_ctx == NULL) {
+		ctx_alloc(pm);	/* performs setcontext() */
+	} else {
+		setcontext(pm->pm_ctxnum);
 	}
-	splx(s);
+	PMAP_SET_CPUSET(pm, &cpuinfo);
+	PMAP_UNLOCK();
 }
 
 /*
@@ -7473,22 +7461,27 @@ pmap_activate(struct lwp *l)
 void
 pmap_deactivate(struct lwp *l)
 {
-#if defined(MULTIPROCESSOR)
-	pmap_t pm;
-	struct proc *p;
+	struct proc *p = l->l_proc;
+	pmap_t pm = p->p_vmspace->vm_map.pmap;
+
+	if (pm == pmap_kernel() || l != curlwp) {
+		return;
+	}
+
+	write_user_windows();
+	PMAP_LOCK();
+	if (pm->pm_ctx) {
+		(*cpuinfo.pure_vcache_flush)();
 
-	p = l->l_proc;
-	if (p->p_vmspace &&
-	    (pm = p->p_vmspace->vm_map.pmap) != pmap_kernel()) {
 #if defined(SUN4M) || defined(SUN4D)
-		if (pm->pm_ctx && CPU_HAS_SRMMU)
+		if (CPU_HAS_SRMMU)
 			sp_tlb_flush(0, pm->pm_ctxnum, ASI_SRMMUFP_L0);
 #endif
-
-		/* we no longer need broadcast tlb flushes for this pmap. */
-		PMAP_CLR_CPUSET(pm, &cpuinfo);
 	}
-#endif
+
+	/* we no longer need broadcast tlb flushes for this pmap. */
+	PMAP_CLR_CPUSET(pm, &cpuinfo);
+	PMAP_UNLOCK();
 }
 
 #ifdef DEBUG

Reply via email to