diff options
| author | John Dyson <dyson@FreeBSD.org> | 1997-08-18 02:06:35 +0000 |
|---|---|---|
| committer | John Dyson <dyson@FreeBSD.org> | 1997-08-18 02:06:35 +0000 |
| commit | 03e9c6c1015d0b098ef79533d0fc1ef3c33015a4 (patch) | |
| tree | c5d74c3c15d71c42dab5144e291775b072be50a3 /sys/vm | |
| parent | 86bf62dc4aa885a6a7c7b38ed335354c7614fd85 (diff) | |
Notes
Diffstat (limited to 'sys/vm')
| -rw-r--r-- | sys/vm/vm_map.c | 21 | ||||
| -rw-r--r-- | sys/vm/vm_map.h | 62 |
2 files changed, 66 insertions, 17 deletions
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c index 4019599faf801..640c2aaeddf9e 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 7b87856ad347d..aa8ddb249c1be 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 */ |
