Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 30 Jan 2018 21:34:34 +0000 (UTC)
From:      Jeff Roberson <jeff@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r328607 - user/jeff/numa/sys/vm
Message-ID:  <201801302134.w0ULYYT5024550@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jeff
Date: Tue Jan 30 21:34:34 2018
New Revision: 328607
URL: https://svnweb.freebsd.org/changeset/base/328607

Log:
  Fix some bugs and review feedback.

Modified:
  user/jeff/numa/sys/vm/vm_page.c
  user/jeff/numa/sys/vm/vm_reserv.c

Modified: user/jeff/numa/sys/vm/vm_page.c
==============================================================================
--- user/jeff/numa/sys/vm/vm_page.c	Tue Jan 30 21:26:31 2018	(r328606)
+++ user/jeff/numa/sys/vm/vm_page.c	Tue Jan 30 21:34:34 2018	(r328607)
@@ -171,7 +171,7 @@ static uma_zone_t fakepg_zone;
 static void vm_page_alloc_check(vm_page_t m);
 static void vm_page_clear_dirty_mask(vm_page_t m, vm_page_bits_t pagebits);
 static void vm_page_enqueue(uint8_t queue, vm_page_t m);
-static void vm_page_free_phys(vm_page_t m);
+static void vm_page_free_phys(struct vm_domain *vmd, vm_page_t m);
 static void vm_page_init(void *dummy);
 static int vm_page_insert_after(vm_page_t m, vm_object_t object,
     vm_pindex_t pindex, vm_page_t mpred);
@@ -2536,7 +2536,7 @@ unlock:
 		do {
 			MPASS(vm_phys_domain(m) == domain);
 			SLIST_REMOVE_HEAD(&free, plinks.s.ss);
-			vm_page_free_phys(m);
+			vm_page_free_phys(vmd, m);
 		} while ((m = SLIST_FIRST(&free)) != NULL);
 		vm_domain_free_wakeup(vmd);
 		vm_domain_free_unlock(vmd);
@@ -2751,7 +2751,8 @@ vm_wait_severe(void)
 	mtx_lock(&vm_domainset_lock);
 	while (vm_page_count_severe()) {
 		vm_severe_waiters++;
-		msleep(&vm_min_domains, &vm_domainset_lock, PVM, "vmwait", 0);
+		msleep(&vm_severe_domains, &vm_domainset_lock, PVM,
+		    "vmwait", 0);
 	}
 	mtx_unlock(&vm_domainset_lock);
 }
@@ -3165,12 +3166,12 @@ vm_page_free_prep(vm_page_t m, bool pagequeue_locked)
  * queues.  This is the last step to free a page.
  */
 static void
-vm_page_free_phys(vm_page_t m)
+vm_page_free_phys(struct vm_domain *vmd, vm_page_t m)
 {
 
-	vm_domain_free_assert_locked(vm_pagequeue_domain(m));
+	vm_domain_free_assert_locked(vmd);
 
-	vm_domain_freecnt_adj(vm_pagequeue_domain(m), 1);
+	vm_domain_freecnt_adj(vmd, 1);
 #if VM_NRESERVLEVEL > 0
 	if (!vm_reserv_free_page(m))
 #endif
@@ -3195,7 +3196,7 @@ vm_page_free_phys_pglist(struct pglist *tq)
 			vmd = vm_pagequeue_domain(m);
 			vm_domain_free_lock(vmd);
 		}
-		vm_page_free_phys(m);
+		vm_page_free_phys(vmd, m);
 	}
 	if (vmd != NULL) {
 		vm_domain_free_wakeup(vmd);
@@ -3221,7 +3222,7 @@ vm_page_free_toq(vm_page_t m)
 		return;
 	vmd = vm_pagequeue_domain(m);
 	vm_domain_free_lock(vmd);
-	vm_page_free_phys(m);
+	vm_page_free_phys(vmd, m);
 	vm_domain_free_wakeup(vmd);
 	vm_domain_free_unlock(vmd);
 }

Modified: user/jeff/numa/sys/vm/vm_reserv.c
==============================================================================
--- user/jeff/numa/sys/vm/vm_reserv.c	Tue Jan 30 21:26:31 2018	(r328606)
+++ user/jeff/numa/sys/vm/vm_reserv.c	Tue Jan 30 21:34:34 2018	(r328607)
@@ -822,9 +822,11 @@ vm_reserv_extend(int req, vm_object_t object, vm_pinde
 	    /* Handle vm_page_rename(m, new_object, ...). */
 	    popmap_is_set(rv->popmap, index))
 		m = NULL;
-	if (m != NULL)
+	if (m != NULL) {
 		vm_reserv_populate(rv, index);
-	free_count = vm_domain_freecnt_adj(vmd, -1);
+		free_count = vm_domain_freecnt_adj(vmd, -1);
+	} else
+		free_count = vmd->vmd_free_count;
 	vm_domain_free_unlock(vmd);
 
 	if (vm_paging_needed(vmd, free_count))
@@ -1362,12 +1364,20 @@ vm_reserv_startup(vm_offset_t *vaddr, vm_paddr_t end, 
 vm_page_t
 vm_reserv_to_superpage(vm_page_t m)
 {
+	struct vm_domain *vmd;
 	vm_reserv_t rv;
 
 	VM_OBJECT_ASSERT_LOCKED(m->object);
 	rv = vm_reserv_from_page(m);
-	return (rv->object == m->object && rv->popcnt == VM_LEVEL_0_NPAGES ?
-	    rv->pages : NULL);
+	vmd = VM_DOMAIN(rv->domain);
+	vm_domain_free_lock(vmd);
+	if (rv->object == m->object && rv->popcnt == VM_LEVEL_0_NPAGES)
+		m = rv->pages;
+	else
+		m = NULL;
+	vm_domain_free_unlock(vmd);
+
+	return (m);
 }
 
 #endif	/* VM_NRESERVLEVEL > 0 */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201801302134.w0ULYYT5024550>