summaryrefslogtreecommitdiffstats
path: root/sys/cddl
diff options
context:
space:
mode:
authormarkj <markj@FreeBSD.org>2013-12-30 17:37:32 +0000
committermarkj <markj@FreeBSD.org>2013-12-30 17:37:32 +0000
commit27bf80971b2838a6a0a65f9c11927dfe3fcda189 (patch)
tree70ad7500f265d7f9f7517cad975acaebfe653285 /sys/cddl
parent0fb3399e1ca6bbc5b6ebcbfbbc522a59534cc07d (diff)
downloadFreeBSD-src-27bf80971b2838a6a0a65f9c11927dfe3fcda189.zip
FreeBSD-src-27bf80971b2838a6a0a65f9c11927dfe3fcda189.tar.gz
Now that vmem(9) is available, use vmem arenas to allocate probe and
aggregation IDs, as is done in the upstream illumos code. This still requires some FreeBSD-specific code, as our vmem API is not identical to the one in illumos. Submitted by: Mike Ma <mikemandarine@gmail.com>
Diffstat (limited to 'sys/cddl')
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c37
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/sys/dtrace_impl.h4
-rw-r--r--sys/cddl/dev/dtrace/dtrace_load.c5
-rw-r--r--sys/cddl/dev/dtrace/dtrace_unload.c2
4 files changed, 26 insertions, 22 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c b/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
index f35cf73..e1d6950 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
@@ -206,12 +206,11 @@ const char dtrace_zero[256] = { 0 }; /* zero-filled memory */
#if defined(sun)
static dev_info_t *dtrace_devi; /* device info */
#endif
-#if defined(sun)
static vmem_t *dtrace_arena; /* probe ID arena */
+#if defined(sun)
static vmem_t *dtrace_minor; /* minor number arena */
#else
static taskq_t *dtrace_taskq; /* task queue */
-static struct unrhdr *dtrace_arena; /* Probe ID number. */
#endif
static dtrace_probe_t **dtrace_probes; /* array of all probes */
static int dtrace_nprobes; /* number of probes */
@@ -7832,7 +7831,7 @@ dtrace_unregister(dtrace_provider_id_t id)
#if defined(sun)
vmem_free(dtrace_arena, (void *)(uintptr_t)(probe->dtpr_id), 1);
#else
- free_unr(dtrace_arena, probe->dtpr_id);
+ vmem_free(dtrace_arena, (vmem_addr_t)(probe->dtpr_id), 1);
#endif
kmem_free(probe, sizeof (dtrace_probe_t));
}
@@ -7953,7 +7952,7 @@ dtrace_condense(dtrace_provider_id_t id)
#if defined(sun)
vmem_free(dtrace_arena, (void *)((uintptr_t)i + 1), 1);
#else
- free_unr(dtrace_arena, i + 1);
+ vmem_free(dtrace_arena, (vmem_addr_t)i + 1, 1);
#endif
}
@@ -7983,6 +7982,9 @@ dtrace_probe_create(dtrace_provider_id_t prov, const char *mod,
dtrace_probe_t *probe, **probes;
dtrace_provider_t *provider = (dtrace_provider_t *)prov;
dtrace_id_t id;
+#if !defined(sun)
+ vmem_addr_t addr;
+#endif
if (provider == dtrace_provider) {
ASSERT(MUTEX_HELD(&dtrace_lock));
@@ -7992,9 +7994,10 @@ dtrace_probe_create(dtrace_provider_id_t prov, const char *mod,
#if defined(sun)
id = (dtrace_id_t)(uintptr_t)vmem_alloc(dtrace_arena, 1,
- VM_BESTFIT | VM_SLEEP);
+ VM_BESTFIT | VM_WAITOK);
#else
- id = alloc_unr(dtrace_arena);
+ vmem_alloc(dtrace_arena, 1, M_BESTFIT | M_WAITOK, &addr);
+ id = (dtrace_id_t)addr;
#endif
probe = kmem_zalloc(sizeof (dtrace_probe_t), KM_SLEEP);
@@ -10045,6 +10048,9 @@ dtrace_ecb_aggregation_create(dtrace_ecb_t *ecb, dtrace_actdesc_t *desc)
dtrace_recdesc_t *frec;
dtrace_aggid_t aggid;
dtrace_state_t *state = ecb->dte_state;
+#if !defined(sun)
+ vmem_addr_t addr;
+#endif
agg = kmem_zalloc(sizeof (dtrace_aggregation_t), KM_SLEEP);
agg->dtag_ecb = ecb;
@@ -10184,7 +10190,8 @@ success:
aggid = (dtrace_aggid_t)(uintptr_t)vmem_alloc(state->dts_aggid_arena, 1,
VM_BESTFIT | VM_SLEEP);
#else
- aggid = alloc_unr(state->dts_aggid_arena);
+ vmem_alloc(state->dts_aggid_arena, 1, M_BESTFIT | M_WAITOK, &addr);
+ aggid = (dtrace_aggid_t)addr;
#endif
if (aggid - 1 >= state->dts_naggregations) {
@@ -10237,7 +10244,7 @@ dtrace_ecb_aggregation_destroy(dtrace_ecb_t *ecb, dtrace_action_t *act)
#if defined(sun)
vmem_free(state->dts_aggid_arena, (void *)(uintptr_t)aggid, 1);
#else
- free_unr(state->dts_aggid_arena, aggid);
+ vmem_free(state->dts_aggid_arena, (vmem_addr_t)aggid, 1);
#endif
ASSERT(state->dts_aggregations[aggid - 1] == agg);
@@ -13205,7 +13212,7 @@ dtrace_state_create(struct cdev *dev)
if (dev != NULL) {
cr = dev->si_cred;
m = dev2unit(dev);
- }
+ }
/* Allocate memory for the state. */
state = kmem_zalloc(sizeof(dtrace_state_t), KM_SLEEP);
@@ -13217,7 +13224,12 @@ dtrace_state_create(struct cdev *dev)
#if defined(sun)
state->dts_aggid_arena = vmem_create(c, (void *)1, UINT32_MAX, 1,
NULL, NULL, NULL, 0, VM_SLEEP | VMC_IDENTIFIER);
+#else
+ state->dts_aggid_arena = vmem_create(c, (vmem_addr_t)1, UINT32_MAX, 1,
+ 0, M_WAITOK);
+#endif
+#if defined(sun)
if (devp != NULL) {
major = getemajor(*devp);
} else {
@@ -13229,7 +13241,6 @@ dtrace_state_create(struct cdev *dev)
if (devp != NULL)
*devp = state->dts_dev;
#else
- state->dts_aggid_arena = new_unrhdr(1, INT_MAX, &dtrace_unr_mtx);
state->dts_dev = dev;
#endif
@@ -14036,11 +14047,7 @@ dtrace_state_destroy(dtrace_state_t *state)
dtrace_format_destroy(state);
if (state->dts_aggid_arena != NULL) {
-#if defined(sun)
vmem_destroy(state->dts_aggid_arena);
-#else
- delete_unrhdr(state->dts_aggid_arena);
-#endif
state->dts_aggid_arena = NULL;
}
#if defined(sun)
@@ -15375,7 +15382,7 @@ dtrace_module_unloaded(modctl_t *ctl, int *error)
#if defined(sun)
vmem_free(dtrace_arena, (void *)(uintptr_t)probe->dtpr_id, 1);
#else
- free_unr(dtrace_arena, probe->dtpr_id);
+ vmem_free(dtrace_arena, (vmem_addr_t)probe->dtpr_id, 1);
#endif
kmem_free(probe, sizeof (dtrace_probe_t));
}
diff --git a/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace_impl.h b/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace_impl.h
index 7355aa8..3804122 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace_impl.h
+++ b/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace_impl.h
@@ -1139,11 +1139,7 @@ struct dtrace_state {
int dts_nspeculations; /* number of speculations */
int dts_naggregations; /* number of aggregations */
dtrace_aggregation_t **dts_aggregations; /* aggregation array */
-#if defined(sun)
vmem_t *dts_aggid_arena; /* arena for aggregation IDs */
-#else
- struct unrhdr *dts_aggid_arena; /* arena for aggregation IDs */
-#endif
uint64_t dts_errors; /* total number of errors */
uint32_t dts_speculations_busy; /* number of spec. busy */
uint32_t dts_speculations_unavail; /* number of spec unavail */
diff --git a/sys/cddl/dev/dtrace/dtrace_load.c b/sys/cddl/dev/dtrace/dtrace_load.c
index 5d59a04..d67f6b6 100644
--- a/sys/cddl/dev/dtrace/dtrace_load.c
+++ b/sys/cddl/dev/dtrace/dtrace_load.c
@@ -58,6 +58,9 @@ dtrace_load(void *dummy)
dtrace_taskq = taskq_create("dtrace_taskq", 1, maxclsyspri, 0, 0, 0);
+ dtrace_arena = vmem_create("dtrace", 1, UINT32_MAX, 1, 0,
+ M_WAITOK | M_BESTFIT);
+
/* Register callbacks for linker file load and unload events. */
dtrace_kld_load_tag = EVENTHANDLER_REGISTER(kld_load,
dtrace_kld_load, NULL, EVENTHANDLER_PRI_ANY);
@@ -85,8 +88,6 @@ dtrace_load(void *dummy)
ASSERT(MUTEX_HELD(&cpu_lock));
- dtrace_arena = new_unrhdr(1, INT_MAX, &dtrace_unr_mtx);
-
dtrace_state_cache = kmem_cache_create("dtrace_state_cache",
sizeof (dtrace_dstate_percpu_t) * NCPU, DTRACE_STATE_ALIGN,
NULL, NULL, NULL, NULL, NULL, 0);
diff --git a/sys/cddl/dev/dtrace/dtrace_unload.c b/sys/cddl/dev/dtrace/dtrace_unload.c
index 41b7538..79d9ec1 100644
--- a/sys/cddl/dev/dtrace/dtrace_unload.c
+++ b/sys/cddl/dev/dtrace/dtrace_unload.c
@@ -104,7 +104,7 @@ dtrace_unload()
kmem_cache_destroy(dtrace_state_cache);
- delete_unrhdr(dtrace_arena);
+ vmem_destroy(dtrace_arena);
if (dtrace_toxrange != NULL) {
kmem_free(dtrace_toxrange, 0);
OpenPOWER on IntegriCloud