Running with my uvm assert diff showed that uvm_fault_unwire_locked()
was called without any locks held.

This happened when I rebooted my machine:

        uvm_fault_unwire_locked()
        uvm_unmap_kill_entry_withlock()
        uvm_unmap_kill_entry()
        uvm_map_teardown()
        uvmspace_free()

This code does not corrupt anything because
uvm_unmap_kill_entry_withlock() is grabbing the kernel lock aorund its
uvm_fault_unwire_locked() call.

But regardless of the kernel lock dances in this code path, the uvm map
ought to be protected by its own lock.  uvm_fault_unwire() does that.

uvm_fault_unwire_locked()'s comment says the map must at least be read
locked, which is what all other code paths to that function do.

This makes my latest assert diff happy in the reboot case (it did not
always hit that assert).



Index: uvm_map.c
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_map.c,v
retrieving revision 1.282
diff -u -p -r1.282 uvm_map.c
--- uvm_map.c   21 Dec 2021 22:21:32 -0000      1.282
+++ uvm_map.c   31 Jan 2022 09:28:04 -0000
@@ -2132,7 +2143,7 @@ uvm_unmap_kill_entry_withlock(struct vm_
        if (VM_MAPENT_ISWIRED(entry)) {
                KERNEL_LOCK();
                entry->wired_count = 0;
-               uvm_fault_unwire_locked(map, entry->start, entry->end);
+               uvm_fault_unwire(map, entry->start, entry->end);
                KERNEL_UNLOCK();
        }
 

Reply via email to