Index: sys/vm/vm_map.h =================================================================== --- sys/vm/vm_map.h +++ sys/vm/vm_map.h @@ -207,6 +207,9 @@ pmap_t pmap; /* (c) Physical map */ vm_offset_t anon_loc; int busy; +#ifdef DIAGNOSTIC + int nupdates; +#endif }; /* Index: sys/vm/vm_map.c =================================================================== --- sys/vm/vm_map.c +++ sys/vm/vm_map.c @@ -596,10 +596,50 @@ } } +#ifdef INVARIANTS +static void +_vm_map_assert_locked(vm_map_t map, const char *file, int line) +{ + + if (map->system_map) + mtx_assert_(&map->system_mtx, MA_OWNED, file, line); + else + sx_assert_(&map->lock, SA_XLOCKED, file, line); +} + +#define VM_MAP_ASSERT_LOCKED(map) \ + _vm_map_assert_locked(map, LOCK_FILE, LOCK_LINE) + +enum { VMMAP_CHECK_NONE, VMMAP_CHECK_UNLOCK, VMMAP_CHECK_ALL }; +#ifdef DIAGNOSTIC +static int enable_vmmap_check = VMMAP_CHECK_UNLOCK; +#else +static int enable_vmmap_check = VMMAP_CHECK_NONE; +#endif +SYSCTL_INT(_debug, OID_AUTO, vmmap_check, CTLFLAG_RWTUN, + &enable_vmmap_check, 0, "Enable vm map consistency checking"); + +static void _vm_map_assert_consistent(vm_map_t map, int check); + +#define VM_MAP_ASSERT_CONSISTENT(map) \ + _vm_map_assert_consistent(map, VMMAP_CHECK_ALL) +#define VM_MAP_UNLOCK_CONSISTENT(map) do { \ + if (map->updates > map->nentries) { \ + _vm_map_assert_consistent(map, VMMAP_CHECK_UNLOCK); \ + map->updates = 0; \ + } \ +} +#else +#define VM_MAP_ASSERT_LOCKED(map) +#define VM_MAP_ASSERT_CONSISTENT(map) +#define VM_MAP_UNLOCK_CONSISTENT(map) +#endif /* INVARIANTS */ + void _vm_map_unlock(vm_map_t map, const char *file, int line) { + VM_MAP_UNLOCK_CONSISTENT(map); if (map->system_map) mtx_unlock_flags_(&map->system_mtx, 0, file, line); else { @@ -697,8 +737,10 @@ if (map->system_map) { mtx_assert_(&map->system_mtx, MA_OWNED, file, line); - } else + } else { + VM_MAP_UNLOCK_CONSISTENT(map); sx_downgrade_(&map->lock, file, line); + } } /* @@ -717,37 +759,6 @@ return (sx_xlocked(&map->lock)); } -#ifdef INVARIANTS -static void -_vm_map_assert_locked(vm_map_t map, const char *file, int line) -{ - - if (map->system_map) - mtx_assert_(&map->system_mtx, MA_OWNED, file, line); - else - sx_assert_(&map->lock, SA_XLOCKED, file, line); -} - -#define VM_MAP_ASSERT_LOCKED(map) \ - _vm_map_assert_locked(map, LOCK_FILE, LOCK_LINE) - -#ifdef DIAGNOSTIC -static int enable_vmmap_check = 1; -#else -static int enable_vmmap_check = 0; -#endif -SYSCTL_INT(_debug, OID_AUTO, vmmap_check, CTLFLAG_RWTUN, - &enable_vmmap_check, 0, "Enable vm map consistency checking"); - -static void _vm_map_assert_consistent(vm_map_t map); - -#define VM_MAP_ASSERT_CONSISTENT(map) \ - _vm_map_assert_consistent(map) -#else -#define VM_MAP_ASSERT_LOCKED(map) -#define VM_MAP_ASSERT_CONSISTENT(map) -#endif /* INVARIANTS */ - /* * _vm_map_unlock_and_wait: * @@ -766,6 +777,7 @@ _vm_map_unlock_and_wait(vm_map_t map, int timo, const char *file, int line) { + VM_MAP_UNLOCK_CONSISTENT(map); mtx_lock(&map_sleep_mtx); if (map->system_map) mtx_unlock_flags_(&map->system_mtx, 0, file, line); @@ -1132,6 +1144,9 @@ } root->max_free = MAX(max_free_left, max_free_right); map->root = root; +#ifdef DIAGNOSTIC + ++map->nupdates; +#endif } /* @@ -1330,8 +1345,10 @@ * on a temporary upgrade. */ cur = vm_map_splay(map, address); - if (!locked) + if (!locked) { + VM_MAP_UNLOCK_CONSISTENT(map); sx_downgrade(&map->lock); + } /* * If "address" is contained within a map entry, the new root @@ -4786,12 +4803,12 @@ #ifdef INVARIANTS static void -_vm_map_assert_consistent(vm_map_t map) +_vm_map_assert_consistent(vm_map_t map, int check) { vm_map_entry_t entry, prev; vm_size_t max_left, max_right; - if (!enable_vmmap_check) + if (enable_vmmap_check != check) return; prev = &map->header;