Source-Changes-HG archive

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

[src/trunk]: src/sys/uvm centralize calls from UVM to radixtree into a few fu...



details:   https://anonhg.NetBSD.org/src/rev/483c22191b23
branches:  trunk
changeset: 1012894:483c22191b23
user:      chs <chs%NetBSD.org@localhost>
date:      Fri Aug 14 09:06:14 2020 +0000

description:
centralize calls from UVM to radixtree into a few functions.
in those functions, assert that the object lock is held in
the correct mode.

diffstat:

 sys/miscfs/genfs/genfs_io.c |   30 ++++--------
 sys/uvm/uvm_extern.h        |   11 +++-
 sys/uvm/uvm_object.c        |  101 +++++++++++++++++++++++++++++++++++++++++++-
 sys/uvm/uvm_object.h        |    6 +-
 sys/uvm/uvm_page.c          |   25 ++++++---
 sys/uvm/uvm_page_status.c   |   21 +++-----
 sys/uvm/uvm_pager.c         |   10 +--
 sys/uvm/uvm_vnode.c         |   19 ++------
 8 files changed, 155 insertions(+), 68 deletions(-)

diffs (truncated from 503 to 300 lines):

diff -r 5af0fa95a7aa -r 483c22191b23 sys/miscfs/genfs/genfs_io.c
--- a/sys/miscfs/genfs/genfs_io.c       Fri Aug 14 08:46:54 2020 +0000
+++ b/sys/miscfs/genfs/genfs_io.c       Fri Aug 14 09:06:14 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: genfs_io.c,v 1.99 2020/08/10 11:09:15 rin Exp $        */
+/*     $NetBSD: genfs_io.c,v 1.100 2020/08/14 09:06:14 chs Exp $       */
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: genfs_io.c,v 1.99 2020/08/10 11:09:15 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: genfs_io.c,v 1.100 2020/08/14 09:06:14 chs Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -913,8 +913,7 @@
         * shortcut if we have no pages to process.
         */
 
-       nodirty = radix_tree_empty_tagged_tree_p(&uobj->uo_pages,
-            UVM_PAGE_DIRTY_TAG);
+       nodirty = uvm_obj_clean_p(uobj);
 #ifdef DIAGNOSTIC
        mutex_enter(vp->v_interlock);
        KASSERT((vp->v_iflag & VI_ONWORKLST) != 0 || nodirty);
@@ -922,9 +921,8 @@
 #endif
        if (uobj->uo_npages == 0 || (dirtyonly && nodirty)) {
                mutex_enter(vp->v_interlock);
-               if (vp->v_iflag & VI_ONWORKLST) {
-                       if (LIST_FIRST(&vp->v_dirtyblkhd) == NULL)
-                               vn_syncer_remove_from_worklist(vp);
+               if (vp->v_iflag & VI_ONWORKLST && LIST_EMPTY(&vp->v_dirtyblkhd)) {
+                       vn_syncer_remove_from_worklist(vp);
                }
                mutex_exit(vp->v_interlock);
                if (trans_mp) {
@@ -978,8 +976,7 @@
        }
 
        error = 0;
-       wasclean = radix_tree_empty_tagged_tree_p(&uobj->uo_pages,
-            UVM_PAGE_WRITEBACK_TAG);
+       wasclean = uvm_obj_nowriteback_p(uobj);
        nextoff = startoff;
        if (endoff == 0 || flags & PGO_ALLPAGES) {
                endoff = trunc_page(LLONG_MAX);
@@ -1030,8 +1027,7 @@
                KASSERT(pg->offset >= nextoff);
                KASSERT(!dirtyonly ||
                    uvm_pagegetdirty(pg) != UVM_PAGE_STATUS_CLEAN ||
-                   radix_tree_get_tag(&uobj->uo_pages,
-                       pg->offset >> PAGE_SHIFT, UVM_PAGE_WRITEBACK_TAG));
+                   uvm_obj_page_writeback_p(pg));
 
                if (pg->offset >= endoff) {
                        break;
@@ -1245,9 +1241,7 @@
                                 * mark pages as WRITEBACK so that concurrent
                                 * fsync can find and wait for our activities.
                                 */
-                               radix_tree_set_tag(&uobj->uo_pages,
-                                   pgs[i]->offset >> PAGE_SHIFT,
-                                   UVM_PAGE_WRITEBACK_TAG);
+                               uvm_obj_page_set_writeback(pgs[i]);
                        }
                        if (tpg->offset < startoff || tpg->offset >= endoff)
                                continue;
@@ -1332,11 +1326,9 @@
         * syncer list.
         */
 
-       if ((vp->v_iflag & VI_ONWORKLST) != 0 &&
-           radix_tree_empty_tagged_tree_p(&uobj->uo_pages,
-           UVM_PAGE_DIRTY_TAG)) {
-               if (LIST_FIRST(&vp->v_dirtyblkhd) == NULL)
-                       vn_syncer_remove_from_worklist(vp);
+       if ((vp->v_iflag & VI_ONWORKLST) != 0 && uvm_obj_clean_p(uobj) &&
+           LIST_EMPTY(&vp->v_dirtyblkhd)) {
+               vn_syncer_remove_from_worklist(vp);
        }
 
 #if !defined(DEBUG)
diff -r 5af0fa95a7aa -r 483c22191b23 sys/uvm/uvm_extern.h
--- a/sys/uvm/uvm_extern.h      Fri Aug 14 08:46:54 2020 +0000
+++ b/sys/uvm/uvm_extern.h      Fri Aug 14 09:06:14 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: uvm_extern.h,v 1.230 2020/06/14 22:25:15 ad Exp $      */
+/*     $NetBSD: uvm_extern.h,v 1.231 2020/08/14 09:06:15 chs Exp $     */
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -776,6 +776,14 @@
 int                    uvm_obj_wirepages(struct uvm_object *, off_t, off_t,
                            struct pglist *);
 void                   uvm_obj_unwirepages(struct uvm_object *, off_t, off_t);
+bool                   uvm_obj_clean_p(struct uvm_object *);
+bool                   uvm_obj_nowriteback_p(struct uvm_object *);
+bool                   uvm_obj_page_dirty_p(struct vm_page *);
+void                   uvm_obj_page_set_dirty(struct vm_page *);
+void                   uvm_obj_page_clear_dirty(struct vm_page *);
+bool                   uvm_obj_page_writeback_p(struct vm_page *);
+void                   uvm_obj_page_set_writeback(struct vm_page *);
+void                   uvm_obj_page_clear_writeback(struct vm_page *);
 
 /* uvm_page.c */
 int                    uvm_availmem(bool);
@@ -826,7 +834,6 @@
                            unsigned int *, struct vm_page **,
                            struct uvm_page_array *, unsigned int);
 bool                   uvn_text_p(struct uvm_object *);
-bool                   uvn_clean_p(struct uvm_object *);
 bool                   uvn_needs_writefault_p(struct uvm_object *);
 
 /* kern_malloc.c */
diff -r 5af0fa95a7aa -r 483c22191b23 sys/uvm/uvm_object.c
--- a/sys/uvm/uvm_object.c      Fri Aug 14 08:46:54 2020 +0000
+++ b/sys/uvm/uvm_object.c      Fri Aug 14 09:06:14 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: uvm_object.c,v 1.23 2020/05/25 21:15:10 ad Exp $       */
+/*     $NetBSD: uvm_object.c,v 1.24 2020/08/14 09:06:15 chs Exp $      */
 
 /*
  * Copyright (c) 2006, 2010, 2019 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_object.c,v 1.23 2020/05/25 21:15:10 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_object.c,v 1.24 2020/08/14 09:06:15 chs Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ddb.h"
@@ -233,6 +233,103 @@
        rw_exit(uobj->vmobjlock);
 }
 
+static inline bool
+uvm_obj_notag_p(struct uvm_object *uobj, int tag)
+{
+
+       KASSERT(rw_lock_held(uobj->vmobjlock));
+       return radix_tree_empty_tagged_tree_p(&uobj->uo_pages, tag);
+}
+
+bool
+uvm_obj_clean_p(struct uvm_object *uobj)
+{
+
+       return uvm_obj_notag_p(uobj, UVM_PAGE_DIRTY_TAG);
+}
+
+bool
+uvm_obj_nowriteback_p(struct uvm_object *uobj)
+{
+
+       return uvm_obj_notag_p(uobj, UVM_PAGE_WRITEBACK_TAG);
+}
+
+static inline bool
+uvm_obj_page_tag_p(struct vm_page *pg, int tag)
+{
+       struct uvm_object *uobj = pg->uobject;
+       int pgidx = pg->offset >> PAGE_SHIFT;
+
+       KASSERT(uobj != NULL);
+       KASSERT(rw_lock_held(uobj->vmobjlock));
+       return radix_tree_get_tag(&uobj->uo_pages, pgidx, tag) != 0;
+}
+
+static inline void
+uvm_obj_page_set_tag(struct vm_page *pg, int tag)
+{
+       struct uvm_object *uobj = pg->uobject;
+       int pgidx = pg->offset >> PAGE_SHIFT;
+
+       KASSERT(uobj != NULL);
+       KASSERT(rw_write_held(uobj->vmobjlock));
+       radix_tree_set_tag(&uobj->uo_pages, pgidx, tag);
+}
+
+static inline void
+uvm_obj_page_clear_tag(struct vm_page *pg, int tag)
+{
+       struct uvm_object *uobj = pg->uobject;
+       int pgidx = pg->offset >> PAGE_SHIFT;
+
+       KASSERT(uobj != NULL);
+       KASSERT(rw_write_held(uobj->vmobjlock));
+       radix_tree_clear_tag(&uobj->uo_pages, pgidx, tag);
+}
+
+bool
+uvm_obj_page_dirty_p(struct vm_page *pg)
+{
+
+       return uvm_obj_page_tag_p(pg, UVM_PAGE_DIRTY_TAG);
+}
+
+void
+uvm_obj_page_set_dirty(struct vm_page *pg)
+{
+
+       uvm_obj_page_set_tag(pg, UVM_PAGE_DIRTY_TAG);
+}
+
+void
+uvm_obj_page_clear_dirty(struct vm_page *pg)
+{
+
+       uvm_obj_page_clear_tag(pg, UVM_PAGE_DIRTY_TAG);
+}
+
+bool
+uvm_obj_page_writeback_p(struct vm_page *pg)
+{
+
+       return uvm_obj_page_tag_p(pg, UVM_PAGE_WRITEBACK_TAG);
+}
+
+void
+uvm_obj_page_set_writeback(struct vm_page *pg)
+{
+
+       uvm_obj_page_set_tag(pg, UVM_PAGE_WRITEBACK_TAG);
+}
+
+void
+uvm_obj_page_clear_writeback(struct vm_page *pg)
+{
+
+       uvm_obj_page_clear_tag(pg, UVM_PAGE_WRITEBACK_TAG);
+}
+
 #if defined(DDB) || defined(DEBUGPRINT)
 
 /*
diff -r 5af0fa95a7aa -r 483c22191b23 sys/uvm/uvm_object.h
--- a/sys/uvm/uvm_object.h      Fri Aug 14 08:46:54 2020 +0000
+++ b/sys/uvm/uvm_object.h      Fri Aug 14 09:06:14 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: uvm_object.h,v 1.38 2020/03/14 20:45:23 ad Exp $       */
+/*     $NetBSD: uvm_object.h,v 1.39 2020/08/14 09:06:15 chs Exp $      */
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -104,7 +104,7 @@
        (UVM_OBJ_IS_VNODE(uobj) && uvn_text_p(uobj))
 
 #define        UVM_OBJ_IS_CLEAN(uobj)                                          \
-       (UVM_OBJ_IS_VNODE(uobj) && uvn_clean_p(uobj))
+       (UVM_OBJ_IS_VNODE(uobj) && uvm_obj_clean_p(uobj))
 
 /*
  * UVM_OBJ_NEEDS_WRITEFAULT: true if the uobj needs to detect modification.
@@ -114,7 +114,7 @@
  */
 
 #define        UVM_OBJ_NEEDS_WRITEFAULT(uobj)                                  \
-       (UVM_OBJ_IS_VNODE(uobj) && uvn_clean_p(uobj))
+       (UVM_OBJ_IS_VNODE(uobj) && uvm_obj_clean_p(uobj))
 
 #define        UVM_OBJ_IS_AOBJ(uobj)                                           \
        ((uobj)->pgops == &aobj_pager)
diff -r 5af0fa95a7aa -r 483c22191b23 sys/uvm/uvm_page.c
--- a/sys/uvm/uvm_page.c        Fri Aug 14 08:46:54 2020 +0000
+++ b/sys/uvm/uvm_page.c        Fri Aug 14 09:06:14 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: uvm_page.c,v 1.244 2020/07/09 05:57:15 skrll Exp $     */
+/*     $NetBSD: uvm_page.c,v 1.245 2020/08/14 09:06:15 chs Exp $       */
 
 /*-
  * Copyright (c) 2019, 2020 The NetBSD Foundation, Inc.
@@ -95,7 +95,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.244 2020/07/09 05:57:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.245 2020/08/14 09:06:15 chs Exp $");
 
 #include "opt_ddb.h"
 #include "opt_uvm.h"
@@ -240,15 +240,17 @@
        const uint64_t idx = pg->offset >> PAGE_SHIFT;
        int error;
 
+       KASSERT(rw_write_held(uobj->vmobjlock));
+
        error = radix_tree_insert_node(&uobj->uo_pages, idx, pg);
        if (error != 0) {
                return error;
        }
        if ((pg->flags & PG_CLEAN) == 0) {
-               radix_tree_set_tag(&uobj->uo_pages, idx, UVM_PAGE_DIRTY_TAG);
+               uvm_obj_page_set_dirty(pg);
        }
        KASSERT(((pg->flags & PG_CLEAN) == 0) ==



Home | Main Index | Thread Index | Old Index