> Date: Tue, 20 Oct 2020 11:29:03 +0200
> From: Martin Pieuchot <[email protected]>
>
> 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?
ok kettenis@
> 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) {
>
>