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