diff options
author | 2010-04-30 21:56:39 +0000 | |
---|---|---|
committer | 2010-04-30 21:56:39 +0000 | |
commit | ca0f98fe9754cf4fac9870df0f9d237a2ef52760 (patch) | |
tree | c26e7a686050c272451f2d6dc432e252486aae20 | |
parent | Prevent a possible case of lock recursion in swapoff. (diff) | |
download | wireguard-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.c | 12 | ||||
-rw-r--r-- | sys/arch/hppa/hppa/pmap.c | 14 | ||||
-rw-r--r-- | sys/arch/i386/i386/pmap.c | 14 | ||||
-rw-r--r-- | sys/dev/pci/drm/drm_drv.c | 6 | ||||
-rw-r--r-- | sys/kern/vfs_biomem.c | 7 | ||||
-rw-r--r-- | sys/uvm/uvm_aobj.c | 14 | ||||
-rw-r--r-- | sys/uvm/uvm_device.c | 8 | ||||
-rw-r--r-- | sys/uvm/uvm_object.c | 14 | ||||
-rw-r--r-- | sys/uvm/uvm_object.h | 4 | ||||
-rw-r--r-- | sys/uvm/uvm_vnode.c | 7 |
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; |