Page MenuHomeFreeBSD

D22163.id63797.diff
No OneTemporary

D22163.id63797.diff

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; \
+ } \
+} while (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;

File Metadata

Mime Type
text/plain
Expires
Mon, Apr 6, 3:59 AM (6 h, 32 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
30935611
Default Alt Text
D22163.id63797.diff (3 KB)

Event Timeline