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-head mailing list