summaryrefslogtreecommitdiffstats
path: root/sys/vm
diff options
context:
space:
mode:
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/vm_map.c21
-rw-r--r--sys/vm/vm_map.h62
2 files changed, 66 insertions, 17 deletions
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c
index 4019599..640c2aa 100644
--- a/sys/vm/vm_map.c
+++ b/sys/vm/vm_map.c
@@ -61,7 +61,7 @@
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*
- * $Id: vm_map.c,v 1.84 1997/08/05 23:03:23 dyson Exp $
+ * $Id: vm_map.c,v 1.85 1997/08/06 04:58:03 dyson Exp $
*/
/*
@@ -1378,7 +1378,7 @@ vm_map_user_pageable(map, start, end, new_pageable)
/* First we need to allow map modifications */
vm_map_set_recursive(map);
- lockmgr(&map->lock, LK_DOWNGRADE,(void *)0, curproc);
+ vm_map_lock_downgrade(map);
rv = vm_fault_user_wire(map, entry->start, entry->end);
if (rv) {
@@ -1394,7 +1394,7 @@ vm_map_user_pageable(map, start, end, new_pageable)
}
vm_map_clear_recursive(map);
- lockmgr(&map->lock, LK_UPGRADE, (void *)0, curproc);
+ vm_map_lock_upgrade(map);
goto rescan;
}
@@ -1594,7 +1594,7 @@ vm_map_pageable(map, start, end, new_pageable)
vm_map_unlock(map); /* trust me ... */
} else {
vm_map_set_recursive(map);
- lockmgr(&map->lock, LK_DOWNGRADE, (void*)0, curproc);
+ vm_map_lock_downgrade(map);
}
rv = 0;
@@ -2374,9 +2374,7 @@ RetryLookup:;
* object.
*/
- if (lockmgr(&share_map->lock, LK_EXCLUPGRADE,
- (void *)0, curproc)) {
-
+ if (vm_map_lock_upgrade(share_map)) {
if (share_map != map)
vm_map_unlock_read(map);
@@ -2388,9 +2386,7 @@ RetryLookup:;
OFF_TO_IDX(entry->end - entry->start));
entry->eflags &= ~MAP_ENTRY_NEEDS_COPY;
-
- lockmgr(&share_map->lock, LK_DOWNGRADE,
- (void *)0, curproc);
+ vm_map_lock_downgrade(share_map);
} else {
/*
* We're attempting to read a copy-on-write page --
@@ -2405,8 +2401,7 @@ RetryLookup:;
*/
if (entry->object.vm_object == NULL) {
- if (lockmgr(&share_map->lock, LK_EXCLUPGRADE,
- (void *)0, curproc)) {
+ if (vm_map_lock_upgrade(share_map)) {
if (share_map != map)
vm_map_unlock_read(map);
goto RetryLookup;
@@ -2414,7 +2409,7 @@ RetryLookup:;
entry->object.vm_object = vm_object_allocate(OBJT_DEFAULT,
OFF_TO_IDX(entry->end - entry->start));
entry->offset = 0;
- lockmgr(&share_map->lock, LK_DOWNGRADE, (void *)0, curproc);
+ vm_map_lock_downgrade(share_map);
}
if (entry->object.vm_object != NULL)
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