Get rid of the extra vnode reference known as UVM_VNODE_CANPERSIST.
authormpi <mpi@openbsd.org>
Sat, 10 Sep 2022 16:14:36 +0000 (16:14 +0000)
committermpi <mpi@openbsd.org>
Sat, 10 Sep 2022 16:14:36 +0000 (16:14 +0000)
commit7b534ec03bcaf50e5c3cd78669993dec92d37659
tree30c88afcae2e855c4fcdaa5fc5e2e7d73f2dea71
parent7ec9e62fd49061fc65704ce8d161855f18c50a3a
Get rid of the extra vnode reference known as UVM_VNODE_CANPERSIST.

Back in the 4.4BSD days the VM subystem had a OBJ_CANPERSIST flag to
enter objects in a global cached list.  Some of this logic seem to have
been copied to UVM but without the global list.

Unfortunately keeping UVM vnode objects alive after munmap(2)ing the
corresponding region without incrementing the reference count of the
related vnode led to many bugs when the vnode was recycled and/or when
it data where written back to disk (via the page daemon).

The problem is that VM pages might have a non-accounted reference to a
vnode via `pg->uobject'.

Fix "vref used where vget required" panic reported by bluhm@, gkoehler@
and Andrew Krasavinseen on bugs@.

Thanks a lot to semarie@ for co-debugging this issue!

Tested by bluhm@, tb@, miod@.

ok kettenis@, semarie@
sys/uvm/uvm_vnode.c
sys/uvm/uvm_vnode.h