Module Name:    src
Committed By:   ad
Date:           Mon Dec 30 17:45:53 UTC 2019

Modified Files:
        src/sys/uvm: uvm_page.c

Log Message:
uvm_pagealloc_pgb(): don't fill cache if we're into the reserves.

uvm_pagereplace(): use radix_tree_replace_node() to avoid alloc/free.


To generate a diff of this commit:
cvs rdiff -u -r1.216 -r1.217 src/sys/uvm/uvm_page.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/uvm/uvm_page.c
diff -u src/sys/uvm/uvm_page.c:1.216 src/sys/uvm/uvm_page.c:1.217
--- src/sys/uvm/uvm_page.c:1.216	Sat Dec 28 16:07:41 2019
+++ src/sys/uvm/uvm_page.c	Mon Dec 30 17:45:53 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_page.c,v 1.216 2019/12/28 16:07:41 ad Exp $	*/
+/*	$NetBSD: uvm_page.c,v 1.217 2019/12/30 17:45:53 ad Exp $	*/
 
 /*-
  * Copyright (c) 2019 The NetBSD Foundation, Inc.
@@ -95,7 +95,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.216 2019/12/28 16:07:41 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.217 2019/12/30 17:45:53 ad Exp $");
 
 #include "opt_ddb.h"
 #include "opt_uvm.h"
@@ -1028,6 +1028,7 @@ uvm_pagealloc_pgb(struct uvm_cpu *ucpu, 
 	struct pgflbucket *pgb;
 	struct vm_page *pg;
 	kmutex_t *lock;
+	bool fill;
 
 	/*
 	 * Skip the bucket if empty, no lock needed.  There could be many
@@ -1048,6 +1049,9 @@ uvm_pagealloc_pgb(struct uvm_cpu *ucpu, 
 			mutex_spin_exit(lock);
 		     	return NULL;
 		}
+		fill = false;
+	} else {
+		fill = true;
 	}
 
 	/* Try all page colors as needed. */
@@ -1073,7 +1077,7 @@ uvm_pagealloc_pgb(struct uvm_cpu *ucpu, 
 			 * so if we found pages in this CPU's preferred
 			 * bucket.
 			 */
-			if (__predict_true(b == ucpu->pgflbucket)) {
+			if (__predict_true(b == ucpu->pgflbucket && fill)) {
 				uvm_pgflcache_fill(ucpu, f, b, c);
 			}
 			mutex_spin_exit(lock);
@@ -1347,6 +1351,7 @@ void
 uvm_pagereplace(struct vm_page *oldpg, struct vm_page *newpg)
 {
 	struct uvm_object *uobj = oldpg->uobject;
+	struct vm_page *pg __diagused;
 
 	KASSERT((oldpg->flags & PG_TABLED) != 0);
 	KASSERT(uobj != NULL);
@@ -1355,8 +1360,9 @@ uvm_pagereplace(struct vm_page *oldpg, s
 	KASSERT(mutex_owned(uobj->vmobjlock));
 
 	newpg->offset = oldpg->offset;
-	uvm_pageremove_tree(uobj, oldpg);
-	uvm_pageinsert_tree(uobj, newpg);
+	pg = radix_tree_replace_node(&uobj->uo_pages,
+	    newpg->offset >> PAGE_SHIFT, newpg);
+	KASSERT(pg == oldpg);
 
 	/* take page interlocks during rename */
 	if (oldpg < newpg) {

Reply via email to