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.
> 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 */
>