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

Reply via email to