summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_map.h
diff options
context:
space:
mode:
authordyson <dyson@FreeBSD.org>1997-08-18 02:06:35 +0000
committerdyson <dyson@FreeBSD.org>1997-08-18 02:06:35 +0000
commitcc823b6e73bb5ca0ce0985be66c29c51c6db4610 (patch)
treeb0ab1e166385449ac1be20b025e2a4c29bbc281e /sys/vm/vm_map.h
parent228bbc181cefc1f36d72c2b52dec55b3665a14cd (diff)
downloadFreeBSD-src-cc823b6e73bb5ca0ce0985be66c29c51c6db4610.zip
FreeBSD-src-cc823b6e73bb5ca0ce0985be66c29c51c6db4610.tar.gz
Fix kern_lock so that it will work. Additionally, clean-up some of the
VM systems usage of the kernel lock (lockmgr) code. This is a first pass implementation, and is expected to evolve as needed. The API for the lock manager code has not changed, but the underlying implementation has changed significantly. This change should not materially affect our current SMP or UP code without non-standard parameters being used.
Diffstat (limited to 'sys/vm/vm_map.h')
-rw-r--r--sys/vm/vm_map.h62
1 files changed, 58 insertions, 4 deletions
diff --git a/sys/vm/vm_map.h b/sys/vm/vm_map.h
index 7b87856..aa8ddb2 100644
--- a/sys/vm/vm_map.h
+++ b/sys/vm/vm_map.h
@@ -61,7 +61,7 @@
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*
- * $Id: vm_map.h,v 1.26 1997/04/07 07:16:06 peter Exp $
+ * $Id: vm_map.h,v 1.27 1997/08/05 00:01:58 dyson Exp $
*/
/*
@@ -193,25 +193,78 @@ typedef struct {
&(map)->ref_lock, curproc); \
(map)->timestamp++; \
}
+
#ifdef DIAGNOSTIC
+/* #define MAP_LOCK_DIAGNOSTIC 1 */
+#ifdef MAP_LOCK_DIAGNOSTIC
+#define vm_map_lock(map) { \
+ printf ("locking map LK_EXCLUSIVE: 0x%x\n", map); \
+ if (lockmgr(&(map)->lock, LK_EXCLUSIVE, (void *)0, curproc) != 0) { \
+ panic("vm_map_lock: failed to get lock"); \
+ } \
+ (map)->timestamp++; \
+}
+#else
#define vm_map_lock(map) { \
if (lockmgr(&(map)->lock, LK_EXCLUSIVE, (void *)0, curproc) != 0) { \
panic("vm_map_lock: failed to get lock"); \
} \
(map)->timestamp++; \
}
+#endif
#else
#define vm_map_lock(map) { \
lockmgr(&(map)->lock, LK_EXCLUSIVE, (void *)0, curproc); \
(map)->timestamp++; \
}
#endif /* DIAGNOSTIC */
+
+#if defined(MAP_LOCK_DIAGNOSTIC)
+#define vm_map_unlock(map) \
+ do { \
+ printf ("locking map LK_RELEASE: 0x%x\n", map); \
+ lockmgr(&(map)->lock, LK_RELEASE, (void *)0, curproc); \
+ } while (0);
+#define vm_map_lock_read(map) \
+ do { \
+ printf ("locking map LK_SHARED: 0x%x\n", map); \
+ lockmgr(&(map)->lock, LK_SHARED, (void *)0, curproc); \
+ } while (0);
+#define vm_map_unlock_read(map) \
+ do { \
+ printf ("locking map LK_RELEASE: 0x%x\n", map); \
+ lockmgr(&(map)->lock, LK_RELEASE, (void *)0, curproc); \
+ } while (0);
+#else
#define vm_map_unlock(map) \
- lockmgr(&(map)->lock, LK_RELEASE, (void *)0, curproc)
+ lockmgr(&(map)->lock, LK_RELEASE, (void *)0, curproc);
#define vm_map_lock_read(map) \
- lockmgr(&(map)->lock, LK_SHARED, (void *)0, curproc)
+ lockmgr(&(map)->lock, LK_SHARED, (void *)0, curproc);
#define vm_map_unlock_read(map) \
- lockmgr(&(map)->lock, LK_RELEASE, (void *)0, curproc)
+ lockmgr(&(map)->lock, LK_RELEASE, (void *)0, curproc);
+#endif
+
+static __inline__ int
+_vm_map_lock_upgrade(vm_map_t map, struct proc *p) {
+#if defined(MAP_LOCK_DIAGNOSTIC)
+ printf("locking map LK_EXCLUPGRADE: 0x%x\n", map);
+#endif
+ return lockmgr(&(map)->lock, LK_EXCLUPGRADE, (void *)0, p);
+}
+
+#define vm_map_lock_upgrade(map) _vm_map_lock_upgrade(map, curproc)
+
+#if defined(MAP_LOCK_DIAGNOSTIC)
+#define vm_map_lock_downgrade(map) \
+ do { \
+ printf ("locking map LK_DOWNGRADE: 0x%x\n", map); \
+ lockmgr(&(map)->lock, LK_DOWNGRADE, (void *)0, curproc); \
+ } while (0);
+#else
+#define vm_map_lock_downgrade(map) \
+ lockmgr(&(map)->lock, LK_DOWNGRADE, (void *)0, curproc);
+#endif
+
#define vm_map_set_recursive(map) { \
simple_lock(&(map)->lock.lk_interlock); \
(map)->lock.lk_flags |= LK_CANRECURSE; \
@@ -222,6 +275,7 @@ typedef struct {
(map)->lock.lk_flags &= ~LK_CANRECURSE; \
simple_unlock(&(map)->lock.lk_interlock); \
}
+
/*
* Functions implemented as macros
*/
OpenPOWER on IntegriCloud