> Date: Mon, 14 Jun 2021 11:50:24 +0200 > From: Martin Pieuchot <m...@openbsd.org> > > Now that operations on amaps are serialized using a per-map rwlock > the KERNEL_LOCK() shouldn't be necessary to call amap_unref(). The > diff below allows the reaper to do this operation before grabbing it. > > I haven't seen any relevant contention on the reaper in my profilings, > so I don't expect any visible change related to this change. However > this reflects the current state of locking in UVM and helps me shrink > my diff. > > ok?
This means we no longer call uvm_pause() for these, but I believe the main reason for calling uvm_pause() is to prevent us from holding the kernel lock for too long. So I think that's fine. ok kettenis@ > Index: uvm/uvm_map.c > =================================================================== > RCS file: /cvs/src/sys/uvm/uvm_map.c,v > retrieving revision 1.275 > diff -u -p -r1.275 uvm_map.c > --- uvm/uvm_map.c 22 May 2021 08:38:29 -0000 1.275 > +++ uvm/uvm_map.c 14 Jun 2021 09:32:04 -0000 > @@ -1571,10 +1571,16 @@ uvm_unmap_detach(struct uvm_map_deadq *d > > TAILQ_FOREACH_SAFE(entry, deadq, dfree.deadq, tmp) { > /* Skip entries for which we have to grab the kernel lock. */ > - if (entry->aref.ar_amap || UVM_ET_ISSUBMAP(entry) || > - UVM_ET_ISOBJ(entry)) > + if (UVM_ET_ISSUBMAP(entry) || UVM_ET_ISOBJ(entry)) > continue; > > + /* Drop reference to amap, if we've got one. */ > + if (entry->aref.ar_amap) > + amap_unref(entry->aref.ar_amap, > + entry->aref.ar_pageoff, > + atop(entry->end - entry->start), > + flags & AMAP_REFALL); > + > TAILQ_REMOVE(deadq, entry, dfree.deadq); > uvm_mapent_free(entry); > } > @@ -1586,12 +1592,6 @@ uvm_unmap_detach(struct uvm_map_deadq *d > while ((entry = TAILQ_FIRST(deadq)) != NULL) { > if (waitok) > uvm_pause(); > - /* Drop reference to amap, if we've got one. */ > - if (entry->aref.ar_amap) > - amap_unref(entry->aref.ar_amap, > - entry->aref.ar_pageoff, > - atop(entry->end - entry->start), > - flags & AMAP_REFALL); > > /* Drop reference to our backing object, if we've got one. */ > if (UVM_ET_ISSUBMAP(entry)) { > >