Diff below use C99 initializer and constify the various "struct uvm_pagerops"
in tree.

While here add some KERNEL_ASSERT_LOCKED() to places where the `uobj'
locking has been removed and that should be revisited.  This is to help
a future myself or another developer to look at what needs some love.

ok?

Index: dev/pci/drm/drm_gem.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/drm_gem.c,v
retrieving revision 1.11
diff -u -p -r1.11 drm_gem.c
--- dev/pci/drm/drm_gem.c       22 Aug 2020 04:53:50 -0000      1.11
+++ dev/pci/drm/drm_gem.c       20 Oct 2020 09:01:08 -0000
@@ -58,12 +58,11 @@ boolean_t drm_flush(struct uvm_object *,
 int drm_fault(struct uvm_faultinfo *, vaddr_t, vm_page_t *, int, int,
     vm_fault_t, vm_prot_t, int);
 
-struct uvm_pagerops drm_pgops = {
-       NULL,
-       drm_ref,
-       drm_unref,
-       drm_fault,
-       drm_flush,
+const struct uvm_pagerops drm_pgops = {
+       .pgo_reference = drm_ref,
+       .pgo_detach = drm_unref,
+       .pgo_fault = drm_fault,
+       .pgo_flush = drm_flush,
 };
 
 void
Index: dev/pci/drm/ttm/ttm_bo_vm.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/ttm/ttm_bo_vm.c,v
retrieving revision 1.22
diff -u -p -r1.22 ttm_bo_vm.c
--- dev/pci/drm/ttm/ttm_bo_vm.c 18 Oct 2020 09:22:32 -0000      1.22
+++ dev/pci/drm/ttm/ttm_bo_vm.c 20 Oct 2020 09:01:08 -0000
@@ -903,7 +903,7 @@ ttm_bo_vm_detach(struct uvm_object *uobj
        ttm_bo_put(bo);
 }
 
-struct uvm_pagerops ttm_bo_vm_ops = {
+const struct uvm_pagerops ttm_bo_vm_ops = {
        .pgo_fault = ttm_bo_vm_fault,
        .pgo_reference = ttm_bo_vm_reference,
        .pgo_detach = ttm_bo_vm_detach
Index: uvm/uvm_aobj.c
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_aobj.c,v
retrieving revision 1.87
diff -u -p -r1.87 uvm_aobj.c
--- uvm/uvm_aobj.c      22 Sep 2020 14:31:08 -0000      1.87
+++ uvm/uvm_aobj.c      20 Oct 2020 09:01:08 -0000
@@ -181,16 +181,14 @@ int       uao_grow_convert(struct uvm_object *
 
 /*
  * aobj_pager
- * 
+ *
  * note that some functions (e.g. put) are handled elsewhere
  */
-struct uvm_pagerops aobj_pager = {
-       NULL,                   /* init */
-       uao_reference,          /* reference */
-       uao_detach,             /* detach */
-       NULL,                   /* fault */
-       uao_flush,              /* flush */
-       uao_get,                /* get */
+const struct uvm_pagerops aobj_pager = {
+       .pgo_reference = uao_reference,
+       .pgo_detach = uao_detach,
+       .pgo_flush = uao_flush,
+       .pgo_get = uao_get,
 };
 
 /*
@@ -810,6 +808,7 @@ uao_init(void)
 void
 uao_reference(struct uvm_object *uobj)
 {
+       KERNEL_ASSERT_LOCKED();
        uao_reference_locked(uobj);
 }
 
@@ -834,6 +833,7 @@ uao_reference_locked(struct uvm_object *
 void
 uao_detach(struct uvm_object *uobj)
 {
+       KERNEL_ASSERT_LOCKED();
        uao_detach_locked(uobj);
 }
 
@@ -908,6 +908,8 @@ uao_flush(struct uvm_object *uobj, voff_
        struct vm_page *pp;
        voff_t curoff;
 
+       KERNEL_ASSERT_LOCKED();
+
        if (flags & PGO_ALLPAGES) {
                start = 0;
                stop = (voff_t)aobj->u_pages << PAGE_SHIFT;
@@ -1028,6 +1030,8 @@ uao_get(struct uvm_object *uobj, voff_t 
        vm_page_t ptmp;
        int lcv, gotpages, maxpages, swslot, rv, pageidx;
        boolean_t done;
+
+       KERNEL_ASSERT_LOCKED();
 
        /* get number of pages */
        maxpages = *npagesp;
Index: uvm/uvm_aobj.h
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_aobj.h,v
retrieving revision 1.16
diff -u -p -r1.16 uvm_aobj.h
--- uvm/uvm_aobj.h      11 Jul 2014 16:35:40 -0000      1.16
+++ uvm/uvm_aobj.h      20 Oct 2020 09:01:08 -0000
@@ -69,7 +69,7 @@ int uao_grow(struct uvm_object *, int);
  * globals
  */
 
-extern struct uvm_pagerops aobj_pager;
+extern const struct uvm_pagerops aobj_pager;
 
 #endif /* _KERNEL */
 
Index: uvm/uvm_device.c
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_device.c,v
retrieving revision 1.57
diff -u -p -r1.57 uvm_device.c
--- uvm/uvm_device.c    8 Dec 2019 12:37:45 -0000       1.57
+++ uvm/uvm_device.c    20 Oct 2020 09:01:08 -0000
@@ -70,12 +70,11 @@ static boolean_t        udv_flush(struct
 /*
  * master pager structure
  */
-struct uvm_pagerops uvm_deviceops = {
-       NULL,           /* inited statically */
-       udv_reference,
-       udv_detach,
-       udv_fault,
-       udv_flush,
+const struct uvm_pagerops uvm_deviceops = {
+       .pgo_reference = udv_reference,
+       .pgo_detach = udv_detach,
+       .pgo_fault = udv_fault,
+       .pgo_flush = udv_flush,
 };
 
 /*
@@ -213,7 +212,7 @@ udv_attach(dev_t device, vm_prot_t acces
 static void
 udv_reference(struct uvm_object *uobj)
 {
-
+       KERNEL_ASSERT_LOCKED();
        uobj->uo_refs++;
 }
 
@@ -227,6 +226,8 @@ udv_detach(struct uvm_object *uobj)
 {
        struct uvm_device *udv = (struct uvm_device *)uobj;
 
+       KERNEL_ASSERT_LOCKED();
+
        /* loop until done */
 again:
        if (uobj->uo_refs > 1) {
@@ -297,6 +298,8 @@ udv_fault(struct uvm_faultinfo *ufi, vad
        paddr_t (*mapfn)(dev_t, off_t, int);
        vm_prot_t mapprot;
 
+       KERNEL_ASSERT_LOCKED();
+
        /*
         * we do not allow device mappings to be mapped copy-on-write
         * so we kill any attempt to do so here.
@@ -320,7 +323,7 @@ udv_fault(struct uvm_faultinfo *ufi, vad
        curr_offset = entry->offset + (vaddr - entry->start);
        /* pmap va = vaddr (virtual address of pps[0]) */
        curr_va = vaddr;
-       
+
        /* loop over the page range entering in as needed */
        retval = VM_PAGER_OK;
        for (lcv = 0 ; lcv < npages ; lcv++, curr_offset += PAGE_SIZE,
Index: uvm/uvm_object.c
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_object.c,v
retrieving revision 1.16
diff -u -p -r1.16 uvm_object.c
--- uvm/uvm_object.c    13 Sep 2020 10:05:25 -0000      1.16
+++ uvm/uvm_object.c    20 Oct 2020 09:01:08 -0000
@@ -48,7 +48,7 @@
  * uvm_objinit: initialise a uvm object.
  */
 void
-uvm_objinit(struct uvm_object *uobj, struct uvm_pagerops *pgops, int refs)
+uvm_objinit(struct uvm_object *uobj, const struct uvm_pagerops *pgops, int 
refs)
 {
        uobj->pgops = pgops;
        RBT_INIT(uvm_objtree, &uobj->memt);
Index: uvm/uvm_object.h
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_object.h,v
retrieving revision 1.23
diff -u -p -r1.23 uvm_object.h
--- uvm/uvm_object.h    29 Nov 2019 22:10:04 -0000      1.23
+++ uvm/uvm_object.h    20 Oct 2020 09:01:08 -0000
@@ -40,7 +40,7 @@
  */
 
 struct uvm_object {
-       struct uvm_pagerops             *pgops;         /* pager ops */
+       const struct uvm_pagerops       *pgops;         /* pager ops */
        RBT_HEAD(uvm_objtree, vm_page)   memt;          /* pages in object */
        int                              uo_npages;     /* # of pages in memt */
        int                              uo_refs;       /* reference count */
@@ -72,8 +72,8 @@ struct uvm_object {
 
 #ifdef _KERNEL
 
-extern struct uvm_pagerops uvm_vnodeops;
-extern struct uvm_pagerops uvm_deviceops;
+extern const struct uvm_pagerops uvm_vnodeops;
+extern const struct uvm_pagerops uvm_deviceops;
 
 /* For object trees */
 int    uvm_pagecmp(const struct vm_page *, const struct vm_page *);
@@ -89,7 +89,7 @@ RBT_PROTOTYPE(uvm_objtree, vm_page, objt
        ((uobj)->pgops == &uvm_vnodeops &&                              \
         ((struct vnode *)uobj)->v_flag & VTEXT)
 
-void   uvm_objinit(struct uvm_object *, struct uvm_pagerops *, int);
+void   uvm_objinit(struct uvm_object *, const struct uvm_pagerops *, int);
 int    uvm_objwire(struct uvm_object *, voff_t, voff_t, struct pglist *);
 void   uvm_objunwire(struct uvm_object *, voff_t, voff_t);
 void   uvm_objfree(struct uvm_object *);
Index: uvm/uvm_pager.c
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_pager.c,v
retrieving revision 1.72
diff -u -p -r1.72 uvm_pager.c
--- uvm/uvm_pager.c     8 Dec 2019 12:37:45 -0000       1.72
+++ uvm/uvm_pager.c     20 Oct 2020 09:01:08 -0000
@@ -43,7 +43,7 @@
 
 struct pool *uvm_aiobuf_pool;
 
-struct uvm_pagerops *uvmpagerops[] = {
+const struct uvm_pagerops *uvmpagerops[] = {
        &aobj_pager,
        &uvm_deviceops,
        &uvm_vnodeops,
Index: uvm/uvm_vnode.c
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_vnode.c,v
retrieving revision 1.106
diff -u -p -r1.106 uvm_vnode.c
--- uvm/uvm_vnode.c     16 Jan 2020 15:35:22 -0000      1.106
+++ uvm/uvm_vnode.c     20 Oct 2020 09:01:08 -0000
@@ -93,16 +93,16 @@ void                 uvn_reference(struct uvm_object *
 /*
  * master pager structure
  */
-struct uvm_pagerops uvm_vnodeops = {
-       uvn_init,
-       uvn_reference,
-       uvn_detach,
-       NULL,                   /* no specialized fault routine required */
-       uvn_flush,
-       uvn_get,
-       uvn_put,
-       uvn_cluster,
-       uvm_mk_pcluster, /* use generic version of this: see uvm_pager.c */
+const struct uvm_pagerops uvm_vnodeops = {
+       .pgo_init = uvn_init,
+       .pgo_reference = uvn_reference,
+       .pgo_detach = uvn_detach,
+       .pgo_flush = uvn_flush,
+       .pgo_get = uvn_get,
+       .pgo_put = uvn_put,
+       .pgo_cluster = uvn_cluster,
+       /* use generic version of this: see uvm_pager.c */
+       .pgo_mk_pcluster = uvm_mk_pcluster,
 };
 
 /*
@@ -279,6 +279,7 @@ uvn_reference(struct uvm_object *uobj)
                panic("uvn_reference: invalid state");
        }
 #endif
+       KERNEL_ASSERT_LOCKED();
        uobj->uo_refs++;
 }
 
@@ -298,7 +299,7 @@ uvn_detach(struct uvm_object *uobj)
        struct vnode *vp;
        int oldflags;
 
-
+       KERNEL_ASSERT_LOCKED();
        uobj->uo_refs--;                        /* drop ref! */
        if (uobj->uo_refs) {                    /* still more refs */
                return;
@@ -587,6 +588,7 @@ uvn_flush(struct uvm_object *uobj, voff_
        boolean_t retval, need_iosync, needs_clean;
        voff_t curoff;
 
+       KERNEL_ASSERT_LOCKED();
        TAILQ_INIT(&dead);
 
        /* get init vals and determine how we are going to traverse object */
@@ -875,6 +877,7 @@ uvn_put(struct uvm_object *uobj, struct 
 {
        int retval;
 
+       KERNEL_ASSERT_LOCKED();
        retval = uvn_io((struct uvm_vnode*)uobj, pps, npages, flags, UIO_WRITE);
 
        return(retval);
@@ -897,6 +900,8 @@ uvn_get(struct uvm_object *uobj, voff_t 
        struct vm_page *ptmp;
        int lcv, result, gotpages;
        boolean_t done;
+
+       KERNEL_ASSERT_LOCKED();
 
        /* step 1: handled the case where fault data structures are locked. */
        if (flags & PGO_LOCKED) {

Reply via email to