Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 20 Jan 2008 00:48:33 GMT
From:      John Birrell <jb@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 133701 for review
Message-ID:  <200801200048.m0K0mXv6021002@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=133701

Change 133701 by jb@jb_freebsd1 on 2008/01/20 00:47:57

	peter@ pointed out that we have alloc_unr() to allocate unique
	resource IDs which turns out to be exactly what is needed here.

Affected files ...

.. //depot/projects/dtrace/src/sys/cddl/dev/dtrace/dtrace_clone.c#7 edit
.. //depot/projects/dtrace/src/sys/cddl/dev/dtrace/dtrace_load.c#28 edit
.. //depot/projects/dtrace/src/sys/cddl/dev/dtrace/dtrace_unload.c#24 edit
.. //depot/projects/dtrace/src/sys/contrib/opensolaris/uts/common/dtrace/dtrace.c#18 edit
.. //depot/projects/dtrace/src/sys/contrib/opensolaris/uts/common/sys/dtrace_impl.h#15 edit

Differences ...

==== //depot/projects/dtrace/src/sys/cddl/dev/dtrace/dtrace_clone.c#7 (text+ko) ====

@@ -50,7 +50,7 @@
 		return;
 
 	/* Allocate a unique minor number. */
-	u = dtrace_minor++;
+	u = alloc_unr(dtrace_minor);
 
 	/* Clone the device to the new minor number. */
 	if (clone_create(&dtrace_clones, &dtrace_cdevsw, &u, dev, 0) != 0)

==== //depot/projects/dtrace/src/sys/cddl/dev/dtrace/dtrace_load.c#28 (text+ko) ====

@@ -97,6 +97,9 @@
 	    1, INT_MAX, 0);
 #endif
 
+	dtrace_arena = new_unrhdr(1, INT_MAX, &dtrace_unr_mtx);
+	dtrace_minor = 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);

==== //depot/projects/dtrace/src/sys/cddl/dev/dtrace/dtrace_unload.c#24 (text+ko) ====

@@ -122,6 +122,9 @@
 
 	kmem_cache_destroy(dtrace_state_cache);
 
+	delete_unrhdr(dtrace_arena);
+	delete_unrhdr(dtrace_minor);
+
 	if (dtrace_toxrange != NULL) {
 		kmem_free(dtrace_toxrange, 0);
 		dtrace_toxrange = NULL;

==== //depot/projects/dtrace/src/sys/contrib/opensolaris/uts/common/dtrace/dtrace.c#18 (text) ====

@@ -196,8 +196,8 @@
 static vmem_t		*dtrace_minor;		/* minor number arena */
 static taskq_t		*dtrace_taskq;		/* task queue */
 #else
-static u_long		dtrace_arena;		/* Probe ID number.     */
-static u_long		dtrace_minor;		/* Minor device number. */
+static struct unrhdr	*dtrace_arena;		/* Probe ID number.     */
+static struct unrhdr	*dtrace_minor;		/* Minor number.     */
 #endif
 static dtrace_probe_t	**dtrace_probes;	/* array of all probes */
 static int		dtrace_nprobes;		/* number of probes */
@@ -224,6 +224,8 @@
 static dtrace_enabling_t *dtrace_retained;	/* list of retained enablings */
 static dtrace_dynvar_t	dtrace_dynhash_sink;	/* end of dynamic hash chains */
 #if !defined(sun)
+static struct mtx	dtrace_unr_mtx;
+MTX_SYSINIT(dtrace_unr_mtx, &dtrace_unr_mtx, "Unique resource identifier", MTX_DEF);
 int		dtrace_in_probe;	/* non-zero if executing a probe */
 #if defined(__i386__) || defined(__amd64__)
 uintptr_t	dtrace_in_probe_addr;	/* Address of invop when already in probe */
@@ -7168,6 +7170,8 @@
 		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
 		kmem_free(probe, sizeof (dtrace_probe_t));
 	}
@@ -7285,6 +7289,8 @@
 		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
 	}
 
@@ -7325,7 +7331,7 @@
 	id = (dtrace_id_t)(uintptr_t)vmem_alloc(dtrace_arena, 1,
 	    VM_BESTFIT | VM_SLEEP);
 #else
-	id = ++dtrace_arena;
+	id = alloc_unr(dtrace_arena);
 #endif
 	probe = kmem_zalloc(sizeof (dtrace_probe_t), KM_SLEEP);
 
@@ -9527,7 +9533,7 @@
 	aggid = (dtrace_aggid_t)(uintptr_t)vmem_alloc(state->dts_aggid_arena, 1,
 	    VM_BESTFIT | VM_SLEEP);
 #else
-	aggid = ++(state->dts_aggid_arena);
+	aggid = alloc_unr(state->dts_aggid_arena);
 #endif
 
 	if (aggid - 1 >= state->dts_naggregations) {
@@ -9579,6 +9585,8 @@
 	ASSERT(DTRACEACT_ISAGG(act->dta_kind));
 #if defined(sun)
 	vmem_free(state->dts_aggid_arena, (void *)(uintptr_t)aggid, 1);
+#else
+	free_unr(state->dts_aggid_arena, aggid);
 #endif
 
 	ASSERT(state->dts_aggregations[aggid - 1] == agg);
@@ -12410,7 +12418,7 @@
 	if (devp != NULL)
 		*devp = state->dts_dev;
 #else
-	state->dts_aggid_arena = 0;
+	state->dts_aggid_arena = new_unrhdr(1, INT_MAX, &dtrace_unr_mtx);
 	state->dts_dev = dev;
 #endif
 
@@ -13200,11 +13208,15 @@
 
 	dtrace_format_destroy(state);
 
+	if (state->dts_aggid_arena != NULL) {
 #if defined(sun)
-	if (state->dts_aggid_arena != NULL) {
 		vmem_destroy(state->dts_aggid_arena);
+#else
+		delete_unrhdr(state->dts_aggid_arena);
+#endif
 		state->dts_aggid_arena = NULL;
 	}
+#if defined(sun)
 	ddi_soft_state_free(dtrace_softstate, minor);
 	vmem_free(dtrace_minor, (void *)(uintptr_t)minor, 1);
 #endif

==== //depot/projects/dtrace/src/sys/contrib/opensolaris/uts/common/sys/dtrace_impl.h#15 (text) ====

@@ -1128,7 +1128,7 @@
 #if defined(sun)
 	vmem_t *dts_aggid_arena;		/* arena for aggregation IDs */
 #else
-	u_long dts_aggid_arena;			/* arena for aggregation IDs */
+	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 */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200801200048.m0K0mXv6021002>