svn commit: r355985 - head/sys/vm
Mark Johnston
markj at FreeBSD.org
Sat Dec 21 19:04:06 UTC 2019
Author: markj
Date: Sat Dec 21 19:04:05 2019
New Revision: 355985
URL: https://svnweb.freebsd.org/changeset/base/355985
Log:
Fix VPO_UNMANAGED handling in vm_page_reclaim_run() after r353540.
When allocating a replacement page we must clear VPO_UNMANAGED since we
only ever reclaim pages from managed objects. vm_page_replace() does
not handle this for us.
Sprinkle some assertions to help catch this sort of issue.
Reported by: pho
Reviewed by: alc, kib
Sponsored by: The FreeBSD Foundation
Differential Revision: https://reviews.freebsd.org/D22868
Modified:
head/sys/vm/vm_page.c
Modified: head/sys/vm/vm_page.c
==============================================================================
--- head/sys/vm/vm_page.c Sat Dec 21 18:50:25 2019 (r355984)
+++ head/sys/vm/vm_page.c Sat Dec 21 19:04:05 2019 (r355985)
@@ -1724,6 +1724,9 @@ vm_page_replace(vm_page_t mnew, vm_object_t object, vm
mnew->pindex = pindex;
atomic_set_int(&mnew->ref_count, VPRC_OBJREF);
mold = vm_radix_replace(&object->rtree, mnew);
+ KASSERT((mold->oflags & VPO_UNMANAGED) ==
+ (mnew->oflags & VPO_UNMANAGED),
+ ("vm_page_replace: mismatched VPO_UNMANAGED"));
/* Keep the resident page list in sorted order. */
TAILQ_INSERT_AFTER(&object->memq, mold, mnew, listq);
@@ -2684,8 +2687,7 @@ retry:
KASSERT(pmap_page_get_memattr(m) ==
VM_MEMATTR_DEFAULT,
("page %p has an unexpected memattr", m));
- KASSERT((m->oflags & (VPO_SWAPINPROG |
- VPO_SWAPSLEEP | VPO_UNMANAGED)) == 0,
+ KASSERT(m->oflags == 0,
("page %p has unexpected oflags", m));
/* Don't care: PGA_NOSYNC. */
if (!vm_page_none_valid(m)) {
@@ -2753,6 +2755,7 @@ retry:
~PGA_QUEUE_STATE_MASK;
KASSERT(m_new->oflags == VPO_UNMANAGED,
("page %p is managed", m_new));
+ m_new->oflags = 0;
pmap_copy_page(m, m_new);
m_new->valid = m->valid;
m_new->dirty = m->dirty;
@@ -3676,6 +3679,10 @@ vm_page_free_prep(vm_page_t m)
panic("vm_page_free_prep: freeing shared busy page %p", m);
if (m->object != NULL) {
+ KASSERT(((m->oflags & VPO_UNMANAGED) != 0) ==
+ ((m->object->flags & OBJ_UNMANAGED) != 0),
+ ("vm_page_free_prep: managed flag mismatch for page %p",
+ m));
vm_page_object_remove(m);
/*
More information about the svn-src-all
mailing list