commit 2cab4afc48b5b77f052538dceeae8e0f239f7841 Author: Andriy Gapon Date: Fri Oct 5 23:32:39 2012 +0300 [test!] uma: extend uma_init/uma_fini with additional argument ... provided at zone creation time. This argument is also passed to ctor if either uma_zalloc or uma_zalloc_arg with NULL argument are called. The same is true for dtor and uma_free or uma_free_arg with NULL argument. This extends interface almost without sacrificing backward compatibility. There was relatively a few users of uma_init/uma_fini in the tree. ctor/dtor interface could be extended for another argument but that would affect far too many uma users. The new interface is compatible with both traditional freebsd interface and interface found in solaris. diff --git a/sys/kern/kern_mbuf.c b/sys/kern/kern_mbuf.c index 2259aa2..a315903 100644 --- a/sys/kern/kern_mbuf.c +++ b/sys/kern/kern_mbuf.c @@ -285,8 +285,8 @@ static int mb_ctor_pack(void *, int, void *, int); static void mb_dtor_mbuf(void *, int, void *); static void mb_dtor_clust(void *, int, void *); static void mb_dtor_pack(void *, int, void *); -static int mb_zinit_pack(void *, int, int); -static void mb_zfini_pack(void *, int); +static int mb_zinit_pack(void *, int, void *, int); +static void mb_zfini_pack(void *, int, void *); static void mb_reclaim(void *); static void *mbuf_jumbo_alloc(uma_zone_t, int, uint8_t *, int); @@ -623,7 +623,7 @@ mb_dtor_clust(void *mem, int size, void *arg) * object's transition from mbuf keg slab to zone cache. */ static int -mb_zinit_pack(void *mem, int size, int how) +mb_zinit_pack(void *mem, int size, void *arg, int how) { struct mbuf *m; @@ -633,7 +633,7 @@ mb_zinit_pack(void *mem, int size, int how) return (ENOMEM); m->m_ext.ext_type = EXT_PACKET; /* Override. */ #ifdef INVARIANTS - trash_init(m->m_ext.ext_buf, MCLBYTES, how); + trash_init(m->m_ext.ext_buf, MCLBYTES, arg, how); #endif return (0); } @@ -643,13 +643,13 @@ mb_zinit_pack(void *mem, int size, int how) * object's transition from zone cache to keg slab. */ static void -mb_zfini_pack(void *mem, int size) +mb_zfini_pack(void *mem, int size, void *arg) { struct mbuf *m; m = (struct mbuf *)mem; #ifdef INVARIANTS - trash_fini(m->m_ext.ext_buf, MCLBYTES); + trash_fini(m->m_ext.ext_buf, MCLBYTES, arg); #endif uma_zfree_arg(zone_clust, m->m_ext.ext_buf, NULL); #ifdef INVARIANTS diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c index 6c46801..0025199 100644 --- a/sys/kern/kern_proc.c +++ b/sys/kern/kern_proc.c @@ -135,8 +135,8 @@ static void pgadjustjobc(struct pgrp *pgrp, int entering); static void pgdelete(struct pgrp *); static int proc_ctor(void *mem, int size, void *arg, int flags); static void proc_dtor(void *mem, int size, void *arg); -static int proc_init(void *mem, int size, int flags); -static void proc_fini(void *mem, int size); +static int proc_init(void *mem, int size, void *, int flags); +static void proc_fini(void *mem, int size, void *); static void pargs_free(struct pargs *pa); static struct proc *zpfind_locked(pid_t pid); @@ -230,7 +230,7 @@ proc_dtor(void *mem, int size, void *arg) * Initialize type-stable parts of a proc (when newly created). */ static int -proc_init(void *mem, int size, int flags) +proc_init(void *mem, int size, void *arg __unused, int flags) { struct proc *p; @@ -254,7 +254,7 @@ proc_init(void *mem, int size, int flags) * Freeing a proc structure would violate type stability. */ static void -proc_fini(void *mem, int size) +proc_fini(void *mem, int size, void *arg __unused) { #ifdef notnow struct proc *p; diff --git a/sys/kern/kern_thread.c b/sys/kern/kern_thread.c index 5da4866..07957da 100644 --- a/sys/kern/kern_thread.c +++ b/sys/kern/kern_thread.c @@ -198,7 +198,7 @@ thread_dtor(void *mem, int size, void *arg) * Initialize type-stable parts of a thread (when newly created). */ static int -thread_init(void *mem, int size, int flags) +thread_init(void *mem, int size, void *arg __unused, int flags) { struct thread *td; @@ -218,7 +218,7 @@ thread_init(void *mem, int size, int flags) * Tear down type-stable parts of a thread (just before being discarded). */ static void -thread_fini(void *mem, int size) +thread_fini(void *mem, int size, void *arg __unused) { struct thread *td; diff --git a/sys/kern/kern_time.c b/sys/kern/kern_time.c index b68c949..2135953 100644 --- a/sys/kern/kern_time.c +++ b/sys/kern/kern_time.c @@ -83,8 +83,8 @@ static int settime(struct thread *, struct timeval *); static void timevalfix(struct timeval *); static void itimer_start(void); -static int itimer_init(void *, int, int); -static void itimer_fini(void *, int); +static int itimer_init(void *, int, void *, int); +static void itimer_fini(void *, int, void *); static void itimer_enter(struct itimer *); static void itimer_leave(struct itimer *); static struct itimer *itimer_find(struct proc *, int); @@ -1017,7 +1017,7 @@ register_posix_clock(int clockid, struct kclock *clk) } static int -itimer_init(void *mem, int size, int flags) +itimer_init(void *mem, int size, void *arg __unused, int flags) { struct itimer *it; @@ -1027,7 +1027,7 @@ itimer_init(void *mem, int size, int flags) } static void -itimer_fini(void *mem, int size) +itimer_fini(void *mem, int size, void *arg __unused) { struct itimer *it; diff --git a/sys/kern/subr_sleepqueue.c b/sys/kern/subr_sleepqueue.c index 92b5147..39c1c36 100644 --- a/sys/kern/subr_sleepqueue.c +++ b/sys/kern/subr_sleepqueue.c @@ -160,7 +160,7 @@ static int sleepq_check_timeout(void); #ifdef INVARIANTS static void sleepq_dtor(void *mem, int size, void *arg); #endif -static int sleepq_init(void *mem, int size, int flags); +static int sleepq_init(void *mem, int size, void *arg, int flags); static int sleepq_resume_thread(struct sleepqueue *sq, struct thread *td, int pri); static void sleepq_switch(void *wchan, int pri); @@ -789,7 +789,7 @@ sleepq_dtor(void *mem, int size, void *arg) * UMA zone item initializer. */ static int -sleepq_init(void *mem, int size, int flags) +sleepq_init(void *mem, int size, void *arg __unused, int flags) { struct sleepqueue *sq; int i; diff --git a/sys/kern/subr_turnstile.c b/sys/kern/subr_turnstile.c index 98bacb6..002890d 100644 --- a/sys/kern/subr_turnstile.c +++ b/sys/kern/subr_turnstile.c @@ -166,8 +166,8 @@ static void turnstile_setowner(struct turnstile *ts, struct thread *owner); #ifdef INVARIANTS static void turnstile_dtor(void *mem, int size, void *arg); #endif -static int turnstile_init(void *mem, int size, int flags); -static void turnstile_fini(void *mem, int size); +static int turnstile_init(void *mem, int size, void *arg, int flags); +static void turnstile_fini(void *mem, int size, void *arg); SDT_PROVIDER_DECLARE(sched); SDT_PROBE_DEFINE(sched, , , sleep, sleep); @@ -487,7 +487,7 @@ turnstile_dtor(void *mem, int size, void *arg) * UMA zone item initializer. */ static int -turnstile_init(void *mem, int size, int flags) +turnstile_init(void *mem, int size, void *arg __unused, int flags) { struct turnstile *ts; @@ -502,7 +502,7 @@ turnstile_init(void *mem, int size, int flags) } static void -turnstile_fini(void *mem, int size) +turnstile_fini(void *mem, int size, void *arg __unused) { struct turnstile *ts; diff --git a/sys/kern/sys_pipe.c b/sys/kern/sys_pipe.c index 5d0c434..d3c883c 100644 --- a/sys/kern/sys_pipe.c +++ b/sys/kern/sys_pipe.c @@ -237,8 +237,8 @@ static int pipespace(struct pipe *cpipe, int size); static int pipespace_new(struct pipe *cpipe, int size); static int pipe_zone_ctor(void *mem, int size, void *arg, int flags); -static int pipe_zone_init(void *mem, int size, int flags); -static void pipe_zone_fini(void *mem, int size); +static int pipe_zone_init(void *mem, int size, void *arg, int flags); +static void pipe_zone_fini(void *mem, int size, void *arg); static uma_zone_t pipe_zone; static struct unrhdr *pipeino_unr; @@ -309,7 +309,7 @@ pipe_zone_ctor(void *mem, int size, void *arg, int flags) } static int -pipe_zone_init(void *mem, int size, int flags) +pipe_zone_init(void *mem, int size, void *arg __unused, int flags) { struct pipepair *pp; @@ -322,7 +322,7 @@ pipe_zone_init(void *mem, int size, int flags) } static void -pipe_zone_fini(void *mem, int size) +pipe_zone_fini(void *mem, int size, void *arg __unused) { struct pipepair *pp; diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c index 5cf6e4e..a528a05 100644 --- a/sys/kern/vfs_mount.c +++ b/sys/kern/vfs_mount.c @@ -103,7 +103,7 @@ static const char *global_opts[] = { }; static int -mount_init(void *mem, int size, int flags) +mount_init(void *mem, int size, void *arg __unused, int flags) { struct mount *mp; @@ -114,7 +114,7 @@ mount_init(void *mem, int size, int flags) } static void -mount_fini(void *mem, int size) +mount_fini(void *mem, int size, void *arg __unused) { struct mount *mp; diff --git a/sys/netinet/ip_divert.c b/sys/netinet/ip_divert.c index e698035..07adf21 100644 --- a/sys/netinet/ip_divert.c +++ b/sys/netinet/ip_divert.c @@ -130,7 +130,7 @@ div_zone_change(void *tag) } static int -div_inpcb_init(void *mem, int size, int flags) +div_inpcb_init(void *mem, int size, void *arg __unused, int flags) { struct inpcb *inp = mem; @@ -139,7 +139,7 @@ div_inpcb_init(void *mem, int size, int flags) } static void -div_inpcb_fini(void *mem, int size) +div_inpcb_fini(void *mem, int size, void *arg __unused) { struct inpcb *inp = mem; diff --git a/sys/netinet/raw_ip.c b/sys/netinet/raw_ip.c index eddc69e..262b7c6 100644 --- a/sys/netinet/raw_ip.c +++ b/sys/netinet/raw_ip.c @@ -192,7 +192,7 @@ rip_zone_change(void *tag) } static int -rip_inpcb_init(void *mem, int size, int flags) +rip_inpcb_init(void *mem, int size, void *arg __unused, int flags) { struct inpcb *inp = mem; diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c index 24e4db2..92ec5d8 100644 --- a/sys/netinet/tcp_subr.c +++ b/sys/netinet/tcp_subr.c @@ -274,7 +274,7 @@ tcp_zone_change(void *tag) } static int -tcp_inpcb_init(void *mem, int size, int flags) +tcp_inpcb_init(void *mem, int size, void *arg __unused, int flags) { struct inpcb *inp = mem; diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c index b6297dc..fe0a7ae 100644 --- a/sys/netinet/udp_usrreq.c +++ b/sys/netinet/udp_usrreq.c @@ -172,7 +172,7 @@ udp_zone_change(void *tag) } static int -udp_inpcb_init(void *mem, int size, int flags) +udp_inpcb_init(void *mem, int size, void *arg __unused, int flags) { struct inpcb *inp; diff --git a/sys/vm/uma.h b/sys/vm/uma.h index 2569b88..66e0cc2 100644 --- a/sys/vm/uma.h +++ b/sys/vm/uma.h @@ -104,7 +104,7 @@ typedef void (*uma_dtor)(void *mem, int size, void *arg); * The initializer and the destructor should leave the object in the same * state. */ -typedef int (*uma_init)(void *mem, int size, int flags); +typedef int (*uma_init)(void *mem, int size, void *arg, int flags); /* * Item discard function @@ -121,7 +121,7 @@ typedef int (*uma_init)(void *mem, int size, int flags); * This routine is called when memory leaves a zone and is returned to the * system for other uses. It is the counter-part to the init function. */ -typedef void (*uma_fini)(void *mem, int size); +typedef void (*uma_fini)(void *mem, int size, void *arg); /* * What's the difference between initializing and constructing? @@ -157,6 +157,8 @@ typedef void (*uma_fini)(void *mem, int size); * init An initializer that sets up the initial state of the memory. * fini A discard function that undoes initialization done by init. * ctor/dtor/init/fini may all be null, see notes above. + * arg An argument that is passed to init and fini and optionally + * to ctor/dtor. * align A bitmask that corresponds to the requested alignment * eg 4 would be 0x3 * flags A set of parameters that control the behavior of the zone. @@ -169,6 +171,10 @@ uma_zone_t uma_zcreate(const char *name, size_t size, uma_ctor ctor, uma_dtor dtor, uma_init uminit, uma_fini fini, int align, u_int32_t flags); +uma_zone_t uma_zcreate_arg(const char *name, size_t size, uma_ctor ctor, uma_dtor dtor, + uma_init uminit, uma_fini fini, void *arg, int align, + u_int32_t flags); + /* * Create a secondary uma zone * @@ -181,6 +187,8 @@ uma_zone_t uma_zcreate(const char *name, size_t size, uma_ctor ctor, * as the object passes from the Keg's slab to the Zone's cache. * zfini A discard function that undoes initialization done by init * as the object passes from the Zone's cache to the Keg's slab. + * arg An argument that is passed to zinit and zfini and optionally + * to ctor/dtor. * * ctor/dtor/zinit/zfini may all be null, see notes above. * Note that the zinit and zfini specified here are NOT @@ -204,6 +212,10 @@ uma_zone_t uma_zcreate(const char *name, size_t size, uma_ctor ctor, uma_zone_t uma_zsecond_create(char *name, uma_ctor ctor, uma_dtor dtor, uma_init zinit, uma_fini zfini, uma_zone_t master); +uma_zone_t uma_zsecond_create_arg(char *name, uma_ctor ctor, uma_dtor dtor, + uma_init zinit, uma_fini zfini, void *arg, + uma_zone_t master); + /* * Add a second master to a secondary zone. This provides multiple data * backends for objects with the same size. Both masters must have diff --git a/sys/vm/uma_core.c b/sys/vm/uma_core.c index b1fd442..b2b540f 100644 --- a/sys/vm/uma_core.c +++ b/sys/vm/uma_core.c @@ -170,6 +170,7 @@ struct uma_zctor_args { uma_keg_t keg; int align; u_int32_t flags; + void *arg; }; struct uma_kctor_args { @@ -179,6 +180,7 @@ struct uma_kctor_args { uma_fini fini; int align; u_int32_t flags; + void *arg; }; struct uma_bucket_zone { @@ -231,7 +233,7 @@ static int keg_ctor(void *, int, void *, int); static void keg_dtor(void *, int, void *); static int zone_ctor(void *, int, void *, int); static void zone_dtor(void *, int, void *); -static int zero_init(void *, int, int); +static int zero_init(void *, int, void *, int); static void keg_small_init(uma_keg_t keg); static void keg_large_init(uma_keg_t keg); static void zone_foreach(void (*zfunc)(uma_zone_t)); @@ -254,7 +256,7 @@ static uma_slab_t zone_fetch_slab(uma_zone_t zone, uma_keg_t last, int flags); static uma_slab_t zone_fetch_slab_multi(uma_zone_t zone, uma_keg_t last, int flags); static void *slab_alloc_item(uma_zone_t zone, uma_slab_t slab); static uma_keg_t uma_kcreate(uma_zone_t zone, size_t size, uma_init uminit, - uma_fini fini, int align, u_int32_t flags); + uma_fini fini, void *arg, int align, u_int32_t flags); static inline void zone_relock(uma_zone_t zone, uma_keg_t keg); static inline void keg_relock(uma_keg_t keg, uma_zone_t zone); @@ -794,7 +796,7 @@ finished: for (i = 0; i < keg->uk_ipers; i++) keg->uk_fini( slab->us_data + (keg->uk_rsize * i), - keg->uk_size); + keg->uk_size, keg->uk_arg); flags = slab->us_flags; mem = slab->us_data; @@ -955,14 +957,14 @@ keg_alloc_slab(uma_keg_t keg, uma_zone_t zone, int wait) if (keg->uk_init != NULL) { for (i = 0; i < keg->uk_ipers; i++) if (keg->uk_init(slab->us_data + (keg->uk_rsize * i), - keg->uk_size, wait) != 0) + keg->uk_size, keg->uk_arg, wait) != 0) break; if (i != keg->uk_ipers) { if (keg->uk_fini != NULL) { for (i--; i > -1; i--) keg->uk_fini(slab->us_data + (keg->uk_rsize * i), - keg->uk_size); + keg->uk_size, keg->uk_arg); } if (keg->uk_flags & UMA_ZONE_VTOSLAB) { vm_object_t obj; @@ -1168,7 +1170,7 @@ page_free(void *mem, int size, u_int8_t flags) * Arguments/Returns follow uma_init specifications */ static int -zero_init(void *mem, int size, int flags) +zero_init(void *mem, int size, void *arg, int flags) { bzero(mem, size); return (0); @@ -1337,6 +1339,7 @@ keg_ctor(void *mem, int size, void *udata, int flags) keg->uk_size = arg->size; keg->uk_init = arg->uminit; keg->uk_fini = arg->fini; + keg->uk_arg = arg->arg; keg->uk_align = arg->align; keg->uk_free = 0; keg->uk_pages = 0; @@ -1501,6 +1504,7 @@ zone_ctor(void *mem, int size, void *udata, int flags) zone->uz_slab = zone_fetch_slab; zone->uz_init = NULL; zone->uz_fini = NULL; + zone->uz_arg = NULL; zone->uz_allocs = 0; zone->uz_frees = 0; zone->uz_fails = 0; @@ -1515,6 +1519,7 @@ zone_ctor(void *mem, int size, void *udata, int flags) KASSERT(arg->keg != NULL, ("Secondary zone on zero'd keg")); zone->uz_init = arg->uminit; zone->uz_fini = arg->fini; + zone->uz_arg = arg->arg; zone->uz_lock = &keg->uk_lock; zone->uz_flags |= UMA_ZONE_SECONDARY; mtx_lock(&uma_mtx); @@ -1529,7 +1534,7 @@ zone_ctor(void *mem, int size, void *udata, int flags) mtx_unlock(&uma_mtx); } else if (keg == NULL) { if ((keg = uma_kcreate(zone, arg->size, arg->uminit, arg->fini, - arg->align, arg->flags)) == NULL) + arg->arg, arg->align, arg->flags)) == NULL) return (ENOMEM); } else { struct uma_kctor_args karg; @@ -1538,6 +1543,7 @@ zone_ctor(void *mem, int size, void *udata, int flags) /* We should only be here from uma_startup() */ karg.size = arg->size; karg.uminit = arg->uminit; + karg.arg = arg->arg; karg.fini = arg->fini; karg.align = arg->align; karg.flags = arg->flags; @@ -1780,6 +1786,7 @@ uma_startup(void *bootmem, int boot_pages) args.dtor = keg_dtor; args.uminit = zero_init; args.fini = NULL; + args.arg = NULL; args.keg = &masterkeg; args.align = 32 - 1; args.flags = UMA_ZFLAG_INTERNAL; @@ -1807,6 +1814,7 @@ uma_startup(void *bootmem, int boot_pages) args.dtor = zone_dtor; args.uminit = zero_init; args.fini = NULL; + args.arg = NULL; args.keg = NULL; args.align = 32 - 1; args.flags = UMA_ZFLAG_INTERNAL; @@ -1890,13 +1898,14 @@ uma_startup3(void) static uma_keg_t uma_kcreate(uma_zone_t zone, size_t size, uma_init uminit, uma_fini fini, - int align, u_int32_t flags) + void *arg, int align, u_int32_t flags) { struct uma_kctor_args args; args.size = size; args.uminit = uminit; args.fini = fini; + args.arg = arg; args.align = (align == UMA_ALIGN_CACHE) ? uma_align_cache : align; args.flags = flags; args.zone = zone; @@ -1916,7 +1925,15 @@ uma_set_align(int align) uma_zone_t uma_zcreate(const char *name, size_t size, uma_ctor ctor, uma_dtor dtor, uma_init uminit, uma_fini fini, int align, u_int32_t flags) +{ + + return (uma_zcreate_arg(name, size, ctor, dtor, uminit, fini, NULL, + align, flags)); +} +uma_zone_t +uma_zcreate_arg(const char *name, size_t size, uma_ctor ctor, uma_dtor dtor, + uma_init uminit, uma_fini fini, void *arg, int align, u_int32_t flags) { struct uma_zctor_args args; @@ -1927,6 +1944,7 @@ uma_zcreate(const char *name, size_t size, uma_ctor ctor, uma_dtor dtor, args.dtor = dtor; args.uminit = uminit; args.fini = fini; + args.arg = arg; args.align = align; args.flags = flags; args.keg = NULL; @@ -1939,6 +1957,15 @@ uma_zone_t uma_zsecond_create(char *name, uma_ctor ctor, uma_dtor dtor, uma_init zinit, uma_fini zfini, uma_zone_t master) { + + return (uma_zsecond_create_arg(name, ctor, dtor, zinit, zfini, NULL, + master)); +} + +uma_zone_t +uma_zsecond_create_arg(char *name, uma_ctor ctor, uma_dtor dtor, + uma_init zinit, uma_fini zfini, void *arg, uma_zone_t master) +{ struct uma_zctor_args args; uma_keg_t keg; @@ -1949,6 +1976,7 @@ uma_zsecond_create(char *name, uma_ctor ctor, uma_dtor dtor, args.dtor = dtor; args.uminit = zinit; args.fini = zfini; + args.arg = arg; args.align = keg->uk_align; args.flags = keg->uk_flags | UMA_ZONE_SECONDARY; args.keg = keg; @@ -2060,6 +2088,9 @@ uma_zalloc_arg(uma_zone_t zone, void *udata, int flags) uma_bucket_t bucket; int cpu; + if (udata == NULL) + udata = zone->uz_arg; + /* This is the fast path allocation */ #ifdef UMA_DEBUG_ALLOC_1 printf("Allocating one item from %s(%p)\n", zone->uz_name, zone); @@ -2081,12 +2112,12 @@ uma_zalloc_arg(uma_zone_t zone, void *udata, int flags) */ if (zone->uz_init != NULL && zone->uz_init != mtrash_init && - zone->uz_init(item, zone->uz_size, flags) != 0) + zone->uz_init(item, zone->uz_size, zone->uz_arg, flags) != 0) return (NULL); if (zone->uz_ctor != NULL && zone->uz_ctor != mtrash_ctor && zone->uz_ctor(item, zone->uz_size, udata, flags) != 0) { - zone->uz_fini(item, zone->uz_size); + zone->uz_fini(item, zone->uz_size, zone->uz_arg); return (NULL); } return (item); @@ -2551,7 +2582,7 @@ zone_alloc_bucket(uma_zone_t zone, int flags) ZONE_UNLOCK(zone); for (i = saved; i < bucket->ub_cnt; i++) if (zone->uz_init(bucket->ub_bucket[i], zone->uz_size, - origflags) != 0) + zone->uz_arg, origflags) != 0) break; /* * If we couldn't initialize the whole bucket, put the @@ -2631,7 +2662,7 @@ zone_alloc_item(uma_zone_t zone, void *udata, int flags) * to be both zone-init'd as well as zone-ctor'd. */ if (zone->uz_init != NULL) { - if (zone->uz_init(item, zone->uz_size, flags) != 0) { + if (zone->uz_init(item, zone->uz_size, zone->uz_arg, flags) != 0) { zone_free_item(zone, item, udata, SKIP_FINI, ZFREE_STATFAIL | ZFREE_STATFREE); return (NULL); @@ -2668,12 +2699,14 @@ uma_zfree_arg(uma_zone_t zone, void *item, void *udata) /* uma_zfree(..., NULL) does nothing, to match free(9). */ if (item == NULL) return; + if (udata == NULL) + udata = zone->uz_arg; #ifdef DEBUG_MEMGUARD if (is_memguard_addr(item)) { if (zone->uz_dtor != NULL && zone->uz_dtor != mtrash_dtor) zone->uz_dtor(item, zone->uz_size, udata); if (zone->uz_fini != NULL && zone->uz_fini != mtrash_fini) - zone->uz_fini(item, zone->uz_size); + zone->uz_fini(item, zone->uz_size, zone->uz_arg); memguard_free(item); return; } @@ -2862,7 +2895,7 @@ zone_free_item(uma_zone_t zone, void *item, void *udata, zone->uz_dtor(item, zone->uz_size, udata); if (skip < SKIP_FINI && zone->uz_fini) - zone->uz_fini(item, zone->uz_size); + zone->uz_fini(item, zone->uz_size, zone->uz_arg); ZONE_LOCK(zone); diff --git a/sys/vm/uma_dbg.c b/sys/vm/uma_dbg.c index ade5fb5..a8fea15 100644 --- a/sys/vm/uma_dbg.c +++ b/sys/vm/uma_dbg.c @@ -100,7 +100,7 @@ trash_dtor(void *mem, int size, void *arg) * */ int -trash_init(void *mem, int size, int flags) +trash_init(void *mem, int size, void *arg, int flags) { trash_dtor(mem, size, NULL); return (0); @@ -113,7 +113,7 @@ trash_init(void *mem, int size, int flags) * */ void -trash_fini(void *mem, int size) +trash_fini(void *mem, int size, void *arg) { (void)trash_ctor(mem, size, NULL, 0); } @@ -166,7 +166,7 @@ mtrash_dtor(void *mem, int size, void *arg) * */ int -mtrash_init(void *mem, int size, int flags) +mtrash_init(void *mem, int size, void *arg, int flags) { struct malloc_type **ksp; @@ -186,7 +186,7 @@ mtrash_init(void *mem, int size, int flags) * */ void -mtrash_fini(void *mem, int size) +mtrash_fini(void *mem, int size, void *arg) { (void)mtrash_ctor(mem, size, NULL, 0); } diff --git a/sys/vm/uma_dbg.h b/sys/vm/uma_dbg.h index 341cecb..2aa38bd 100644 --- a/sys/vm/uma_dbg.h +++ b/sys/vm/uma_dbg.h @@ -40,14 +40,14 @@ int trash_ctor(void *mem, int size, void *arg, int flags); void trash_dtor(void *mem, int size, void *arg); -int trash_init(void *mem, int size, int flags); -void trash_fini(void *mem, int size); +int trash_init(void *mem, int size, void *arg, int flags); +void trash_fini(void *mem, int size, void *arg); /* For use only by malloc */ int mtrash_ctor(void *mem, int size, void *arg, int flags); void mtrash_dtor(void *mem, int size, void *arg); -int mtrash_init(void *mem, int size, int flags); -void mtrash_fini(void *mem, int size); +int mtrash_init(void *mem, int size, void *arg, int flags); +void mtrash_fini(void *mem, int size, void *arg); void uma_dbg_free(uma_zone_t zone, uma_slab_t slab, void *item); void uma_dbg_alloc(uma_zone_t zone, uma_slab_t slab, void *item); diff --git a/sys/vm/uma_int.h b/sys/vm/uma_int.h index a0dc0bb..8423ee5 100644 --- a/sys/vm/uma_int.h +++ b/sys/vm/uma_int.h @@ -221,6 +221,8 @@ struct uma_keg { uma_alloc uk_allocf; /* Allocation function */ uma_free uk_freef; /* Free routine */ + void *uk_arg; /* arg for uk_init/uk_fini */ + u_long uk_offset; /* Next free offset from base KVA */ vm_offset_t uk_kva; /* Zone base KVA */ uma_zone_t uk_slabzone; /* Slab zone backing us, if OFFPAGE */ @@ -321,6 +323,8 @@ struct uma_zone { uma_init uz_init; /* Initializer for each item */ uma_fini uz_fini; /* Discards memory */ + void *uz_arg; /* Argument for uz_init/uz_fini */ + u_int32_t uz_flags; /* Flags inherited from kegs */ u_int32_t uz_size; /* Size inherited from kegs */ diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c index 72d3983..a9a5f92 100644 --- a/sys/vm/vm_map.c +++ b/sys/vm/vm_map.c @@ -126,10 +126,10 @@ static uma_zone_t mapentzone; static uma_zone_t kmapentzone; static uma_zone_t mapzone; static uma_zone_t vmspace_zone; -static int vmspace_zinit(void *mem, int size, int flags); -static void vmspace_zfini(void *mem, int size); -static int vm_map_zinit(void *mem, int ize, int flags); -static void vm_map_zfini(void *mem, int size); +static int vmspace_zinit(void *mem, int size, void *arg, int flags); +static void vmspace_zfini(void *mem, int size, void *arg); +static int vm_map_zinit(void *mem, int size, void *arg, int flags); +static void vm_map_zfini(void *mem, int size, void *arg); static void _vm_map_init(vm_map_t map, pmap_t pmap, vm_offset_t min, vm_offset_t max); static void vm_map_entry_deallocate(vm_map_entry_t entry, boolean_t system_map); @@ -203,28 +203,28 @@ vm_map_startup(void) } static void -vmspace_zfini(void *mem, int size) +vmspace_zfini(void *mem, int size, void *arg) { struct vmspace *vm; vm = (struct vmspace *)mem; - vm_map_zfini(&vm->vm_map, sizeof(vm->vm_map)); + vm_map_zfini(&vm->vm_map, sizeof(vm->vm_map), arg); } static int -vmspace_zinit(void *mem, int size, int flags) +vmspace_zinit(void *mem, int size, void *arg, int flags) { struct vmspace *vm; vm = (struct vmspace *)mem; vm->vm_map.pmap = NULL; - (void)vm_map_zinit(&vm->vm_map, sizeof(vm->vm_map), flags); + (void)vm_map_zinit(&vm->vm_map, sizeof(vm->vm_map), arg, flags); return (0); } static void -vm_map_zfini(void *mem, int size) +vm_map_zfini(void *mem, int size, void *arg) { vm_map_t map; @@ -234,7 +234,7 @@ vm_map_zfini(void *mem, int size) } static int -vm_map_zinit(void *mem, int size, int flags) +vm_map_zinit(void *mem, int size, void *arg, int flags) { vm_map_t map; diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c index f003335..3b43f72 100644 --- a/sys/vm/vm_object.c +++ b/sys/vm/vm_object.c @@ -155,7 +155,7 @@ SYSCTL_LONG(_vm_stats_object, OID_AUTO, bypasses, CTLFLAG_RD, static uma_zone_t obj_zone; -static int vm_object_zinit(void *mem, int size, int flags); +static int vm_object_zinit(void *mem, int size, void *arg, int flags); #ifdef INVARIANTS static void vm_object_zdtor(void *mem, int size, void *arg); @@ -191,7 +191,7 @@ vm_object_zdtor(void *mem, int size, void *arg) #endif static int -vm_object_zinit(void *mem, int size, int flags) +vm_object_zinit(void *mem, int size, void *arg, int flags) { vm_object_t object; diff --git a/sys/vm/vm_radix.c b/sys/vm/vm_radix.c index 61e3a2b..89186ce 100644 --- a/sys/vm/vm_radix.c +++ b/sys/vm/vm_radix.c @@ -357,7 +357,8 @@ vm_radix_node_zone_dtor(void *mem, int size __unused, void *arg __unused) * Radix node zone initializer. */ static int -vm_radix_node_zone_init(void *mem, int size __unused, int flags __unused) +vm_radix_node_zone_init(void *mem, int size __unused, void *arg __unused, + int flags __unused) { struct vm_radix_node *rnode;