Module Name:    src
Committed By:   tsutsui
Date:           Fri Jun  3 17:03:53 UTC 2011

Modified Files:
        src/sys/arch/m68k/include: pmap_motorola.h
        src/sys/arch/m68k/m68k: pmap_motorola.c
        src/sys/arch/sun2/include: pmap.h
        src/sys/arch/sun2/sun2: pmap.c
        src/sys/arch/sun3/include: pmap3.h pmap3x.h
        src/sys/arch/sun3/sun3: pmap.c
        src/sys/arch/sun3/sun3x: pmap.c

Log Message:
- remove simple_lock(9) and use atomic_ops(3) to account pmap reference count,
  perrequest from rmind@
- while here no need to export struct pmap on sun2/sun3/sun3x

No particular problem for a week on hp300 and sun3x kernels with disabled
tcp_vtw which has been broken for a month on low memory machines.


To generate a diff of this commit:
cvs rdiff -u -r1.32 -r1.33 src/sys/arch/m68k/include/pmap_motorola.h
cvs rdiff -u -r1.60 -r1.61 src/sys/arch/m68k/m68k/pmap_motorola.c
cvs rdiff -u -r1.23 -r1.24 src/sys/arch/sun2/include/pmap.h
cvs rdiff -u -r1.43 -r1.44 src/sys/arch/sun2/sun2/pmap.c
cvs rdiff -u -r1.47 -r1.48 src/sys/arch/sun3/include/pmap3.h
cvs rdiff -u -r1.28 -r1.29 src/sys/arch/sun3/include/pmap3x.h
cvs rdiff -u -r1.165 -r1.166 src/sys/arch/sun3/sun3/pmap.c
cvs rdiff -u -r1.111 -r1.112 src/sys/arch/sun3/sun3x/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/m68k/include/pmap_motorola.h
diff -u src/sys/arch/m68k/include/pmap_motorola.h:1.32 src/sys/arch/m68k/include/pmap_motorola.h:1.33
--- src/sys/arch/m68k/include/pmap_motorola.h:1.32	Thu Jan  6 13:49:16 2011
+++ src/sys/arch/m68k/include/pmap_motorola.h	Fri Jun  3 17:03:52 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap_motorola.h,v 1.32 2011/01/06 13:49:16 tsutsui Exp $	*/
+/*	$NetBSD: pmap_motorola.h,v 1.33 2011/06/03 17:03:52 tsutsui Exp $	*/
 
 /* 
  * Copyright (c) 1991, 1993
@@ -80,7 +80,6 @@
 #include "opt_m68k_arch.h"
 #endif
 
-#include <sys/simplelock.h>
 #include <machine/cpu.h>
 #include <machine/pte.h>
 
@@ -93,8 +92,7 @@
 	u_int			pm_stfree;	/* 040: free lev2 blocks */
 	st_entry_t		*pm_stpa;	/* 040: ST phys addr */
 	uint16_t		pm_sref;	/* segment table ref count */
-	uint16_t		pm_count;	/* pmap reference count */
-	struct simplelock	pm_lock;	/* lock on pmap */
+	u_int			pm_count;	/* pmap reference count */
 	struct pmap_statistics	pm_stats;	/* pmap statistics */
 	int			pm_ptpages;	/* more stats: PT pages */
 };

Index: src/sys/arch/m68k/m68k/pmap_motorola.c
diff -u src/sys/arch/m68k/m68k/pmap_motorola.c:1.60 src/sys/arch/m68k/m68k/pmap_motorola.c:1.61
--- src/sys/arch/m68k/m68k/pmap_motorola.c:1.60	Fri Jan 14 02:06:27 2011
+++ src/sys/arch/m68k/m68k/pmap_motorola.c	Fri Jun  3 17:03:52 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap_motorola.c,v 1.60 2011/01/14 02:06:27 rmind Exp $        */
+/*	$NetBSD: pmap_motorola.c,v 1.61 2011/06/03 17:03:52 tsutsui Exp $        */
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -119,7 +119,7 @@
 #include "opt_m68k_arch.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap_motorola.c,v 1.60 2011/01/14 02:06:27 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap_motorola.c,v 1.61 2011/06/03 17:03:52 tsutsui Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -127,6 +127,7 @@
 #include <sys/malloc.h>
 #include <sys/pool.h>
 #include <sys/cpu.h>
+#include <sys/atomic.h>
 
 #include <machine/pte.h>
 #include <machine/pcb.h>
@@ -362,7 +363,6 @@
 	if (mmutype == MMU_68040)
 		pmap_kernel()->pm_stfree = protostfree;
 #endif
-	simple_lock_init(&pmap_kernel()->pm_lock);
 	pmap_kernel()->pm_count = 1;
 
 	/*
@@ -791,7 +791,6 @@
 		pmap->pm_stfree = protostfree;
 #endif
 	pmap->pm_count = 1;
-	simple_lock_init(&pmap->pm_lock);
 }
 
 /*
@@ -807,9 +806,7 @@
 
 	PMAP_DPRINTF(PDB_FOLLOW, ("pmap_destroy(%p)\n", pmap));
 
-	simple_lock(&pmap->pm_lock);
-	count = --pmap->pm_count;
-	simple_unlock(&pmap->pm_lock);
+	count = atomic_dec_uint_nv(&pmap->pm_count);
 	if (count == 0) {
 		pmap_release(pmap);
 		pool_put(&pmap_pmap_pool, pmap);
@@ -831,7 +828,6 @@
 
 #ifdef notdef /* DIAGNOSTIC */
 	/* count would be 0 from pmap_destroy... */
-	simple_lock(&pmap->pm_lock);
 	if (pmap->pm_count != 1)
 		panic("pmap_release count");
 #endif
@@ -857,9 +853,7 @@
 {
 	PMAP_DPRINTF(PDB_FOLLOW, ("pmap_reference(%p)\n", pmap));
 
-	simple_lock(&pmap->pm_lock);
-	pmap->pm_count++;
-	simple_unlock(&pmap->pm_lock);
+	atomic_inc_uint(&pmap->pm_count);
 }
 
 /*

Index: src/sys/arch/sun2/include/pmap.h
diff -u src/sys/arch/sun2/include/pmap.h:1.23 src/sys/arch/sun2/include/pmap.h:1.24
--- src/sys/arch/sun2/include/pmap.h:1.23	Fri Dec 11 18:31:27 2009
+++ src/sys/arch/sun2/include/pmap.h	Fri Jun  3 17:03:52 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.h,v 1.23 2009/12/11 18:31:27 tsutsui Exp $	*/
+/*	$NetBSD: pmap.h,v 1.24 2011/06/03 17:03:52 tsutsui Exp $	*/
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -29,22 +29,18 @@
 #ifndef	_MACHINE_PMAP_H
 #define	_MACHINE_PMAP_H
 
-#include <sys/simplelock.h>
-
+#ifdef _KERNEL
 /*
  * Physical map structures exported to the VM code.
- * XXX - Does user-level code really see this struct?
  */
 
 struct pmap {
 	unsigned char   	*pm_segmap; 	/* soft copy of segmap */
 	int             	pm_ctxnum;	/* MMU context number */
-	struct simplelock	pm_lock;    	/* lock on pmap */
-	int             	pm_refcount;	/* reference count */
+	u_int             	pm_refcount;	/* reference count */
 	int             	pm_version;
 };
 
-#ifdef _KERNEL
 /*
  * We give the pmap code a chance to resolve faults by
  * reloading translations that it was forced to unload.

Index: src/sys/arch/sun2/sun2/pmap.c
diff -u src/sys/arch/sun2/sun2/pmap.c:1.43 src/sys/arch/sun2/sun2/pmap.c:1.44
--- src/sys/arch/sun2/sun2/pmap.c:1.43	Fri Dec 11 13:56:16 2009
+++ src/sys/arch/sun2/sun2/pmap.c	Fri Jun  3 17:03:52 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.43 2009/12/11 13:56:16 tsutsui Exp $	*/
+/*	$NetBSD: pmap.c,v 1.44 2011/06/03 17:03:52 tsutsui Exp $	*/
 
 /*-
  * Copyright (c) 1996 The NetBSD Foundation, Inc.
@@ -82,7 +82,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.43 2009/12/11 13:56:16 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.44 2011/06/03 17:03:52 tsutsui Exp $");
 
 #include "opt_ddb.h"
 #include "opt_pmap_debug.h"
@@ -94,6 +94,7 @@
 #include <sys/pool.h>
 #include <sys/queue.h>
 #include <sys/kcore.h>
+#include <sys/atomic.h>
 
 #include <uvm/uvm.h>
 
@@ -242,12 +243,6 @@
 	int	ps_vac_recached;	/* re-cached when bad alias gone */
 } pmap_stats;
 
-#define pmap_lock(pmap) simple_lock(&pmap->pm_lock)
-#define pmap_unlock(pmap) simple_unlock(&pmap->pm_lock)
-#define pmap_add_ref(pmap) ++pmap->pm_refcount
-#define pmap_del_ref(pmap) --pmap->pm_refcount
-#define pmap_refcount(pmap) pmap->pm_refcount
-
 #ifdef	PMAP_DEBUG
 #define	CHECK_SPL() do { \
 	if ((getsr() & PSL_IPL) < PSL_IPL4) \
@@ -1486,7 +1481,6 @@
 	pmap->pm_refcount = 1;
 	pmap->pm_version = pmap_version++;
 	pmap->pm_ctxnum = EMPTY_CONTEXT;
-	simple_lock_init(&pmap->pm_lock);
 }
 
 /*
@@ -1900,9 +1894,7 @@
 #endif
 	if (pmap == kernel_pmap)
 		panic("pmap_destroy: kernel_pmap!");
-	pmap_lock(pmap);
-	count = pmap_del_ref(pmap);
-	pmap_unlock(pmap);
+	count = atomic_dec_uint_nv(&pmap->pm_refcount);
 	if (count == 0) {
 		pmap_release(pmap);
 		pool_put(&pmap_pmap_pool, pmap);
@@ -1915,9 +1907,8 @@
 void 
 pmap_reference(pmap_t pmap)
 {
-	pmap_lock(pmap);
-	pmap_add_ref(pmap);
-	pmap_unlock(pmap);
+
+	atomic_inc_uint(&pmap->pm_refcount);
 }
 
 

Index: src/sys/arch/sun3/include/pmap3.h
diff -u src/sys/arch/sun3/include/pmap3.h:1.47 src/sys/arch/sun3/include/pmap3.h:1.48
--- src/sys/arch/sun3/include/pmap3.h:1.47	Fri Dec 11 18:40:08 2009
+++ src/sys/arch/sun3/include/pmap3.h	Fri Jun  3 17:03:52 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap3.h,v 1.47 2009/12/11 18:40:08 tsutsui Exp $	*/
+/*	$NetBSD: pmap3.h,v 1.48 2011/06/03 17:03:52 tsutsui Exp $	*/
 
 /*-
  * Copyright (c) 1996 The NetBSD Foundation, Inc.
@@ -29,22 +29,18 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
+#ifdef _KERNEL
 /*
  * Physical map structures exported to the VM code.
- * XXX - Does user-level code really see this struct?
  */
 
-#include <sys/simplelock.h>
-
 struct pmap {
 	unsigned char   	*pm_segmap; 	/* soft copy of segmap */
 	int             	pm_ctxnum;	/* MMU context number */
-	struct simplelock	pm_lock;    	/* lock on pmap */
-	int             	pm_refcount;	/* reference count */
+	u_int             	pm_refcount;	/* reference count */
 	int             	pm_version;
 };
 
-#ifdef _KERNEL
 /*
  * We give the pmap code a chance to resolve faults by
  * reloading translations that it was forced to unload.

Index: src/sys/arch/sun3/include/pmap3x.h
diff -u src/sys/arch/sun3/include/pmap3x.h:1.28 src/sys/arch/sun3/include/pmap3x.h:1.29
--- src/sys/arch/sun3/include/pmap3x.h:1.28	Fri Dec 11 18:40:08 2009
+++ src/sys/arch/sun3/include/pmap3x.h	Fri Jun  3 17:03:52 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap3x.h,v 1.28 2009/12/11 18:40:08 tsutsui Exp $	*/
+/*	$NetBSD: pmap3x.h,v 1.29 2011/06/03 17:03:52 tsutsui Exp $	*/
 
 /*-
  * Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -29,22 +29,18 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
+#ifdef _KERNEL
 /*
  * Physical map structures exported to the VM code.
- * XXX - Does user-level code really see this struct?
  */
 
-#include <sys/simplelock.h>
-
 struct pmap {
 	struct a_tmgr_struct	*pm_a_tmgr; 	/* Level-A table manager */
-	u_long              	pm_a_phys;  	/* MMU level-A phys addr */
-	struct simplelock	pm_lock;    	/* lock on pmap */
-	int             	pm_refcount;	/* reference count */
+	paddr_t              	pm_a_phys;  	/* MMU level-A phys addr */
+	u_int             	pm_refcount;	/* reference count */
 	int             	pm_version;
 };
 
-#ifdef _KERNEL
 /* Common function for pmap_resident_count(), pmap_wired_count() */
 segsz_t pmap_count(pmap_t, int);
 

Index: src/sys/arch/sun3/sun3/pmap.c
diff -u src/sys/arch/sun3/sun3/pmap.c:1.165 src/sys/arch/sun3/sun3/pmap.c:1.166
--- src/sys/arch/sun3/sun3/pmap.c:1.165	Fri Oct 15 15:55:53 2010
+++ src/sys/arch/sun3/sun3/pmap.c	Fri Jun  3 17:03:53 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.165 2010/10/15 15:55:53 tsutsui Exp $	*/
+/*	$NetBSD: pmap.c,v 1.166 2011/06/03 17:03:53 tsutsui Exp $	*/
 
 /*-
  * Copyright (c) 1996 The NetBSD Foundation, Inc.
@@ -80,7 +80,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.165 2010/10/15 15:55:53 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.166 2011/06/03 17:03:53 tsutsui Exp $");
 
 #include "opt_ddb.h"
 #include "opt_pmap_debug.h"
@@ -92,6 +92,7 @@
 #include <sys/pool.h>
 #include <sys/queue.h>
 #include <sys/kcore.h>
+#include <sys/atomic.h>
 
 #include <uvm/uvm.h>
 
@@ -248,12 +249,6 @@
 	int	ps_vac_recached;	/* re-cached when bad alias gone */
 } pmap_stats;
 
-#define pmap_lock(pmap) simple_lock(&pmap->pm_lock)
-#define pmap_unlock(pmap) simple_unlock(&pmap->pm_lock)
-#define pmap_add_ref(pmap) ++pmap->pm_refcount
-#define pmap_del_ref(pmap) --pmap->pm_refcount
-#define pmap_refcount(pmap) pmap->pm_refcount
-
 #ifdef	PMAP_DEBUG
 #define	CHECK_SPL() do { \
 	if ((getsr() & PSL_IPL) < PSL_IPL4) \
@@ -1490,7 +1485,6 @@
 	pmap->pm_refcount = 1;
 	pmap->pm_version = pmap_version++;
 	pmap->pm_ctxnum = EMPTY_CONTEXT;
-	simple_lock_init(&pmap->pm_lock);
 }
 
 /*
@@ -1929,9 +1923,7 @@
 #endif
 	if (pmap == kernel_pmap)
 		panic("pmap_destroy: kernel_pmap!");
-	pmap_lock(pmap);
-	count = pmap_del_ref(pmap);
-	pmap_unlock(pmap);
+	count = atomic_dec_uint_nv(&pmap->pm_refcount);
 	if (count == 0) {
 		pmap_release(pmap);
 		pool_put(&pmap_pmap_pool, pmap);
@@ -1944,9 +1936,8 @@
 void 
 pmap_reference(pmap_t pmap)
 {
-	pmap_lock(pmap);
-	pmap_add_ref(pmap);
-	pmap_unlock(pmap);
+
+	atomic_inc_uint(&pmap->pm_refcount);
 }
 
 

Index: src/sys/arch/sun3/sun3x/pmap.c
diff -u src/sys/arch/sun3/sun3x/pmap.c:1.111 src/sys/arch/sun3/sun3x/pmap.c:1.112
--- src/sys/arch/sun3/sun3x/pmap.c:1.111	Fri Oct 15 15:55:53 2010
+++ src/sys/arch/sun3/sun3x/pmap.c	Fri Jun  3 17:03:53 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.111 2010/10/15 15:55:53 tsutsui Exp $	*/
+/*	$NetBSD: pmap.c,v 1.112 2011/06/03 17:03:53 tsutsui Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc.
@@ -105,7 +105,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.111 2010/10/15 15:55:53 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.112 2011/06/03 17:03:53 tsutsui Exp $");
 
 #include "opt_ddb.h"
 #include "opt_pmap_debug.h"
@@ -117,6 +117,7 @@
 #include <sys/pool.h>
 #include <sys/queue.h>
 #include <sys/kcore.h>
+#include <sys/atomic.h>
 
 #include <uvm/uvm.h>
 
@@ -356,12 +357,6 @@
 #define	NUM_KERN_PTES	(KVAS_SIZE >> MMU_TIC_SHIFT)
 
 /*************************** MISCELANEOUS MACROS *************************/
-#define pmap_lock(pmap) simple_lock(&pmap->pm_lock)
-#define pmap_unlock(pmap) simple_unlock(&pmap->pm_lock)
-#define pmap_add_ref(pmap) ++pmap->pm_refcount
-#define pmap_del_ref(pmap) --pmap->pm_refcount
-#define pmap_refcount(pmap) pmap->pm_refcount
-
 void *pmap_bootstrap_alloc(int);
 
 static INLINE void *mmu_ptov(paddr_t);
@@ -835,7 +830,6 @@
 	kernel_pmap.pm_a_tmgr = NULL;
 	kernel_pmap.pm_a_phys = kernAphys;
 	kernel_pmap.pm_refcount = 1; /* always in use */
-	simple_lock_init(&kernel_pmap.pm_lock);
 
 	kernel_crp.rp_attr = MMU_LONG_DTE_LU | MMU_DT_LONG;
 	kernel_crp.rp_addr = kernAphys;
@@ -2530,7 +2524,6 @@
 	pmap->pm_a_tmgr = NULL;
 	pmap->pm_a_phys = kernAphys;
 	pmap->pm_refcount = 1;
-	simple_lock_init(&pmap->pm_lock);
 }
 
 /* pmap_create			INTERFACE
@@ -2601,9 +2594,8 @@
 void 
 pmap_reference(pmap_t pmap)
 {
-	pmap_lock(pmap);
-	pmap_add_ref(pmap);
-	pmap_unlock(pmap);
+
+	atomic_inc_uint(&pmap->pm_refcount);
 }
 
 /* pmap_dereference			INTERNAL
@@ -2616,9 +2608,7 @@
 {
 	int rtn;
 
-	pmap_lock(pmap);
-	rtn = pmap_del_ref(pmap);
-	pmap_unlock(pmap);
+	rtn = atomic_dec_uint_nv(&pmap->pm_refcount);
 
 	return rtn;
 }

Reply via email to