summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoroga <oga@openbsd.org>2010-04-30 21:56:39 +0000
committeroga <oga@openbsd.org>2010-04-30 21:56:39 +0000
commitca0f98fe9754cf4fac9870df0f9d237a2ef52760 (patch)
treec26e7a686050c272451f2d6dc432e252486aae20
parentPrevent a possible case of lock recursion in swapoff. (diff)
downloadwireguard-openbsd-ca0f98fe9754cf4fac9870df0f9d237a2ef52760.tar.xz
wireguard-openbsd-ca0f98fe9754cf4fac9870df0f9d237a2ef52760.zip
Right now, if anything internal changes with a uvm object, diverse
places in the tree need to be touched to update the object initialisation with respect to that. So, make a function (uvm_initobj) that takes the refcount, object and pager ops and does this initialisation for us. This should save on maintainance in the future. looked good to fgs@. Tedu complained about the British spelling but OKed it anyway.
-rw-r--r--sys/arch/amd64/amd64/pmap.c12
-rw-r--r--sys/arch/hppa/hppa/pmap.c14
-rw-r--r--sys/arch/i386/i386/pmap.c14
-rw-r--r--sys/dev/pci/drm/drm_drv.c6
-rw-r--r--sys/kern/vfs_biomem.c7
-rw-r--r--sys/uvm/uvm_aobj.c14
-rw-r--r--sys/uvm/uvm_device.c8
-rw-r--r--sys/uvm/uvm_object.c14
-rw-r--r--sys/uvm/uvm_object.h4
-rw-r--r--sys/uvm/uvm_vnode.c7
10 files changed, 35 insertions, 65 deletions
diff --git a/sys/arch/amd64/amd64/pmap.c b/sys/arch/amd64/amd64/pmap.c
index 15287aac869..a73e05b0888 100644
--- a/sys/arch/amd64/amd64/pmap.c
+++ b/sys/arch/amd64/amd64/pmap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pmap.c,v 1.52 2009/12/09 14:31:57 oga Exp $ */
+/* $OpenBSD: pmap.c,v 1.53 2010/04/30 21:56:39 oga Exp $ */
/* $NetBSD: pmap.c,v 1.3 2003/05/08 18:13:13 thorpej Exp $ */
/*
@@ -569,10 +569,7 @@ pmap_bootstrap(paddr_t first_avail, paddr_t max_pa)
kpm = pmap_kernel();
for (i = 0; i < PTP_LEVELS - 1; i++) {
- kpm->pm_obj[i].pgops = NULL;
- RB_INIT(&kpm->pm_obj[i].memt);
- kpm->pm_obj[i].uo_npages = 0;
- kpm->pm_obj[i].uo_refs = 1;
+ uvm_objinit(&kpm->pm_obj[i], NULL, 1);
kpm->pm_ptphint[i] = NULL;
}
memset(&kpm->pm_list, 0, sizeof(kpm->pm_list)); /* pm_list not used */
@@ -1021,10 +1018,7 @@ pmap_create(void)
/* init uvm_object */
for (i = 0; i < PTP_LEVELS - 1; i++) {
- pmap->pm_obj[i].pgops = NULL; /* not a mappable object */
- RB_INIT(&pmap->pm_obj[i].memt);
- pmap->pm_obj[i].uo_npages = 0;
- pmap->pm_obj[i].uo_refs = 1;
+ uvm_objinit(&pmap->pm_obj[i], NULL, 1);
pmap->pm_ptphint[i] = NULL;
}
pmap->pm_stats.wired_count = 0;
diff --git a/sys/arch/hppa/hppa/pmap.c b/sys/arch/hppa/hppa/pmap.c
index ef9f976b4bc..7781e2407a3 100644
--- a/sys/arch/hppa/hppa/pmap.c
+++ b/sys/arch/hppa/hppa/pmap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pmap.c,v 1.151 2010/04/20 23:27:01 deraadt Exp $ */
+/* $OpenBSD: pmap.c,v 1.152 2010/04/30 21:56:39 oga Exp $ */
/*
* Copyright (c) 1998-2004 Michael Shalayeff
@@ -466,11 +466,7 @@ pmap_bootstrap(vstart)
*/
kpm = &kernel_pmap_store;
bzero(kpm, sizeof(*kpm));
- simple_lock_init(&kpm->pm_lock);
- kpm->pm_obj.pgops = NULL;
- RB_INIT(&kpm->pm_obj.memt);
- kpm->pm_obj.uo_npages = 0;
- kpm->pm_obj.uo_refs = 1;
+ uvm_objinit(&kpm->pm_obj, NULL, 1);
kpm->pm_space = HPPA_SID_KERNEL;
kpm->pm_pid = HPPA_PID_KERNEL;
kpm->pm_pdir_pg = NULL;
@@ -652,11 +648,7 @@ pmap_create()
pmap = pool_get(&pmap_pmap_pool, PR_WAITOK);
- simple_lock_init(&pmap->pm_lock);
- pmap->pm_obj.pgops = NULL; /* currently not a mappable object */
- RB_INIT(&pmap->pm_obj.memt);
- pmap->pm_obj.uo_npages = 0;
- pmap->pm_obj.uo_refs = 1;
+ uvm_objinit(&pmap->pm_obj, NULL, 1);
for (space = 1 + arc4random_uniform(hppa_sid_max);
pmap_sdir_get(space); space = (space + 1) % hppa_sid_max);
diff --git a/sys/arch/i386/i386/pmap.c b/sys/arch/i386/i386/pmap.c
index c8a00287213..01fa773dc44 100644
--- a/sys/arch/i386/i386/pmap.c
+++ b/sys/arch/i386/i386/pmap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pmap.c,v 1.146 2009/12/09 14:31:57 oga Exp $ */
+/* $OpenBSD: pmap.c,v 1.147 2010/04/30 21:56:39 oga Exp $ */
/* $NetBSD: pmap.c,v 1.91 2000/06/02 17:46:37 thorpej Exp $ */
/*
@@ -805,11 +805,7 @@ pmap_bootstrap(vaddr_t kva_start)
*/
kpm = pmap_kernel();
- simple_lock_init(&kpm->pm_obj.vmobjlock);
- kpm->pm_obj.pgops = NULL;
- RB_INIT(&kpm->pm_obj.memt);
- kpm->pm_obj.uo_npages = 0;
- kpm->pm_obj.uo_refs = 1;
+ uvm_objinit(&kpm->pm_obj, NULL, 1);
bzero(&kpm->pm_list, sizeof(kpm->pm_list)); /* pm_list not used */
kpm->pm_pdir = (pd_entry_t *)(proc0.p_addr->u_pcb.pcb_cr3 + KERNBASE);
kpm->pm_pdirpa = (u_int32_t) proc0.p_addr->u_pcb.pcb_cr3;
@@ -1466,11 +1462,7 @@ void
pmap_pinit(struct pmap *pmap)
{
/* init uvm_object */
- simple_lock_init(&pmap->pm_obj.vmobjlock);
- pmap->pm_obj.pgops = NULL; /* currently not a mappable object */
- RB_INIT(&pmap->pm_obj.memt);
- pmap->pm_obj.uo_npages = 0;
- pmap->pm_obj.uo_refs = 1;
+ uvm_objinit(&pmap->pm_obj, NULL, 1);
pmap->pm_stats.wired_count = 0;
pmap->pm_stats.resident_count = 1; /* count the PDP allocd below */
pmap->pm_ptphint = NULL;
diff --git a/sys/dev/pci/drm/drm_drv.c b/sys/dev/pci/drm/drm_drv.c
index 7db9a43153f..17c43a356e7 100644
--- a/sys/dev/pci/drm/drm_drv.c
+++ b/sys/dev/pci/drm/drm_drv.c
@@ -1233,11 +1233,7 @@ drm_gem_object_alloc(struct drm_device *dev, size_t size)
/* uao create can't fail in the 0 case, it just sleeps */
obj->uao = uao_create(size, 0);
obj->size = size;
- simple_lock_init(&obj->uobj.vmobjlock);
- obj->uobj.pgops = &drm_pgops;
- RB_INIT(&obj->uobj.memt);
- obj->uobj.uo_npages = 0;
- obj->uobj.uo_refs = 1;
+ uvm_objinit(&obj->uobj, &drm_pgops, 1);
if (dev->driver->gem_init_object != NULL &&
dev->driver->gem_init_object(obj) != 0) {
diff --git a/sys/kern/vfs_biomem.c b/sys/kern/vfs_biomem.c
index 21e74a75a38..c850b0dba57 100644
--- a/sys/kern/vfs_biomem.c
+++ b/sys/kern/vfs_biomem.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vfs_biomem.c,v 1.13 2010/04/21 03:04:04 deraadt Exp $ */
+/* $OpenBSD: vfs_biomem.c,v 1.14 2010/04/30 21:56:39 oga Exp $ */
/*
* Copyright (c) 2007 Artur Grabowski <art@openbsd.org>
*
@@ -64,10 +64,7 @@ buf_mem_init(vsize_t size)
buf_object = &buf_object_store;
- buf_object->pgops = NULL;
- RB_INIT(&buf_object->memt);
- buf_object->uo_npages = 0;
- buf_object->uo_refs = 1;
+ uvm_objinit(buf_object, NULL, 1);
}
/*
diff --git a/sys/uvm/uvm_aobj.c b/sys/uvm/uvm_aobj.c
index f9caf2a7bbe..dc1fe6c50f5 100644
--- a/sys/uvm/uvm_aobj.c
+++ b/sys/uvm/uvm_aobj.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uvm_aobj.c,v 1.49 2010/04/30 20:50:53 oga Exp $ */
+/* $OpenBSD: uvm_aobj.c,v 1.50 2010/04/30 21:56:39 oga Exp $ */
/* $NetBSD: uvm_aobj.c,v 1.39 2001/02/18 21:19:08 chs Exp $ */
/*
@@ -466,6 +466,7 @@ uao_create(vsize_t size, int flags)
static struct uvm_aobj kernel_object_store; /* home of kernel_object */
static int kobj_alloced = 0; /* not allocated yet */
int pages = round_page(size) >> PAGE_SHIFT;
+ int refs = UVM_OBJ_KERN;
struct uvm_aobj *aobj;
/*
@@ -479,7 +480,6 @@ uao_create(vsize_t size, int flags)
aobj->u_pages = pages;
aobj->u_flags = UAO_FLAG_NOSWAP; /* no swap to start */
/* we are special, we never die */
- aobj->u_obj.uo_refs = UVM_OBJ_KERN;
kobj_alloced = UAO_FLAG_KERNOBJ;
} else if (flags & UAO_FLAG_KERNSWAP) {
aobj = &kernel_object_store;
@@ -490,7 +490,7 @@ uao_create(vsize_t size, int flags)
aobj = pool_get(&uvm_aobj_pool, PR_WAITOK);
aobj->u_pages = pages;
aobj->u_flags = 0; /* normal object */
- aobj->u_obj.uo_refs = 1; /* start with 1 reference */
+ refs = 1; /* normal object so 1 ref */
}
/*
@@ -523,13 +523,7 @@ uao_create(vsize_t size, int flags)
}
}
- /*
- * init aobj fields
- */
- simple_lock_init(&aobj->u_obj.vmobjlock);
- aobj->u_obj.pgops = &aobj_pager;
- RB_INIT(&aobj->u_obj.memt);
- aobj->u_obj.uo_npages = 0;
+ uvm_objinit(&aobj->u_obj, &aobj_pager, refs);
/*
* now that aobj is ready, add it to the global list
diff --git a/sys/uvm/uvm_device.c b/sys/uvm/uvm_device.c
index e1d5c161fd8..e48e4dc60c6 100644
--- a/sys/uvm/uvm_device.c
+++ b/sys/uvm/uvm_device.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uvm_device.c,v 1.37 2009/08/14 16:27:34 oga Exp $ */
+/* $OpenBSD: uvm_device.c,v 1.38 2010/04/30 21:56:39 oga Exp $ */
/* $NetBSD: uvm_device.c,v 1.30 2000/11/25 06:27:59 chs Exp $ */
/*
@@ -230,11 +230,7 @@ udv_attach(void *arg, vm_prot_t accessprot, voff_t off, vsize_t size)
* and return.
*/
- simple_lock_init(&udv->u_obj.vmobjlock);
- udv->u_obj.pgops = &uvm_deviceops;
- RB_INIT(&udv->u_obj.memt);
- udv->u_obj.uo_npages = 0;
- udv->u_obj.uo_refs = 1;
+ uvm_objinit(&udv->u_obj, &uvm_deviceops, 1);
udv->u_flags = 0;
udv->u_device = device;
LIST_INSERT_HEAD(&udv_list, udv, u_list);
diff --git a/sys/uvm/uvm_object.c b/sys/uvm/uvm_object.c
index fdd931f0afe..cc7871b8a5f 100644
--- a/sys/uvm/uvm_object.c
+++ b/sys/uvm/uvm_object.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uvm_object.c,v 1.4 2010/04/21 03:04:49 deraadt Exp $ */
+/* $OpenBSD: uvm_object.c,v 1.5 2010/04/30 21:56:39 oga Exp $ */
/*
* Copyright (c) 2006 The NetBSD Foundation, Inc.
@@ -43,6 +43,18 @@
#define FETCH_PAGECOUNT 16
/*
+ * uvm_objinit: initialise a uvm object.
+ */
+void
+uvm_objinit(struct uvm_object *uobj, struct uvm_pagerops *pgops, int refs)
+{
+ uobj->pgops = pgops;
+ RB_INIT(&uobj->memt);
+ uobj->uo_npages = 0;
+ uobj->uo_refs = refs;
+}
+
+/*
* uvm_objwire: wire the pages of entire uobj
*
* => caller must pass page-aligned start and end values
diff --git a/sys/uvm/uvm_object.h b/sys/uvm/uvm_object.h
index 1b197803125..1ece82c1368 100644
--- a/sys/uvm/uvm_object.h
+++ b/sys/uvm/uvm_object.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: uvm_object.h,v 1.16 2009/11/25 19:11:38 oga Exp $ */
+/* $OpenBSD: uvm_object.h,v 1.17 2010/04/30 21:56:39 oga Exp $ */
/* $NetBSD: uvm_object.h,v 1.11 2001/03/09 01:02:12 chs Exp $ */
/*
@@ -97,7 +97,7 @@ RB_PROTOTYPE(uvm_objtree, vm_page, objt, uvm_pagecmp)
((uobj)->pgops == &uvm_vnodeops && \
((struct vnode *)uobj)->v_flag & VTEXT)
-
+void uvm_objinit(struct uvm_object *, struct uvm_pagerops *, int);
int uvm_objwire(struct uvm_object *, off_t, off_t, struct pglist *);
void uvm_objunwire(struct uvm_object *, off_t, off_t);
diff --git a/sys/uvm/uvm_vnode.c b/sys/uvm/uvm_vnode.c
index 207237eb3a4..a35a6b47770 100644
--- a/sys/uvm/uvm_vnode.c
+++ b/sys/uvm/uvm_vnode.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uvm_vnode.c,v 1.69 2009/08/06 15:28:14 oga Exp $ */
+/* $OpenBSD: uvm_vnode.c,v 1.70 2010/04/30 21:56:39 oga Exp $ */
/* $NetBSD: uvm_vnode.c,v 1.36 2000/11/24 20:34:01 chs Exp $ */
/*
@@ -270,10 +270,7 @@ uvn_attach(void *arg, vm_prot_t accessprot)
/*
* now set up the uvn.
*/
- uvn->u_obj.pgops = &uvm_vnodeops;
- RB_INIT(&uvn->u_obj.memt);
- uvn->u_obj.uo_npages = 0;
- uvn->u_obj.uo_refs = 1; /* just us... */
+ uvm_objinit(&uvn->u_obj, &uvm_vnodeops, 1);
oldflags = uvn->u_flags;
uvn->u_flags = UVM_VNODE_VALID|UVM_VNODE_CANPERSIST;
uvn->u_nio = 0;