> Date: Tue, 17 Dec 2019 09:11:28 -0800 > From: [email protected] > > On Tue, 17 Dec 2019, Mark Kettenis wrote: > ... > > > However, thos "vmmaplk" instances really are different classes. In > > > the sys_mlock codepath it is a lock for a userland vmmap whereas the > > > other codepath is dealing with a kernel vmmap. So there isn't > > > actually a lock order reversal. > > > > > > Maybe it'd help if we used a separate rw_init() call for the lock of > > > the kernel map? > > > > Something like this: > > I like the direction. My one hesitation is that I seem to recall there > being some handwaving about whether the vmmap's used by vmm are in > vmspaces or not. Has this been tested with vmm's?
They're allocated using uvmspace_alloc() and therefore end up with the VM_MAP_ISVMSPACE flag set. I didn't test this with vmm. > > Index: uvm/uvm_map.c > > =================================================================== > > RCS file: /cvs/src/sys/uvm/uvm_map.c,v > > retrieving revision 1.259 > > diff -u -p -r1.259 uvm_map.c > > --- uvm/uvm_map.c 12 Dec 2019 11:12:36 -0000 1.259 > > +++ uvm/uvm_map.c 17 Dec 2019 16:58:31 -0000 > > @@ -2654,7 +2654,10 @@ uvm_map_setup(struct vm_map *map, vaddr_ > > map->s_start = map->s_end = 0; /* Empty stack area by default. */ > > map->flags = flags; > > map->timestamp = 0; > > - rw_init_flags(&map->lock, "vmmaplk", RWL_DUPOK); > > + if (flags & VM_MAP_ISVMSPACE) > > + rw_init_flags(&map->lock, "vmmaplk", RWL_DUPOK); > > + else > > + rw_init(&map->lock, "kmmaplk"); > > mtx_init(&map->mtx, IPL_VM); > > mtx_init(&map->flags_lock, IPL_VM); > > > > > > > >
