[CFT] Use vmem in dtrace

Mike Ma mikemandarine at gmail.com
Fri Dec 13 07:17:08 UTC 2013


Hi there,

I'm a GSoC student this year, and Pedro guided me to dtrace recently.

I'm sending my patch for a vmem task listed in the TODO list (12th item),
as there is vmem subsystem in FreeBSD 10/11 available now.
Basically, it is to revert changes from this patch
http://lists.freebsd.org/pipermail/p4-projects/2008-January/023466.html
And the main difference is that vmem_create and vmem_alloc take different
number of parameters on FreeBSD.

I did run dtrace testsuite on my own machine.
And I hope someone here can try my patch.

Any comments are appreciated.
Thanks.

Cheers,
Mike


-- 
Cheers,
Mike
-------------- next part --------------
Index: sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
===================================================================
--- sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c	(revision 257743)
+++ sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c	(working copy)
@@ -211,7 +211,7 @@
 static vmem_t		*dtrace_minor;		/* minor number arena */
 #else
 static taskq_t		*dtrace_taskq;		/* task queue */
-static struct unrhdr	*dtrace_arena;		/* Probe ID number.     */
+static vmem_t		*dtrace_arena;		/* probe ID arena */
 #endif
 static dtrace_probe_t	**dtrace_probes;	/* array of all probes */
 static int		dtrace_nprobes;		/* number of probes */
@@ -7829,11 +7829,7 @@
 		kmem_free(probe->dtpr_mod, strlen(probe->dtpr_mod) + 1);
 		kmem_free(probe->dtpr_func, strlen(probe->dtpr_func) + 1);
 		kmem_free(probe->dtpr_name, strlen(probe->dtpr_name) + 1);
-#if defined(sun)
-		vmem_free(dtrace_arena, (void *)(uintptr_t)(probe->dtpr_id), 1);
-#else
-		free_unr(dtrace_arena, probe->dtpr_id);
-#endif
+		vmem_free(dtrace_arena, (vmem_addr_t)(probe->dtpr_id), 1);
 		kmem_free(probe, sizeof (dtrace_probe_t));
 	}
 
@@ -7950,11 +7946,7 @@
 		kmem_free(probe->dtpr_func, strlen(probe->dtpr_func) + 1);
 		kmem_free(probe->dtpr_name, strlen(probe->dtpr_name) + 1);
 		kmem_free(probe, sizeof (dtrace_probe_t));
-#if defined(sun)
-		vmem_free(dtrace_arena, (void *)((uintptr_t)i + 1), 1);
-#else
-		free_unr(dtrace_arena, i + 1);
-#endif
+		vmem_free(dtrace_arena, (vmem_addr_t)i + 1, 1);
 	}
 
 	mutex_exit(&dtrace_lock);
@@ -7990,12 +7982,8 @@
 		mutex_enter(&dtrace_lock);
 	}
 
-#if defined(sun)
-	id = (dtrace_id_t)(uintptr_t)vmem_alloc(dtrace_arena, 1,
-	    VM_BESTFIT | VM_SLEEP);
-#else
-	id = alloc_unr(dtrace_arena);
-#endif
+	id = (dtrace_id_t)vmem_alloc(dtrace_arena, 1,
+								 M_BESTFIT | M_WAITOK, NULL);
 	probe = kmem_zalloc(sizeof (dtrace_probe_t), KM_SLEEP);
 
 	probe->dtpr_id = id;
@@ -10184,7 +10172,8 @@
 	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);
+	aggid = (dtrace_aggid_t)(uintptr_t)vmem_alloc(state->dts_aggid_arena, 1,
+												  M_BESTFIT | M_WAITOK, NULL);
 #endif
 
 	if (aggid - 1 >= state->dts_naggregations) {
@@ -10237,7 +10226,7 @@
 #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);
@@ -13211,10 +13200,10 @@
 	state = kmem_zalloc(sizeof(dtrace_state_t), KM_SLEEP);
 #endif
 
+#if defined(sun)
 	state->dts_epid = DTRACE_EPIDNONE + 1;
 
 	(void) snprintf(c, sizeof (c), "dtrace_aggid_%d", m);
-#if defined(sun)
 	state->dts_aggid_arena = vmem_create(c, (void *)1, UINT32_MAX, 1,
 	    NULL, NULL, NULL, 0, VM_SLEEP | VMC_IDENTIFIER);
 
@@ -13229,9 +13218,10 @@
 	if (devp != NULL)
 		*devp = state->dts_dev;
 #else
-	state->dts_aggid_arena = new_unrhdr(1, INT_MAX, &dtrace_unr_mtx);
+	state->dts_aggid_arena = vmem_create(c, (vmem_addr_t)1, UINT32_MAX, 1,
+	    0, M_WAITOK);
 	state->dts_dev = dev;
-#endif
+#endif 
 
 	/*
 	 * We allocate NCPU buffers.  On the one hand, this can be quite
@@ -14036,11 +14026,7 @@
 	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 +15361,7 @@
 #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));
 	}
Index: sys/cddl/contrib/opensolaris/uts/common/sys/dtrace_impl.h
===================================================================
--- sys/cddl/contrib/opensolaris/uts/common/sys/dtrace_impl.h	(revision 257743)
+++ sys/cddl/contrib/opensolaris/uts/common/sys/dtrace_impl.h	(working copy)
@@ -1139,11 +1139,7 @@
 	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 */
Index: sys/cddl/dev/dtrace/dtrace_load.c
===================================================================
--- sys/cddl/dev/dtrace/dtrace_load.c	(revision 257743)
+++ sys/cddl/dev/dtrace/dtrace_load.c	(working copy)
@@ -84,9 +84,9 @@
 	mutex_enter(&cpu_lock);
 
 	ASSERT(MUTEX_HELD(&cpu_lock));
+	dtrace_arena = vmem_create("dtrace", (vmem_addr_t)1, 
+							   UINT32_MAX, 1, 0, M_WAITOK | M_BESTFIT);
 
-	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);
Index: sys/cddl/dev/dtrace/dtrace_unload.c
===================================================================
--- sys/cddl/dev/dtrace/dtrace_unload.c	(revision 257743)
+++ sys/cddl/dev/dtrace/dtrace_unload.c	(working copy)
@@ -104,7 +104,7 @@
 
 	kmem_cache_destroy(dtrace_state_cache);
 
-	delete_unrhdr(dtrace_arena);
+	vmem_destroy(dtrace_arena);
 
 	if (dtrace_toxrange != NULL) {
 		kmem_free(dtrace_toxrange, 0);


More information about the freebsd-dtrace mailing list