Module Name:    src
Committed By:   riastradh
Date:           Wed Aug 14 01:26:25 UTC 2024

Modified Files:
        src/sys/uvm: uvm_map.c

Log Message:
uvm_map(9): Take vm map lock around uvm_unmap_remove.

This was tripping one of the assertions I added.  While it is safe
here not to hold the lock -- caller has exclusive access to the map
at this point -- it is better if we can annotate the functions in
question with executable notes about locking rules, and taking a
single uncontended lock in the vm map destruction path is probably a
tiny cost worth those executable notes.

PR kern/51254: uvm assertion "!topdown || hint <= orig_hint" failed


To generate a diff of this commit:
cvs rdiff -u -r1.420 -r1.421 src/sys/uvm/uvm_map.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/uvm/uvm_map.c
diff -u src/sys/uvm/uvm_map.c:1.420 src/sys/uvm/uvm_map.c:1.421
--- src/sys/uvm/uvm_map.c:1.420	Wed Aug 14 00:42:02 2024
+++ src/sys/uvm/uvm_map.c	Wed Aug 14 01:26:25 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_map.c,v 1.420 2024/08/14 00:42:02 riastradh Exp $	*/
+/*	$NetBSD: uvm_map.c,v 1.421 2024/08/14 01:26:25 riastradh Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_map.c,v 1.420 2024/08/14 00:42:02 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_map.c,v 1.421 2024/08/14 01:26:25 riastradh Exp $");
 
 #include "opt_ddb.h"
 #include "opt_pax.h"
@@ -1701,7 +1701,7 @@ uvm_map_lookup_entry(struct vm_map *map,
 	UVMHIST_CALLARGS(maphist,"(map=%#jx,addr=%#jx,ent=%#jx)",
 	    (uintptr_t)map, address, (uintptr_t)entry, 0);
 
-	KDASSERT(rw_lock_held(&map->lock));
+	KASSERT(rw_lock_held(&map->lock));
 
 	/*
 	 * make a quick check to see if we are already looking at
@@ -2330,6 +2330,8 @@ uvm_unmap_remove(struct vm_map *map, vad
 	    (uintptr_t)map, start, end, 0);
 	VM_MAP_RANGE_CHECK(map, start, end);
 
+	KASSERT(vm_map_locked_p(map));
+
 	uvm_map_check(map, "unmap_remove entry");
 
 	/*
@@ -4426,8 +4428,10 @@ uvmspace_free(struct vmspace *vm)
 		(*uvm_shmexit)(vm);
 
 	if (map->nentries) {
+		vm_map_lock(map);
 		uvm_unmap_remove(map, vm_map_min(map), vm_map_max(map),
 		    &dead_entries, flags);
+		vm_map_unlock(map);
 		if (dead_entries != NULL)
 			uvm_unmap_detach(dead_entries, 0);
 	}

Reply via email to