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) {