Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/yamt-pagecache]: src/sys/uvm cache UVM_OBJ_IS_VNODE in pqflags



details:   https://anonhg.NetBSD.org/src/rev/e977c0033892
branches:  yamt-pagecache
changeset: 770827:e977c0033892
user:      yamt <yamt%NetBSD.org@localhost>
date:      Sun Nov 13 01:18:02 2011 +0000

description:
cache UVM_OBJ_IS_VNODE in pqflags

diffstat:

 sys/uvm/uvm_aobj.c        |  12 ++----------
 sys/uvm/uvm_page.c        |  35 ++++++++++++++++++++++-------------
 sys/uvm/uvm_page.h        |   6 ++++--
 sys/uvm/uvm_page_status.c |  16 +++++-----------
 4 files changed, 33 insertions(+), 36 deletions(-)

diffs (209 lines):

diff -r ff5a904b57f5 -r e977c0033892 sys/uvm/uvm_aobj.c
--- a/sys/uvm/uvm_aobj.c        Sat Nov 12 04:12:52 2011 +0000
+++ b/sys/uvm/uvm_aobj.c        Sun Nov 13 01:18:02 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: uvm_aobj.c,v 1.116.2.3 2011/11/06 22:05:00 yamt Exp $  */
+/*     $NetBSD: uvm_aobj.c,v 1.116.2.4 2011/11/13 01:18:02 yamt Exp $  */
 
 /*
  * Copyright (c) 1998 Chuck Silvers, Charles D. Cranor and
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_aobj.c,v 1.116.2.3 2011/11/06 22:05:00 yamt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_aobj.c,v 1.116.2.4 2011/11/13 01:18:02 yamt Exp $");
 
 #include "opt_uvmhist.h"
 
@@ -909,7 +909,6 @@
                                    NULL, UVM_FLAG_COLORMATCH|UVM_PGA_ZERO);
                                if (ptmp) {
                                        /* new page */
-                                       ptmp->pqflags |= PQ_AOBJ;
                                        ptmp->flags &= ~PG_FAKE;
                                        uvm_pagemarkdirty(ptmp,
                                            UVM_PAGE_STATUS_UNKNOWN);
@@ -1018,13 +1017,6 @@
                                }
 
                                /*
-                                * safe with PQ's unlocked: because we just
-                                * alloc'd the page
-                                */
-
-                               ptmp->pqflags |= PQ_AOBJ;
-
-                               /*
                                 * got new page ready for I/O.  break pps while
                                 * loop.  pps[lcv] is still NULL.
                                 */
diff -r ff5a904b57f5 -r e977c0033892 sys/uvm/uvm_page.c
--- a/sys/uvm/uvm_page.c        Sat Nov 12 04:12:52 2011 +0000
+++ b/sys/uvm/uvm_page.c        Sun Nov 13 01:18:02 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: uvm_page.c,v 1.178.2.4 2011/11/12 02:54:04 yamt Exp $  */
+/*     $NetBSD: uvm_page.c,v 1.178.2.5 2011/11/13 01:18:02 yamt Exp $  */
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.178.2.4 2011/11/12 02:54:04 yamt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.178.2.5 2011/11/13 01:18:02 yamt Exp $");
 
 #include "opt_ddb.h"
 #include "opt_uvmhist.h"
@@ -169,8 +169,6 @@
 uvm_pageinsert_list(struct uvm_object *uobj, struct vm_page *pg,
     struct vm_page *where)
 {
-       const bool isvnode = UVM_OBJ_IS_VNODE(uobj);
-       const bool isaobj = UVM_OBJ_IS_AOBJ(uobj);
 
        KASSERT(uobj == pg->uobject);
        KASSERT(mutex_owned(uobj->vmobjlock));
@@ -178,15 +176,17 @@
        KASSERT(where == NULL || (where->flags & PG_TABLED));
        KASSERT(where == NULL || (where->uobject == uobj));
 
-       if (isvnode || isaobj) {
+       if ((pg->pqflags & PQ_STAT) != 0) {
                struct uvm_cpu *ucpu;
                const unsigned int status = uvm_pagegetdirty(pg);
+               const bool isaobj = (pg->pqflags & PQ_AOBJ) != 0;
 
                kpreempt_disable();
                ucpu = curcpu()->ci_data.cpu_uvm;
                ucpu->pagestate[isaobj][status]++;
                kpreempt_enable();
-               if (isvnode) {
+               if (!isaobj) {
+                       KASSERT((pg->pqflags & PQ_FILE) != 0);
                        if (uobj->uo_npages == 0) {
                                struct vnode *vp = (struct vnode *)uobj;
 
@@ -248,22 +248,22 @@
 static inline void
 uvm_pageremove_list(struct uvm_object *uobj, struct vm_page *pg)
 {
-       const bool isvnode = UVM_OBJ_IS_VNODE(uobj);
-       const bool isaobj = UVM_OBJ_IS_AOBJ(uobj);
 
        KASSERT(uobj == pg->uobject);
        KASSERT(mutex_owned(uobj->vmobjlock));
        KASSERT(pg->flags & PG_TABLED);
 
-       if (isvnode || isaobj) {
+       if ((pg->pqflags & PQ_STAT) != 0) {
                struct uvm_cpu *ucpu;
                const unsigned int status = uvm_pagegetdirty(pg);
+               const bool isaobj = (pg->pqflags & PQ_AOBJ) != 0;
 
                kpreempt_disable();
                ucpu = curcpu()->ci_data.cpu_uvm;
                ucpu->pagestate[isaobj][status]--;
                kpreempt_enable();
-               if (isvnode) {
+               if (!isaobj) {
+                       KASSERT((pg->pqflags & PQ_FILE) != 0);
                        if (uobj->uo_npages == 1) {
                                struct vnode *vp = (struct vnode *)uobj;
 
@@ -1324,18 +1324,27 @@
         * otherwise we race with uvm_pglistalloc.
         */
        pg->pqflags = 0;
-       if (anon) {
-               ucpu->pagestate[1][UVM_PAGE_STATUS_CLEAN]++;
-       }
        mutex_spin_exit(&uvm_fpageqlock);
        if (anon) {
                anon->an_page = pg;
                pg->pqflags = PQ_ANON;
                atomic_inc_uint(&uvmexp.anonpages);
+               kpreempt_disable();
+               ucpu = curcpu()->ci_data.cpu_uvm;
+               ucpu->pagestate[1][UVM_PAGE_STATUS_CLEAN]++;
+               kpreempt_enable();
        } else {
                if (obj) {
                        int error;
 
+                       /*
+                        * set PQ_FILE|PQ_AOBJ before the first uvm_pageinsert.
+                        */
+                       if (UVM_OBJ_IS_VNODE(obj)) {
+                               pg->pqflags |= PQ_FILE;
+                       } else {
+                               pg->pqflags |= PQ_AOBJ;
+                       }
                        error = uvm_pageinsert(obj, pg);
                        if (error != 0) {
 #if 1
diff -r ff5a904b57f5 -r e977c0033892 sys/uvm/uvm_page.h
--- a/sys/uvm/uvm_page.h        Sat Nov 12 04:12:52 2011 +0000
+++ b/sys/uvm/uvm_page.h        Sun Nov 13 01:18:02 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: uvm_page.h,v 1.73.2.3 2011/11/11 10:34:24 yamt Exp $   */
+/*     $NetBSD: uvm_page.h,v 1.73.2.4 2011/11/13 01:18:02 yamt Exp $   */
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -194,6 +194,8 @@
                                           uvm_object */
 #define PQ_SWAPBACKED  (PQ_ANON|PQ_AOBJ)
 #define PQ_READAHEAD   0x0008  /* read-ahead but has not been "hit" yet */
+#define        PQ_FILE         0x0010          /* file backed (non-anonymous) */
+#define        PQ_STAT         (PQ_ANON|PQ_AOBJ|PQ_FILE)
 
 #define PQ_PRIVATE1    0x0100
 #define PQ_PRIVATE2    0x0200
@@ -205,7 +207,7 @@
 #define PQ_PRIVATE8    0x8000
 
 #define        UVM_PQFLAGBITS \
-       "\20\1FREE\2ANON\3AOBJ\4READAHEAD" \
+       "\20\1FREE\2ANON\3AOBJ\4READAHEAD\5FILE" \
        "\11PRIVATE1\12PRIVATE2\13PRIVATE3\14PRIVATE4" \
        "\15PRIVATE5\16PRIVATE6\17PRIVATE7\20PRIVATE8"
 
diff -r ff5a904b57f5 -r e977c0033892 sys/uvm/uvm_page_status.c
--- a/sys/uvm/uvm_page_status.c Sat Nov 12 04:12:52 2011 +0000
+++ b/sys/uvm/uvm_page_status.c Sun Nov 13 01:18:02 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: uvm_page_status.c,v 1.1.2.3 2011/11/12 02:54:04 yamt Exp $     */
+/*     $NetBSD: uvm_page_status.c,v 1.1.2.4 2011/11/13 01:18:02 yamt Exp $     */
 
 /*-
  * Copyright (c)2011 YAMAMOTO Takashi,
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_page_status.c,v 1.1.2.3 2011/11/12 02:54:04 yamt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_page_status.c,v 1.1.2.4 2011/11/13 01:18:02 yamt Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -125,15 +125,9 @@
        pg->flags |= newstatus;
        KASSERT(uobj == NULL || ((pg->flags & PG_CLEAN) == 0) ==
            radix_tree_get_tag(&uobj->uo_pages, idx, UVM_PAGE_DIRTY_TAG));
-       if (uobj != NULL) {
-               const bool isvnode = UVM_OBJ_IS_VNODE(uobj);
-               const bool isaobj = UVM_OBJ_IS_AOBJ(uobj);
-
-               if (isvnode || isaobj) {
-                       stat_update(isaobj, oldstatus, newstatus);
-               }
-       } else {
-               stat_update(true, oldstatus, newstatus);
+       if ((pg->pqflags & PQ_STAT) != 0) {
+               stat_update((pg->pqflags & PQ_SWAPBACKED) != 0,
+                   oldstatus, newstatus);
        }
 }
 



Home | Main Index | Thread Index | Old Index