git: c5b19cef3609 - main - vm_map: wrap map->system_map checks into wrapper

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Mon, 09 Dec 2024 03:28:34 UTC
The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=c5b19cef3609211e692d6b21abcddef877c94af7

commit c5b19cef3609211e692d6b21abcddef877c94af7
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2024-12-06 23:51:08 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2024-12-09 03:27:44 +0000

    vm_map: wrap map->system_map checks into wrapper
    
    Reviewed by:    alc
    Sponsored by:   The FreeBSD Foundation
    Differential revision:  https://reviews.freebsd.org/D47934
---
 sys/vm/vm_fault.c   |  2 +-
 sys/vm/vm_map.c     | 49 ++++++++++++++++++++++++-------------------------
 sys/vm/vm_map.h     |  6 ++++++
 sys/vm/vm_pageout.c |  2 +-
 4 files changed, 32 insertions(+), 27 deletions(-)

diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c
index 6e0415b30600..8c7fe9e37af1 100644
--- a/sys/vm/vm_fault.c
+++ b/sys/vm/vm_fault.c
@@ -1355,7 +1355,7 @@ vm_fault_getpages(struct faultstate *fs, int *behindp, int *aheadp)
 	MPASS(status == FAULT_CONTINUE || status == FAULT_RESTART);
 	if (status == FAULT_RESTART)
 		return (status);
-	KASSERT(fs->vp == NULL || !fs->map->system_map,
+	KASSERT(fs->vp == NULL || !vm_map_is_system(fs->map),
 	    ("vm_fault: vnode-backed object mapped by system map"));
 
 	/*
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c
index c3aa499e0dc7..f7847a244586 100644
--- a/sys/vm/vm_map.c
+++ b/sys/vm/vm_map.c
@@ -523,7 +523,7 @@ void
 _vm_map_lock(vm_map_t map, const char *file, int line)
 {
 
-	if (map->system_map)
+	if (vm_map_is_system(map))
 		mtx_lock_flags_(&map->system_mtx, 0, file, line);
 	else
 		sx_xlock_(&map->lock, file, line);
@@ -614,7 +614,7 @@ static void
 _vm_map_assert_locked(vm_map_t map, const char *file, int line)
 {
 
-	if (map->system_map)
+	if (vm_map_is_system(map))
 		mtx_assert_(&map->system_mtx, MA_OWNED, file, line);
 	else
 		sx_assert_(&map->lock, SA_XLOCKED, file, line);
@@ -657,7 +657,7 @@ _vm_map_unlock(vm_map_t map, const char *file, int line)
 {
 
 	VM_MAP_UNLOCK_CONSISTENT(map);
-	if (map->system_map) {
+	if (vm_map_is_system(map)) {
 #ifndef UMA_USE_DMAP
 		if (map == kernel_map && (map->flags & MAP_REPLENISH) != 0) {
 			uma_prealloc(kmapentzone, 1);
@@ -675,7 +675,7 @@ void
 _vm_map_lock_read(vm_map_t map, const char *file, int line)
 {
 
-	if (map->system_map)
+	if (vm_map_is_system(map))
 		mtx_lock_flags_(&map->system_mtx, 0, file, line);
 	else
 		sx_slock_(&map->lock, file, line);
@@ -685,7 +685,7 @@ void
 _vm_map_unlock_read(vm_map_t map, const char *file, int line)
 {
 
-	if (map->system_map) {
+	if (vm_map_is_system(map)) {
 		KASSERT((map->flags & MAP_REPLENISH) == 0,
 		    ("%s: MAP_REPLENISH leaked", __func__));
 		mtx_unlock_flags_(&map->system_mtx, 0, file, line);
@@ -700,7 +700,7 @@ _vm_map_trylock(vm_map_t map, const char *file, int line)
 {
 	int error;
 
-	error = map->system_map ?
+	error = vm_map_is_system(map) ?
 	    !mtx_trylock_flags_(&map->system_mtx, 0, file, line) :
 	    !sx_try_xlock_(&map->lock, file, line);
 	if (error == 0)
@@ -713,7 +713,7 @@ _vm_map_trylock_read(vm_map_t map, const char *file, int line)
 {
 	int error;
 
-	error = map->system_map ?
+	error = vm_map_is_system(map) ?
 	    !mtx_trylock_flags_(&map->system_mtx, 0, file, line) :
 	    !sx_try_slock_(&map->lock, file, line);
 	return (error == 0);
@@ -734,7 +734,7 @@ _vm_map_lock_upgrade(vm_map_t map, const char *file, int line)
 {
 	unsigned int last_timestamp;
 
-	if (map->system_map) {
+	if (vm_map_is_system(map)) {
 		mtx_assert_(&map->system_mtx, MA_OWNED, file, line);
 	} else {
 		if (!sx_try_upgrade_(&map->lock, file, line)) {
@@ -760,7 +760,7 @@ void
 _vm_map_lock_downgrade(vm_map_t map, const char *file, int line)
 {
 
-	if (map->system_map) {
+	if (vm_map_is_system(map)) {
 		KASSERT((map->flags & MAP_REPLENISH) == 0,
 		    ("%s: MAP_REPLENISH leaked", __func__));
 		mtx_assert_(&map->system_mtx, MA_OWNED, file, line);
@@ -780,10 +780,9 @@ int
 vm_map_locked(vm_map_t map)
 {
 
-	if (map->system_map)
+	if (vm_map_is_system(map))
 		return (mtx_owned(&map->system_mtx));
-	else
-		return (sx_xlocked(&map->lock));
+	return (sx_xlocked(&map->lock));
 }
 
 /*
@@ -806,7 +805,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) {
+	if (vm_map_is_system(map)) {
 		KASSERT((map->flags & MAP_REPLENISH) == 0,
 		    ("%s: MAP_REPLENISH leaked", __func__));
 		mtx_unlock_flags_(&map->system_mtx, 0, file, line);
@@ -864,7 +863,7 @@ vm_map_wait_busy(vm_map_t map)
 	VM_MAP_ASSERT_LOCKED(map);
 	while (map->busy) {
 		vm_map_modflags(map, MAP_BUSY_WAKEUP, 0);
-		if (map->system_map)
+		if (vm_map_is_system(map))
 			msleep(&map->busy, &map->system_mtx, 0, "mbusy", 0);
 		else
 			sx_sleep(&map->busy, &map->lock, 0, "mbusy", 0);
@@ -927,7 +926,7 @@ vm_map_init_system(vm_map_t map, pmap_t pmap, vm_offset_t min, vm_offset_t max)
 static void
 vm_map_entry_dispose(vm_map_t map, vm_map_entry_t entry)
 {
-	uma_zfree(map->system_map ? kmapentzone : mapentzone, entry);
+	uma_zfree(vm_map_is_system(map) ? kmapentzone : mapentzone, entry);
 }
 
 /*
@@ -961,7 +960,7 @@ vm_map_entry_create(vm_map_t map)
 		}
 	} else
 #endif
-	if (map->system_map) {
+	if (vm_map_is_system(map)) {
 		new_entry = uma_zalloc(kmapentzone, M_NOWAIT);
 	} else {
 		new_entry = uma_zalloc(mapentzone, M_WAITOK);
@@ -2428,7 +2427,7 @@ vm_map_entry_charge_object(vm_map_t map, vm_map_entry_t entry)
 	VM_MAP_ASSERT_LOCKED(map);
 	KASSERT((entry->eflags & MAP_ENTRY_IS_SUB_MAP) == 0,
 	    ("map entry %p is a submap", entry));
-	if (entry->object.vm_object == NULL && !map->system_map &&
+	if (entry->object.vm_object == NULL && !vm_map_is_system(map) &&
 	    (entry->eflags & MAP_ENTRY_GUARD) == 0)
 		vm_map_entry_back(entry);
 	else if (entry->object.vm_object != NULL &&
@@ -2493,7 +2492,7 @@ vm_map_clip_start(vm_map_t map, vm_map_entry_t entry, vm_offset_t startaddr)
 	vm_map_entry_t new_entry;
 	int bdry_idx;
 
-	if (!map->system_map)
+	if (!vm_map_is_system(map))
 		WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL,
 		    "%s: map %p entry %p start 0x%jx", __func__, map, entry,
 		    (uintmax_t)startaddr);
@@ -2536,7 +2535,7 @@ vm_map_lookup_clip_start(vm_map_t map, vm_offset_t start,
 	vm_map_entry_t entry;
 	int rv;
 
-	if (!map->system_map)
+	if (!vm_map_is_system(map))
 		WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL,
 		    "%s: map %p start 0x%jx prev %p", __func__, map,
 		    (uintmax_t)start, prev_entry);
@@ -2566,7 +2565,7 @@ vm_map_clip_end(vm_map_t map, vm_map_entry_t entry, vm_offset_t endaddr)
 	vm_map_entry_t new_entry;
 	int bdry_idx;
 
-	if (!map->system_map)
+	if (!vm_map_is_system(map))
 		WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL,
 		    "%s: map %p entry %p end 0x%jx", __func__, map, entry,
 		    (uintmax_t)endaddr);
@@ -3936,7 +3935,7 @@ vm_map_entry_delete(vm_map_t map, vm_map_entry_t entry)
 		MPASS(entry->cred == NULL);
 		MPASS((entry->eflags & MAP_ENTRY_IS_SUB_MAP) == 0);
 		MPASS(object == NULL);
-		vm_map_entry_deallocate(entry, map->system_map);
+		vm_map_entry_deallocate(entry, vm_map_is_system(map));
 		return;
 	}
 
@@ -3987,7 +3986,7 @@ vm_map_entry_delete(vm_map_t map, vm_map_entry_t entry)
 		}
 		VM_OBJECT_WUNLOCK(object);
 	}
-	if (map->system_map)
+	if (vm_map_is_system(map))
 		vm_map_entry_deallocate(entry, TRUE);
 	else {
 		entry->defer_next = curthread->td_map_def_user;
@@ -4710,7 +4709,7 @@ vm_map_growstack(vm_map_t map, vm_offset_t addr, vm_map_entry_t gap_entry)
 	    p->p_textvp == NULL))
 		return (KERN_FAILURE);
 
-	MPASS(!map->system_map);
+	MPASS(!vm_map_is_system(map));
 
 	lmemlim = lim_cur(curthread, RLIMIT_MEMLOCK);
 	stacklim = lim_cur(curthread, RLIMIT_STACK);
@@ -5118,7 +5117,7 @@ RetryLookupLocked:
 	/*
 	 * Create an object if necessary.
 	 */
-	if (entry->object.vm_object == NULL && !map->system_map) {
+	if (entry->object.vm_object == NULL && !vm_map_is_system(map)) {
 		if (vm_map_lock_upgrade(map))
 			goto RetryLookup;
 		entry->object.vm_object = vm_object_allocate_anon(atop(size),
@@ -5206,7 +5205,7 @@ vm_map_lookup_locked(vm_map_t *var_map,		/* IN/OUT */
 	/*
 	 * Fail if an object should be created.
 	 */
-	if (entry->object.vm_object == NULL && !map->system_map)
+	if (entry->object.vm_object == NULL && !vm_map_is_system(map))
 		return (KERN_FAILURE);
 
 	/*
diff --git a/sys/vm/vm_map.h b/sys/vm/vm_map.h
index 5ecec0531e1c..ed1106734951 100644
--- a/sys/vm/vm_map.h
+++ b/sys/vm/vm_map.h
@@ -278,6 +278,12 @@ vm_map_range_valid(vm_map_t map, vm_offset_t start, vm_offset_t end)
 	return (true);
 }
 
+static inline bool
+vm_map_is_system(vm_map_t map)
+{
+	return ((map->system_map));
+}
+
 #endif	/* KLD_MODULE */
 #endif	/* _KERNEL */
 
diff --git a/sys/vm/vm_pageout.c b/sys/vm/vm_pageout.c
index f6c5e6291692..28a54a83fd49 100644
--- a/sys/vm/vm_pageout.c
+++ b/sys/vm/vm_pageout.c
@@ -1844,7 +1844,7 @@ vm_pageout_oom_pagecount(struct vmspace *vmspace)
 	long res;
 
 	map = &vmspace->vm_map;
-	KASSERT(!map->system_map, ("system map"));
+	KASSERT(!vm_map_is_system(map), ("system map"));
 	sx_assert(&map->lock, SA_LOCKED);
 	res = 0;
 	VM_MAP_ENTRY_FOREACH(entry, map) {