> Date: Fri, 1 Sep 2023 23:02:59 +0200
> From: Martin Pieuchot <m...@openbsd.org>
> 
> On 12/08/23(Sat) 10:43, Martin Pieuchot wrote:
> > Since UVM has been imported, we zap mappings associated to anon pages
> > before deactivating or freeing them.  Sadly, with the introduction of
> > locking for amaps & anons, I added new code paths that do not respect
> > this behavior.
> > The diff below restores it by moving the call to pmap_page_protect()
> > inside uvm_anon_release().  With it the 3 code paths using the function
> > are now coherent with the rest of UVM.
> > 
> > I remember a discussion we had questioning the need for zapping such
> > mappings.  I'm interested in hearing more arguments for or against this
> > change. However, right now, I'm more concerned about coherency, so I'd
> > like to commit the change below before we try something different.
> 
> Unless there's an objection, I'll commit this tomorrow in order to
> unblock my upcoming UVM changes.

I was planning to take a closer look at this, but the change should be
fine in terms of correctness.

> > Index: uvm/uvm_anon.c
> > ===================================================================
> > RCS file: /cvs/src/sys/uvm/uvm_anon.c,v
> > retrieving revision 1.55
> > diff -u -p -u -7 -r1.55 uvm_anon.c
> > --- uvm/uvm_anon.c  11 Apr 2023 00:45:09 -0000      1.55
> > +++ uvm/uvm_anon.c  15 May 2023 13:55:28 -0000
> > @@ -251,14 +251,15 @@ uvm_anon_release(struct vm_anon *anon)
> >     KASSERT((pg->pg_flags & PG_RELEASED) != 0);
> >     KASSERT((pg->pg_flags & PG_BUSY) != 0);
> >     KASSERT(pg->uobject == NULL);
> >     KASSERT(pg->uanon == anon);
> >     KASSERT(anon->an_ref == 0);
> >  
> >     uvm_lock_pageq();
> > +   pmap_page_protect(pg, PROT_NONE);
> >     uvm_pagefree(pg);
> >     uvm_unlock_pageq();
> >     KASSERT(anon->an_page == NULL);
> >     lock = anon->an_lock;
> >     uvm_anfree(anon);
> >     rw_exit(lock);
> >     /* Note: extra reference is held for PG_RELEASED case. */
> > Index: uvm/uvm_fault.c
> > ===================================================================
> > RCS file: /cvs/src/sys/uvm/uvm_fault.c,v
> > retrieving revision 1.133
> > diff -u -p -u -7 -r1.133 uvm_fault.c
> > --- uvm/uvm_fault.c 4 Nov 2022 09:36:44 -0000       1.133
> > +++ uvm/uvm_fault.c 15 May 2023 13:55:28 -0000
> > @@ -392,15 +392,14 @@ uvmfault_anonget(struct uvm_faultinfo *u
> >  
> >                     /*
> >                      * if we were RELEASED during I/O, then our anon is
> >                      * no longer part of an amap.   we need to free the
> >                      * anon and try again.
> >                      */
> >                     if (pg->pg_flags & PG_RELEASED) {
> > -                           pmap_page_protect(pg, PROT_NONE);
> >                             KASSERT(anon->an_ref == 0);
> >                             /*
> >                              * Released while we had unlocked amap.
> >                              */
> >                             if (locked)
> >                                     uvmfault_unlockall(ufi, NULL, NULL);
> >                             uvm_anon_release(anon); /* frees page for us */
> > 
> 
> 

Reply via email to