Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 20 Apr 2006 21:28:25 GMT
From:      John Birrell <jb@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 95722 for review
Message-ID:  <200604202128.k3KLSPqJ005962@repoman.freebsd.org>

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

Change 95722 by jb@jb_freebsd2 on 2006/04/20 21:27:30

	Work-in-progress update. This won't compile and the moment.
	
	Include each group of functions from files grouped logically. The
	files are included in the same order they appear in Sun's dtrace.c
	and in each file the functions are in the same order. I've checked
	that it is possible to concatenate all the files together and diff
	them against Sun's dtrace.c. The diff makes sense.

Affected files ...

.. //depot/projects/dtrace/src/sys/cddl/dev/dtrace/dtrace.c#6 edit

Differences ...

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

@@ -40,31 +40,6 @@
  * implementation very much assume mastery of all of these sources; if one has
  * an unanswered question about the implementation, one should consult them
  * first.
- *
- * The functions here are ordered roughly as follows:
- *
- *   - Probe context functions
- *   - Probe hashing functions
- *   - Non-probe context utility functions
- *   - Matching functions
- *   - Provider-to-Framework API functions
- *   - Probe management functions
- *   - DIF object functions
- *   - Format functions
- *   - Predicate functions
- *   - ECB functions
- *   - Buffer functions
- *   - Enabling functions
- *   - DOF functions
- *   - Anonymous enabling functions
- *   - Consumer state functions
- *   - Helper functions
- *   - Hook functions
- *   - Driver cookbook functions
- *
- * Each group of functions begins with a block comment labelled the "DTrace
- * [Group] Functions", allowing one to find each block by searching forward
- * on capital-f functions.
  */
 #include <sys/cdefs.h>
 #include <sys/param.h>
@@ -75,6 +50,7 @@
 #include <sys/filio.h>
 #include <sys/kernel.h>
 #include <sys/kthread.h>
+#include <sys/limits.h>
 #include <sys/lock.h>
 #include <sys/malloc.h>
 #include <sys/module.h>
@@ -90,9 +66,14 @@
 #include <contrib/opensolaris/uts/common/sys/dtrace_impl.h>
 
 /* For compatibility with Solaris code. */
-typedef struct mtx	kmutex_t;
-#define	mutex_enter(_a)	mtx_lock(_a)
-#define	mutex_exit(_a)	mtx_unlock(_a)
+typedef struct mtx		kmutex_t;
+#define	mutex_enter(_a)		mtx_lock(_a)
+#define	mutex_exit(_a)		mtx_unlock(_a)
+#define KM_SLEEP		M_WAITOK
+#define KM_NOSLEEP		M_NOWAIT
+#define kmem_zalloc(_a,_b)	malloc(_a, M_DTRACE, _b | M_ZERO)
+#define kmem_alloc(_a,_b)	malloc(_a, M_DTRACE, _b)
+#define kmem_free(_a,_b)	free(_a, M_DTRACE)
 
 #define DTRACE_MINOR	0
 
@@ -136,7 +117,6 @@
  * dynamically via "mdb -kw" or other means; they should only be tuned via
  * /etc/system.
  */
-#ifdef DOODAD
 int		dtrace_destructive_disallow = 0;
 dtrace_optval_t	dtrace_nonroot_maxsize = (16 * 1024 * 1024);
 size_t		dtrace_difo_maxsize = (256 * 1024);
@@ -169,7 +149,6 @@
 hrtime_t	dtrace_deadman_interval = NANOSEC;
 hrtime_t	dtrace_deadman_timeout = (hrtime_t)10 * NANOSEC;
 hrtime_t	dtrace_deadman_user = (hrtime_t)30 * NANOSEC;
-#endif
 
 /*
  * DTrace External Variables
@@ -196,12 +175,9 @@
 static dtrace_probe_t	**dtrace_probes;	/* array of all probes */
 static int		dtrace_nprobes;		/* number of probes */
 static dtrace_provider_t *dtrace_provider;	/* provider list */
-#ifdef DOODAD
 static dtrace_meta_t	*dtrace_meta_pid;	/* user-land meta provider */
-#endif
 static int		dtrace_opens;		/* number of opens */
 static int		dtrace_helpers;		/* number of helpers */
-#ifdef DOODAD
 static void		*dtrace_softstate;	/* softstate pointer */
 static dtrace_hash_t	*dtrace_bymod;		/* probes hashed by module */
 static dtrace_hash_t	*dtrace_byfunc;		/* probes hashed by function */
@@ -209,18 +185,19 @@
 static dtrace_toxrange_t *dtrace_toxrange;	/* toxic range array */
 static int		dtrace_toxranges;	/* number of toxic ranges */
 static int		dtrace_toxranges_max;	/* size of toxic range array */
-#endif
 static dtrace_anon_t	dtrace_anon;		/* anonymous enabling */
 #ifdef DOODAD
 static kmem_cache_t	*dtrace_state_cache;	/* cache for dynamic state */
+#endif
 static uint64_t		dtrace_vtime_references; /* number of vtimestamp refs */
+#ifdef DOODAD
 static kthread_t	*dtrace_panicked;	/* panicking thread */
+#endif
 static dtrace_ecb_t	*dtrace_ecb_create_cache; /* cached created ECB */
 static dtrace_genid_t	dtrace_probegen;	/* current probe generation */
 static dtrace_helpers_t *dtrace_deferred_pid;	/* deferred helper list */
 static dtrace_enabling_t *dtrace_retained;	/* list of retained enablings */
 static dtrace_dynvar_t	dtrace_dynhash_sink;	/* end of dynamic hash chains */
-#endif
 
 /*
  * DTrace Locking
@@ -257,6 +234,10 @@
 static kmutex_t		dtrace_provider_lock;	/* provider state lock */
 static kmutex_t		dtrace_meta_lock;	/* meta-provider state lock */
 
+/* XXX Hack. */
+static kmutex_t		cpu_lock;
+static kmutex_t		mod_lock;
+
 /*
  * DTrace Provider Variables
  *
@@ -288,7 +269,6 @@
 	(void (*)(void *, dtrace_id_t, void *))dtrace_nullop
 };
 
-#ifdef DOODAD
 static dtrace_id_t	dtrace_probeid_begin;	/* special BEGIN probe */
 static dtrace_id_t	dtrace_probeid_end;	/* special END probe */
 dtrace_id_t		dtrace_probeid_error;	/* special ERROR probe */
@@ -374,6 +354,7 @@
 #define	DTRACE_STORE(type, tomax, offset, what) \
 	*((type *)((uintptr_t)(tomax) + (uintptr_t)offset)) = (type)(what);
 
+#ifdef DOODAD
 #ifndef __i386
 #define	DTRACE_ALIGNCHECK(addr, size, flags)				\
 	if (addr & (size - 1)) {					\
@@ -427,6 +408,7 @@
 #else
 #define	dtrace_loadptr	dtrace_load32
 #endif
+#endif
 
 #define	DTRACE_DYNHASH_FREE	0
 #define	DTRACE_DYNHASH_SINK	1
@@ -452,34 +434,200 @@
 	((act)->dta_kind == DTRACEACT_DIFEXPR &&			\
 	(act)->dta_difo->dtdo_rtype.dtdt_kind == DIF_TYPE_STRING)
 
-static dtrace_probe_t *dtrace_probe_lookup_id(dtrace_id_t id);
-static void dtrace_enabling_provide(dtrace_provider_t *);
+#ifdef DOODAD
+static dtrace_helpers_t *dtrace_helpers_create(proc_t *);
+#endif
+
+dtrace_state_t * dtrace_state_create(dev_t *, cred_t *);
+int dtrace_dstate_init(dtrace_dstate_t *, size_t);
+static char *dtrace_strdup(const char *);
+static dof_hdr_t * dtrace_dof_copyin(uintptr_t, int *);
+static dof_hdr_t *dtrace_dof_property(const char *);
+static dof_sec_t *dtrace_dof_sect(dof_hdr_t *, uint32_t, dof_secidx_t);
+static dtrace_action_t *dtrace_ecb_aggregation_create(dtrace_ecb_t *, dtrace_actdesc_t *);
+static dtrace_buffer_t *dtrace_speculation_buffer(dtrace_state_t *, processorid_t, dtrace_specid_t);
+static dtrace_ecb_t *dtrace_ecb_add(dtrace_state_t *, dtrace_probe_t *);
+static dtrace_ecb_t *dtrace_ecb_create(dtrace_state_t *, dtrace_probe_t *, dtrace_enabling_t *);
+static dtrace_ecbdesc_t *dtrace_dof_ecbdesc(dof_hdr_t *, dof_sec_t *, dtrace_vstate_t *, cred_t *);
+static dtrace_enabling_t *dtrace_enabling_create(dtrace_vstate_t *);
+static dtrace_hash_t *dtrace_hash_create(uintptr_t, uintptr_t, uintptr_t);
+static dtrace_predicate_t *dtrace_predicate_create(dtrace_difo_t *);
+static dtrace_probe_t *dtrace_hash_lookup(dtrace_hash_t *, dtrace_probe_t *);
+static dtrace_probe_t *dtrace_probe_lookup_id(dtrace_id_t);
+static dtrace_state_t *dtrace_anon_grab(void);
+static int dtrace_badattr(const dtrace_attribute_t *);
+static int dtrace_badname(const char *);
+static int dtrace_dof_options(dof_hdr_t *, dtrace_state_t *);
+static int dtrace_dof_relocate(dof_hdr_t *, dof_sec_t *, uint64_t);
+static int dtrace_dof_slurp(dof_hdr_t *, dtrace_vstate_t *, cred_t *, dtrace_enabling_t **, uint64_t, int);
+static int dtrace_ecb_action_add(dtrace_ecb_t *, dtrace_actdesc_t *);
+static int dtrace_ecb_create_enable(dtrace_probe_t *, void *);
 static int dtrace_enabling_match(dtrace_enabling_t *, int *);
+static int dtrace_enabling_retain(dtrace_enabling_t *);
+static int dtrace_hash_collisions(dtrace_hash_t *, dtrace_probe_t *);
+static int dtrace_helper_destroygen(int);
+static int dtrace_helper_slurp(dof_hdr_t *, dof_helper_t *);
+static int dtrace_helper_validate(dtrace_helper_action_t *);
+static int dtrace_match(const dtrace_probekey_t *, uint32_t, uid_t, zoneid_t, int (*)(dtrace_probe_t *, void *), void *);
+static int dtrace_match_priv(const dtrace_probe_t *, uint32_t, uid_t, zoneid_t);
+static int dtrace_match_probe(const dtrace_probe_t *, const dtrace_probekey_t *, uint32_t, uid_t, zoneid_t);
+static int dtrace_match_string(const char *, const char *, int);
+static int dtrace_probe_enable(const dtrace_probedesc_t *, dtrace_enabling_t *);
+static int dtrace_speculation(dtrace_state_t *);
+static int dtrace_state_buffer(dtrace_state_t *, dtrace_buffer_t *, int);
+static int dtrace_state_buffers(dtrace_state_t *);
+static int dtrace_state_go(dtrace_state_t *, processorid_t *);
+static int dtrace_state_option(dtrace_state_t *, dtrace_optid_t, dtrace_optval_t);
+static int dtrace_state_stop(dtrace_state_t *, processorid_t *);
+static intptr_t dtrace_buffer_reserve(dtrace_buffer_t *, size_t, size_t, dtrace_state_t *, dtrace_mstate_t *);
+static uint16_t dtrace_format_add(dtrace_state_t *, char *);
+static uint64_t dtrace_helper(int, dtrace_mstate_t *, dtrace_state_t *, uint64_t, uint64_t);
+static uint_t dtrace_hash_str(char *);
+static void dtrace_actdesc_release(dtrace_actdesc_t *, dtrace_vstate_t *);
+static void dtrace_anon_property(void);
+static void dtrace_buffer_drop(dtrace_buffer_t *);
+static void dtrace_cred2priv(cred_t *, uint32_t *, uid_t *, zoneid_t *);
+static void dtrace_difo_destroy(dtrace_difo_t *, dtrace_vstate_t *);
+static void dtrace_difo_hold(dtrace_difo_t *);
+static void dtrace_difo_release(dtrace_difo_t *, dtrace_vstate_t *);
+static void dtrace_dof_destroy(dof_hdr_t *);
+static void dtrace_dof_error(dof_hdr_t *, const char *);
+static void dtrace_dofattr2attr(dtrace_attribute_t *, const dof_attr_t);
+static void dtrace_dofprov2hprov(dtrace_helper_provdesc_t *, const dof_provider_t *, char *);
+static void dtrace_ecb_action_remove(dtrace_ecb_t *);
+static void dtrace_ecb_aggregation_destroy(dtrace_ecb_t *, dtrace_action_t *);
+static void dtrace_ecb_destroy(dtrace_ecb_t *);
+static void dtrace_ecb_enable(dtrace_ecb_t *);
+static void dtrace_ecb_resize(dtrace_ecb_t *);
+static void dtrace_enabling_add(dtrace_enabling_t *, dtrace_ecbdesc_t *);
+static void dtrace_enabling_destroy(dtrace_enabling_t *);
 static void dtrace_enabling_matchall(void);
-static dtrace_state_t *dtrace_anon_grab(void);
-static uint64_t dtrace_helper(int, dtrace_mstate_t *,
-    dtrace_state_t *, uint64_t, uint64_t);
-static dtrace_helpers_t *dtrace_helpers_create(proc_t *);
-static void dtrace_buffer_drop(dtrace_buffer_t *);
-static intptr_t dtrace_buffer_reserve(dtrace_buffer_t *, size_t, size_t,
-    dtrace_state_t *, dtrace_mstate_t *);
-static int dtrace_state_option(dtrace_state_t *, dtrace_optid_t,
-    dtrace_optval_t);
-static int dtrace_ecb_create_enable(dtrace_probe_t *, void *);
+static void dtrace_enabling_provide(dtrace_provider_t *);
+static void dtrace_format_remove(dtrace_state_t *, uint16_t);
+static void dtrace_hash_add(dtrace_hash_t *, dtrace_probe_t *);
+static void dtrace_hash_destroy(dtrace_hash_t *);
+static void dtrace_hash_remove(dtrace_hash_t *, dtrace_probe_t *);
+static void dtrace_hash_resize(dtrace_hash_t *);
+static void dtrace_helper_destroy(dtrace_helper_action_t *, dtrace_vstate_t *);
+static void dtrace_helper_provide(dof_helper_t *, pid_t);
+static void dtrace_helper_provide_one(dof_helper_t *, dof_sec_t *, pid_t);
+static void dtrace_helper_remove(dof_helper_t *, pid_t);
+static void dtrace_helper_remove_one(dof_helper_t *, dof_sec_t *, pid_t);
+static void dtrace_helper_trace(dtrace_helper_action_t *r, dtrace_mstate_t *, dtrace_vstate_t *, int);
+static void dtrace_helpers_destroy(void);
+static void dtrace_helpers_duplicate(proc_t *, proc_t *);
+static void dtrace_predicate_hold(dtrace_predicate_t *);
+static void dtrace_predicate_release(dtrace_predicate_t *, dtrace_vstate_t *);
+static void dtrace_probe_description(const dtrace_probe_t *, dtrace_probedesc_t *);
+static void dtrace_probe_provide(dtrace_probedesc_t *, dtrace_provider_t *);
+static void dtrace_probekey(const dtrace_probedesc_t *, dtrace_probekey_t *);
+static void dtrace_speculation_clean(dtrace_state_t *);
+static void dtrace_speculation_clean_here(dtrace_state_t *);
+static void dtrace_speculation_commit(dtrace_state_t *, processorid_t, dtrace_specid_t);
+static void dtrace_speculation_discard(dtrace_state_t *, processorid_t, dtrace_specid_t);
+static void dtrace_state_clean(dtrace_state_t *);
+static void dtrace_state_deadman(dtrace_state_t *);
+static void dtrace_state_destroy(dtrace_state_t *);
+static void dtrace_state_prereserve(dtrace_state_t *);
+static void dtrace_vstate_fini(dtrace_vstate_t *);
+void dtrace_dstate_fini(dtrace_dstate_t *d);
+void dtrace_vtime_disable(void);
+void dtrace_vtime_enable(void);
+
+/* XXX Hacks.... */
+void
+dtrace_sync(void)
+{
+#ifdef DOODAD
+        dtrace_xcall(DTRACE_CPUALL, (dtrace_xcall_t)dtrace_sync_func, NULL);
 #endif
+}
+void
+dtrace_membar_producer(void)
+{
+}
+void
+dtrace_vtime_enable(void)
+{
+}
+void
+dtrace_vtime_disable(void)
+{
+}
 
+/* Common error handler. */
 #include <cddl/dev/dtrace/cmn_err.c>
-#include <cddl/dev/dtrace/dtrace_badattr.c>
-#include <cddl/dev/dtrace/dtrace_badname.c>
+
+/*   - Probe context functions */
+#include <cddl/dev/dtrace/dtrace_context.c>
+#include <cddl/dev/dtrace/dtrace_priv.c>
+#include <cddl/dev/dtrace/dtrace_dynvar.c>
+#include <cddl/dev/dtrace/dtrace_aggregate.c>
+#include <cddl/dev/dtrace/dtrace_speculation.c>
+#include <cddl/dev/dtrace/dtrace_dif.c>
+#include <cddl/dev/dtrace/dtrace_action.c>
+
+/*   - Probe hashing functions */
+#include <cddl/dev/dtrace/dtrace_probe.c>
+#include <cddl/dev/dtrace/dtrace_hash.c>
+
+/*   - Non-probe context utility functions */
+#include <cddl/dev/dtrace/dtrace_util.c>
+
+/*   - Matching functions */
+#include <cddl/dev/dtrace/dtrace_match.c>
+
+/*   - Provider-to-Framework API functions */
+#include <cddl/dev/dtrace/dtrace_probekey.c>
+#include <cddl/dev/dtrace/dtrace_register.c>
+
+/*   - Probe management functions */
+#include <cddl/dev/dtrace/dtrace_probemgmt.c>
+#include <cddl/dev/dtrace/dtrace_helpprov.c>
+#include <cddl/dev/dtrace/dtrace_meta.c>
+
+/*   - DIF object functions */
+#include <cddl/dev/dtrace/dtrace_difo.c>
+
+/*   - Format functions */
+#include <cddl/dev/dtrace/dtrace_format.c>
+
+/*   - Predicate functions */
+#include <cddl/dev/dtrace/dtrace_predicate.c>
+#include <cddl/dev/dtrace/dtrace_actdesc.c>
+
+/*   - ECB functions */
+#include <cddl/dev/dtrace/dtrace_ecb.c>
+
+/*   - Buffer functions */
+#include <cddl/dev/dtrace/dtrace_buffer.c>
+
+/*   - Enabling functions */
+#include <cddl/dev/dtrace/dtrace_enabling.c>
+
+/*   - DOF functions */
+#include <cddl/dev/dtrace/dtrace_dof.c>
+
+/*   - Consumer state functions */
+#include <cddl/dev/dtrace/dtrace_state.c>
+
+/*   - Anonymous enabling functions */
+#include <cddl/dev/dtrace/dtrace_anon.c>
+
+/*   - Helper functions */
+#include <cddl/dev/dtrace/dtrace_helper.c>
+
+/*   - Hook functions */
+#include <cddl/dev/dtrace/dtrace_hook.c>
+
+/*   - Driver cookbook functions */
 #include <cddl/dev/dtrace/dtrace_close.c>
 #include <cddl/dev/dtrace/dtrace_ioctl.c>
 #include <cddl/dev/dtrace/dtrace_load.c>
 #include <cddl/dev/dtrace/dtrace_modevent.c>
 #include <cddl/dev/dtrace/dtrace_open.c>
-#include <cddl/dev/dtrace/dtrace_register.c>
 #include <cddl/dev/dtrace/dtrace_sysctl.c>
 #include <cddl/dev/dtrace/dtrace_unload.c>
-#include <cddl/dev/dtrace/dtrace_unregister.c>
 
 DEV_MODULE(dtrace, dtrace_modevent, NULL);
 MODULE_VERSION(dtrace, 1);



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