Date: Sat, 21 Dec 2019 19:04:06 +0000 (UTC) From: Mark Johnston <markj@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r355985 - head/sys/vm Message-ID: <201912211904.xBLJ46l0067199@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
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); /*
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201912211904.xBLJ46l0067199>