On 17/12/20(Thu) 23:16, Mark Kettenis wrote: > > Date: Thu, 17 Dec 2020 18:56:52 -0300 > > From: Martin Pieuchot <[email protected]> > > > > On 16/12/20(Wed) 22:49, Greg Steuck wrote: > > > I just hit this while booting an i386-current in vmd. The source tree is > > > synced to "Remove the assertion in uvm_km_pgremove()." > > > > > > I enabled WITNESS on top of GENERIC. Naturally, GENERIC-Dec15 snap works. > > > > > > Anybody else see this so I know it's worth a bisect? > > > [...] > > > > I can reproduce it. Diff below fixes it. This is the beginning of a > > rabbit hole... thanks! > > > > > witness: lock_object uninitialized: 0xd0f3c828 > > > Starting stack trace... > > > witness_checkorder(0,d6bb011c,d1155e6c,d02e10e4,90) at > > > witness_checkorder+0x8a > > > witness_checkorder(d0f3c828,9,0) at witness_checkorder+0x8a > > > mtx_enter(d0f3c81c) at mtx_enter+0x27 > > > pmap_extract_pae(d8bb0d80,f5605000,d8bb0da0) at pmap_extract_pae+0x53 > > > pmap_pinit_pd_pae(d8bb0d80) at pmap_pinit_pd_pae+0x268 > > > pmap_create(1,1000,f6fe5e86,d8bbfd54,d0f5ba18) at pmap_create+0xa8 > > > uvmspace_fork(d0f5b5fc,d8bb3e34,d0f5b5fc,1,d1155f70) at uvmspace_fork+0x56 > > > process_new(d8bb3e34,d0f5b5fc,1) at process_new+0xeb > > > fork1(d0eb7b14,1,d04eb560,0,0,d1155f90) at fork1+0x1ba > > > panic: acquiring blockable sleep lock with spinlock or critical section > > > held (rwlock) kmmaplk > > > > pmap_kernel()'s mutexes aren't initialized. Diff below does that. > > Well, that is somewhat intentional. Those mutexes should never be > used for the kernel pmap. The kernel pmap is always there and is > updated atomically. > > So how did we end up trying to grab one of these mutexs?
pmap_map_ptes() (both version of them) grab the current's pmap `pm_apte_mtx' which ends up being the kernel one in this case. > > Index: arch/i386/i386/pmap.c > > =================================================================== > > RCS file: /cvs/src/sys/arch/i386/i386/pmap.c,v > > retrieving revision 1.209 > > diff -u -p -r1.209 pmap.c > > --- arch/i386/i386/pmap.c 24 Sep 2020 11:36:50 -0000 1.209 > > +++ arch/i386/i386/pmap.c 17 Dec 2020 21:47:11 -0000 > > @@ -961,6 +961,8 @@ pmap_bootstrap(vaddr_t kva_start) > > */ > > > > kpm = pmap_kernel(); > > + mtx_init(&kpm->pm_mtx, IPL_VM); > > + mtx_init(&kpm->pm_apte_mtx, IPL_VM); > > uvm_objinit(&kpm->pm_obj, NULL, 1); > > bzero(&kpm->pm_list, sizeof(kpm->pm_list)); /* pm_list not used */ > > kpm->pm_pdir = (vaddr_t)(proc0.p_addr->u_pcb.pcb_cr3 + KERNBASE); > > > >
