uvm_mapanon() is called in two occasions: mmap(2) and sigaltstack(2).
Both code paths are obviously in process context an can sleep.  That
explains why none of them set the UVM_FLAG_TRYLOCK when calling such
function.

The diff below removes support for this flag.  This introduces a
difference with uvm_map(9) but simplifies the overall code.  Removing
support for an unneeded "try" variant also means the lock can be grabbed
earlier.  This is a requirement to not lose atomicity between
uvm_mapanon() and uvm_map_pageable() in mmap(2).

ok?

Index: uvm/uvm_map.c
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_map.c,v
retrieving revision 1.250
diff -u -p -r1.250 uvm_map.c
--- uvm/uvm_map.c       2 Nov 2019 16:41:57 -0000       1.250
+++ uvm/uvm_map.c       8 Nov 2019 16:43:30 -0000
@@ -951,9 +951,9 @@ uvm_mapanon(struct vm_map *map, vaddr_t 
        KASSERT((map->flags & VM_MAP_ISVMSPACE) == VM_MAP_ISVMSPACE);
        KASSERT(map != kernel_map);
        KASSERT((map->flags & UVM_FLAG_HOLE) == 0);
-
        KASSERT((map->flags & VM_MAP_INTRSAFE) == 0);
        splassert(IPL_NONE);
+       KASSERT((flags & UVM_FLAG_TRYLOCK) == 0);
 
        /*
         * We use pmap_align and pmap_offset as alignment and offset variables.
@@ -989,14 +989,7 @@ uvm_mapanon(struct vm_map *map, vaddr_t 
        if (new == NULL)
                return(ENOMEM);
 
-       if (flags & UVM_FLAG_TRYLOCK) {
-               if (vm_map_lock_try(map) == FALSE) {
-                       error = EFAULT;
-                       goto out;
-               }
-       } else
-               vm_map_lock(map);
-
+       vm_map_lock(map);
        first = last = NULL;
        if (flags & UVM_FLAG_FIXED) {
                /*
@@ -1114,7 +1107,7 @@ unlock:
         * destroy free-space entries.
         */
        uvm_unmap_detach(&dead, 0);
-out:
+
        if (new)
                uvm_mapent_free(new);
        return error;

Reply via email to