summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authoryamt <yamt@NetBSD.org>2008-06-17 02:30:57 +0000
committeryamt <yamt@NetBSD.org>2008-06-17 02:30:57 +0000
commit52d8b786fc269d084654b2ae856417bb049bc28f (patch)
tree53ac9d948b93cc8cae8da332796ee0c312976526 /sys
parent90e623a314532905115aa5fa0d9a99565ef3c72d (diff)
- uvm_pagereplace: don't try to insert multiple pages with the same offset
into uvm_object rbtree. - inline static -> static inline
Diffstat (limited to 'sys')
-rw-r--r--sys/uvm/uvm_page.c68
1 files changed, 48 insertions, 20 deletions
diff --git a/sys/uvm/uvm_page.c b/sys/uvm/uvm_page.c
index 36fe3ea9810..9ad2ace5f22 100644
--- a/sys/uvm/uvm_page.c
+++ b/sys/uvm/uvm_page.c
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_page.c,v 1.135 2008/06/05 08:16:01 he Exp $ */
+/* $NetBSD: uvm_page.c,v 1.136 2008/06/17 02:30:57 yamt Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -71,7 +71,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.135 2008/06/05 08:16:01 he Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.136 2008/06/17 02:30:57 yamt Exp $");
#include "opt_uvmhist.h"
#include "opt_readahead.h"
@@ -145,7 +145,6 @@ vaddr_t uvm_zerocheckkva;
*/
static void uvm_pageinsert(struct vm_page *);
-static void uvm_pageinsert_after(struct vm_page *, struct vm_page *);
static void uvm_pageremove(struct vm_page *);
/*
@@ -192,7 +191,6 @@ const struct rb_tree_ops uvm_page_tree_ops = {
/*
* uvm_pageinsert: insert a page in the object.
- * uvm_pageinsert_after: insert a page into the specified place in listq
*
* => caller must lock object
* => caller must lock page queues
@@ -200,18 +198,17 @@ const struct rb_tree_ops uvm_page_tree_ops = {
* and bumped the version counter
*/
-inline static void
-uvm_pageinsert_after(struct vm_page *pg, struct vm_page *where)
+static inline void
+uvm_pageinsert_list(struct uvm_object *uobj, struct vm_page *pg,
+ struct vm_page *where)
{
- struct uvm_object *uobj = pg->uobject;
+ KASSERT(uobj == pg->uobject);
KASSERT(mutex_owned(&uobj->vmobjlock));
KASSERT((pg->flags & PG_TABLED) == 0);
KASSERT(where == NULL || (where->flags & PG_TABLED));
KASSERT(where == NULL || (where->uobject == uobj));
- rb_tree_insert_node(&uobj->rb_tree, &pg->rb_node);
-
if (UVM_OBJ_IS_VNODE(uobj)) {
if (uobj->uo_npages == 0) {
struct vnode *vp = (struct vnode *)uobj;
@@ -235,11 +232,24 @@ uvm_pageinsert_after(struct vm_page *pg, struct vm_page *where)
uobj->uo_npages++;
}
-inline static void
+
+static inline void
+uvm_pageinsert_tree(struct uvm_object *uobj, struct vm_page *pg)
+{
+ bool success;
+
+ KASSERT(uobj == pg->uobject);
+ success = rb_tree_insert_node(&uobj->rb_tree, &pg->rb_node);
+ KASSERT(success);
+}
+
+static inline void
uvm_pageinsert(struct vm_page *pg)
{
+ struct uvm_object *uobj = pg->uobject;
- uvm_pageinsert_after(pg, NULL);
+ uvm_pageinsert_tree(uobj, pg);
+ uvm_pageinsert_list(uobj, pg, NULL);
}
/*
@@ -250,15 +260,13 @@ uvm_pageinsert(struct vm_page *pg)
*/
static inline void
-uvm_pageremove(struct vm_page *pg)
+uvm_pageremove_list(struct uvm_object *uobj, struct vm_page *pg)
{
- struct uvm_object *uobj = pg->uobject;
+ KASSERT(uobj == pg->uobject);
KASSERT(mutex_owned(&uobj->vmobjlock));
KASSERT(pg->flags & PG_TABLED);
- rb_tree_remove_node(&uobj->rb_tree, &pg->rb_node);
-
if (UVM_OBJ_IS_VNODE(uobj)) {
if (uobj->uo_npages == 1) {
struct vnode *vp = (struct vnode *)uobj;
@@ -281,6 +289,23 @@ uvm_pageremove(struct vm_page *pg)
pg->uobject = NULL;
}
+static inline void
+uvm_pageremove_tree(struct uvm_object *uobj, struct vm_page *pg)
+{
+
+ KASSERT(uobj == pg->uobject);
+ rb_tree_remove_node(&uobj->rb_tree, &pg->rb_node);
+}
+
+static inline void
+uvm_pageremove(struct vm_page *pg)
+{
+ struct uvm_object *uobj = pg->uobject;
+
+ uvm_pageremove_tree(uobj, pg);
+ uvm_pageremove_list(uobj, pg);
+}
+
static void
uvm_page_init_buckets(struct pgfreelist *pgfl)
{
@@ -1205,18 +1230,21 @@ uvm_pagealloc_strat(struct uvm_object *obj, voff_t off, struct vm_anon *anon,
void
uvm_pagereplace(struct vm_page *oldpg, struct vm_page *newpg)
{
+ struct uvm_object *uobj = oldpg->uobject;
KASSERT((oldpg->flags & PG_TABLED) != 0);
- KASSERT(oldpg->uobject != NULL);
+ KASSERT(uobj != NULL);
KASSERT((newpg->flags & PG_TABLED) == 0);
KASSERT(newpg->uobject == NULL);
- KASSERT(mutex_owned(&oldpg->uobject->vmobjlock));
+ KASSERT(mutex_owned(&uobj->vmobjlock));
- newpg->uobject = oldpg->uobject;
+ newpg->uobject = uobj;
newpg->offset = oldpg->offset;
- uvm_pageinsert_after(newpg, oldpg);
- uvm_pageremove(oldpg);
+ uvm_pageremove_tree(uobj, oldpg);
+ uvm_pageinsert_tree(uobj, newpg);
+ uvm_pageinsert_list(uobj, newpg, oldpg);
+ uvm_pageremove_list(uobj, oldpg);
}
/*