commit a6dde246c6ce7883360973b2fdcc5006cc089de7 from: mpi date: Fri May 16 13:54:33 2025 UTC Kill UVM_LK_ENTER/EXIT. Remove `lockflags' argument from uvm_map_pageable() and add locking assertions in uvm_map_pageable_wire() and uvm_map_pageable(). ok dv@ commit - f07d448977e29aafd42d798057e30d071e3576bd commit + a6dde246c6ce7883360973b2fdcc5006cc089de7 blob - c66764b58dec5a0c6334c21156c26685b5ea9c3b blob + 18e282105889b1bb8c3ebd7cbc6c3aa314b695df --- sys/dev/ic/psp.c +++ sys/dev/ic/psp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: psp.c,v 1.16 2025/04/25 19:10:50 bluhm Exp $ */ +/* $OpenBSD: psp.c,v 1.17 2025/05/16 13:54:33 mpi Exp $ */ /* * Copyright (c) 2023, 2024 Hans-Joerg Hoexer @@ -504,7 +504,9 @@ psp_launch_update_data(struct psp_softc *sc, end = start + size; /* Wire mapping. */ - error = uvm_map_pageable(&p->p_vmspace->vm_map, start, end, FALSE, 0); + vm_map_lock(&p->p_vmspace->vm_map); + error = uvm_map_pageable(&p->p_vmspace->vm_map, start, end, FALSE); + vm_map_unlock(&p->p_vmspace->vm_map); if (error) goto out; @@ -533,7 +535,9 @@ out: * Unwire again. Ignore new error. Error has either been set, * or PSP command has already succeeded. */ - (void) uvm_map_pageable(&p->p_vmspace->vm_map, start, end, TRUE, 0); + vm_map_lock(&p->p_vmspace->vm_map); + (void) uvm_map_pageable(&p->p_vmspace->vm_map, start, end, TRUE); + vm_map_unlock(&p->p_vmspace->vm_map); return (error); } blob - efe4281b26c4059a65e110507744736b503abcda blob + 6b3a588c1f921ca4d9c34af606a0752cdbc394ec --- sys/uvm/uvm_extern.h +++ sys/uvm/uvm_extern.h @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_extern.h,v 1.180 2024/11/19 06:18:26 jsg Exp $ */ +/* $OpenBSD: uvm_extern.h,v 1.181 2025/05/16 13:54:34 mpi Exp $ */ /* $NetBSD: uvm_extern.h,v 1.57 2001/03/09 01:02:12 chs Exp $ */ /* @@ -153,12 +153,6 @@ typedef int vm_prot_t; #define UVM_PLA_USERESERVE 0x0040 /* can allocate from kernel reserve */ /* - * lockflags that control the locking behavior of various functions. - */ -#define UVM_LK_ENTER 0x00000001 /* map locked on entry */ -#define UVM_LK_EXIT 0x00000002 /* leave map locked on exit */ - -/* * flags to uvm_page_physload. */ #define PHYSLOAD_DEVICE 0x01 /* don't add to the page queue */ @@ -388,7 +382,7 @@ int uvm_map(vm_map_t, vaddr_t *, vsize_t, struct uvm_object *, voff_t, vsize_t, unsigned int); int uvm_mapanon(vm_map_t, vaddr_t *, vsize_t, vsize_t, unsigned int); int uvm_map_pageable(vm_map_t, vaddr_t, - vaddr_t, boolean_t, int); + vaddr_t, boolean_t); int uvm_map_pageable_all(vm_map_t, int, vsize_t); boolean_t uvm_map_checkprot(vm_map_t, vaddr_t, vaddr_t, vm_prot_t); blob - 79e482de8aadebe31783e09fd12bd8d7ef6c64f6 blob + fb323c94e0fe41e6df01331d37376e50232b0363 --- sys/uvm/uvm_glue.c +++ sys/uvm/uvm_glue.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_glue.c,v 1.88 2025/03/21 13:19:33 mpi Exp $ */ +/* $OpenBSD: uvm_glue.c,v 1.89 2025/05/16 13:54:34 mpi Exp $ */ /* $NetBSD: uvm_glue.c,v 1.44 2001/02/06 19:54:44 eeh Exp $ */ /* @@ -108,13 +108,17 @@ uvm_vslock(struct proc *p, caddr_t addr, size_t len, v { struct vm_map *map = &p->p_vmspace->vm_map; vaddr_t start, end; + int error; start = trunc_page((vaddr_t)addr); end = round_page((vaddr_t)addr + len); if (end <= start) return (EINVAL); - return uvm_map_pageable(map, start, end, FALSE, 0); + vm_map_lock(map); + error = uvm_map_pageable(map, start, end, FALSE); + vm_map_unlock(map); + return error; } /* @@ -132,7 +136,9 @@ uvm_vsunlock(struct proc *p, caddr_t addr, size_t len) end = round_page((vaddr_t)addr + len); KASSERT(end > start); - uvm_map_pageable(map, start, end, TRUE, 0); + vm_map_lock(map); + uvm_map_pageable(map, start, end, TRUE); + vm_map_unlock(map); } /* blob - 6f2bf9f97b1c509cfd805c2734e41275fe8d6f17 blob + 61336199d82b7a223363fd83dbe04786eeaa93e2 --- sys/uvm/uvm_map.c +++ sys/uvm/uvm_map.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_map.c,v 1.341 2025/04/21 14:46:18 dv Exp $ */ +/* $OpenBSD: uvm_map.c,v 1.342 2025/05/16 13:54:34 mpi Exp $ */ /* $NetBSD: uvm_map.c,v 1.86 2000/11/27 08:40:03 chs Exp $ */ /* @@ -135,7 +135,7 @@ void uvm_map_pageable_pgon(struct vm_map*, vaddr_t, vaddr_t); int uvm_map_pageable_wire(struct vm_map*, struct vm_map_entry*, struct vm_map_entry*, - vaddr_t, vaddr_t, int); + vaddr_t, vaddr_t); void uvm_map_setup_entries(struct vm_map*); void uvm_map_setup_md(struct vm_map*); void uvm_map_teardown(struct vm_map*); @@ -2057,14 +2057,10 @@ uvm_map_pageable_pgon(struct vm_map *map, struct vm_ma /* * Mark all entries from first until end (exclusive) as wired. - * - * Lockflags determines the lock state on return from this function. - * Lock must be exclusive on entry. */ int uvm_map_pageable_wire(struct vm_map *map, struct vm_map_entry *first, - struct vm_map_entry *end, vaddr_t start_addr, vaddr_t end_addr, - int lockflags) + struct vm_map_entry *end, vaddr_t start_addr, vaddr_t end_addr) { struct vm_map_entry *iter; #ifdef DIAGNOSTIC @@ -2072,6 +2068,8 @@ uvm_map_pageable_wire(struct vm_map *map, struct vm_ma #endif int error; + vm_map_assert_wrlock(map); + /* * Wire pages in two passes: * @@ -2129,12 +2127,12 @@ uvm_map_pageable_wire(struct vm_map *map, struct vm_ma vm_map_lock(map); vm_map_unbusy(map); - if (error) { #ifdef DIAGNOSTIC - if (timestamp_save != map->timestamp) - panic("uvm_map_pageable_wire: stale map"); + if (timestamp_save != map->timestamp) + panic("stale map"); #endif + if (error) { /* * first is no longer needed to restart loops. * Use it as iterator to unmap successful mappings. @@ -2162,37 +2160,20 @@ uvm_map_pageable_wire(struct vm_map *map, struct vm_ma iter->wired_count--; } - - if ((lockflags & UVM_LK_EXIT) == 0) - vm_map_unlock(map); - return error; } - - if ((lockflags & UVM_LK_EXIT) == 0) { - vm_map_unlock(map); - } else { -#ifdef DIAGNOSTIC - if (timestamp_save != map->timestamp) - panic("uvm_map_pageable_wire: stale map"); -#endif - } - return 0; + return error; } /* * uvm_map_pageable: set pageability of a range in a map. * - * Flags: - * UVM_LK_ENTER: map is already locked by caller - * UVM_LK_EXIT: don't unlock map on exit - * * The full range must be in use (entries may not have fspace != 0). * UVM_ET_HOLE counts as unmapped. */ int uvm_map_pageable(struct vm_map *map, vaddr_t start, vaddr_t end, - boolean_t new_pageable, int lockflags) + boolean_t new_pageable) { struct vm_map_entry *first, *last, *tmp; int error; @@ -2210,8 +2191,7 @@ uvm_map_pageable(struct vm_map *map, vaddr_t start, va return EINVAL; /* why? see second XXX below */ KASSERT(map->flags & VM_MAP_PAGEABLE); - if ((lockflags & UVM_LK_ENTER) == 0) - vm_map_lock(map); + vm_map_assert_wrlock(map); /* * Find first entry. @@ -2282,8 +2262,6 @@ uvm_map_pageable(struct vm_map *map, vaddr_t start, va error = 0; out: - if ((lockflags & UVM_LK_EXIT) == 0) - vm_map_unlock(map); return error; } else { /* @@ -2303,8 +2281,7 @@ out: } else tmp = last; - return uvm_map_pageable_wire(map, first, tmp, start, end, - lockflags); + return uvm_map_pageable_wire(map, first, tmp, start, end); } } @@ -2370,7 +2347,7 @@ uvm_map_pageable_all(struct vm_map *map, int flags, vs * uvm_map_pageable_wire will release lock */ return uvm_map_pageable_wire(map, RBT_MIN(uvm_map_addr, &map->addr), - NULL, map->min_offset, map->max_offset, 0); + NULL, map->min_offset, map->max_offset); } /* @@ -3196,7 +3173,7 @@ uvm_map_protect(struct vm_map *map, vaddr_t start, vad old_prot == PROT_NONE && new_prot != PROT_NONE) { if (uvm_map_pageable(map, iter->start, iter->end, - FALSE, UVM_LK_ENTER | UVM_LK_EXIT) != 0) { + FALSE) != 0) { /* * If locking the entry fails, remember the * error if it's the first one. Note we blob - 22982f032dddb643dc9def4cd5a4baf20cd83b4f blob + 252f53f9295a6ed05c8d156e743a404d70ee0cdb --- sys/uvm/uvm_mmap.c +++ sys/uvm/uvm_mmap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_mmap.c,v 1.198 2025/04/06 20:20:11 kettenis Exp $ */ +/* $OpenBSD: uvm_mmap.c,v 1.199 2025/05/16 13:54:34 mpi Exp $ */ /* $NetBSD: uvm_mmap.c,v 1.49 2001/02/18 21:19:08 chs Exp $ */ /* @@ -821,6 +821,7 @@ sys_mlock(struct proc *p, void *v, register_t *retval) syscallarg(const void *) addr; syscallarg(size_t) len; } */ *uap = v; + vm_map_t map = &p->p_vmspace->vm_map; vaddr_t addr; vsize_t size, pageoff; int error; @@ -838,7 +839,7 @@ sys_mlock(struct proc *p, void *v, register_t *retval) return EAGAIN; #ifdef pmap_wired_count - if (size + ptoa(pmap_wired_count(vm_map_pmap(&p->p_vmspace->vm_map))) > + if (size + ptoa(pmap_wired_count(vm_map_pmap(map))) > lim_cur(RLIMIT_MEMLOCK)) return EAGAIN; #else @@ -846,8 +847,9 @@ sys_mlock(struct proc *p, void *v, register_t *retval) return error; #endif - error = uvm_map_pageable(&p->p_vmspace->vm_map, addr, addr+size, FALSE, - 0); + vm_map_lock(map); + error = uvm_map_pageable(map, addr, addr+size, FALSE); + vm_map_unlock(map); return error == 0 ? 0 : ENOMEM; } @@ -862,6 +864,7 @@ sys_munlock(struct proc *p, void *v, register_t *retva syscallarg(const void *) addr; syscallarg(size_t) len; } */ *uap = v; + vm_map_t map = &p->p_vmspace->vm_map; vaddr_t addr; vsize_t size, pageoff; int error; @@ -880,8 +883,9 @@ sys_munlock(struct proc *p, void *v, register_t *retva return error; #endif - error = uvm_map_pageable(&p->p_vmspace->vm_map, addr, addr+size, TRUE, - 0); + vm_map_lock(map); + error = uvm_map_pageable(map, addr, addr+size, TRUE); + vm_map_unlock(map); return error == 0 ? 0 : ENOMEM; } @@ -962,12 +966,9 @@ uvm_mmaplock(vm_map_t map, vaddr_t *addr, vsize_t size KERNEL_UNLOCK(); return error; } - /* - * uvm_map_pageable() always returns the map - * unlocked. - */ - error = uvm_map_pageable(map, *addr, *addr + size, - FALSE, UVM_LK_ENTER); + + error = uvm_map_pageable(map, *addr, *addr + size, FALSE); + vm_map_unlock(map); if (error != 0) { /* unmap the region! */ uvm_unmap(map, *addr, *addr + size);