Date: Fri, 18 Jan 2008 10:39:57 GMT From: John Birrell <jb@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 133544 for review Message-ID: <200801181039.m0IAdviq008312@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=133544 Change 133544 by jb@jb_freebsd1 on 2008/01/18 10:39:39 Implement SDT argument definitions. Affected files ... .. //depot/projects/dtrace/src/sys/cddl/dev/sdt/sdt.c#9 edit .. //depot/projects/dtrace/src/sys/kern/kern_proc.c#18 edit .. //depot/projects/dtrace/src/sys/kern/kern_sdt.c#6 edit .. //depot/projects/dtrace/src/sys/sys/sdt.h#11 edit Differences ... ==== //depot/projects/dtrace/src/sys/cddl/dev/sdt/sdt.c#9 (text+ko) ==== @@ -46,6 +46,7 @@ static d_open_t sdt_open; static int sdt_unload(void); +static void sdt_getargdesc(void *, dtrace_id_t, void *, dtrace_argdesc_t *); static void sdt_provide_probes(void *, dtrace_probedesc_t *); static void sdt_destroy(void *, dtrace_id_t, void *); static void sdt_enable(void *, dtrace_id_t, void *); @@ -73,15 +74,43 @@ sdt_disable, NULL, NULL, + sdt_getargdesc, NULL, NULL, - NULL, sdt_destroy }; static struct cdev *sdt_cdev; static int +sdt_argtype_callback(struct sdt_argtype *argtype, void *arg) +{ + dtrace_argdesc_t *desc = arg; + + if (desc->dtargd_ndx == argtype->ndx) { + desc->dtargd_mapping = desc->dtargd_ndx; /* XXX */ + strlcpy(desc->dtargd_native, argtype->type, + sizeof(desc->dtargd_native)); + desc->dtargd_xlate[0] = '\0'; /* XXX */ + } + + return (0); +} + +static void +sdt_getargdesc(void *arg, dtrace_id_t id, void *parg, dtrace_argdesc_t *desc) +{ + struct sdt_probe *probe = parg; + + if (desc->dtargd_ndx < probe->n_args) + (void) (sdt_argtype_listall(probe, sdt_argtype_callback, desc)); + else + desc->dtargd_ndx = DTRACE_ARGNONE; + + return; +} + +static int sdt_probe_callback(struct sdt_probe *probe, void *arg __unused) { struct sdt_provider *prov = probe->prov; ==== //depot/projects/dtrace/src/sys/kern/kern_proc.c#18 (text+ko) ==== @@ -147,8 +147,16 @@ p = (struct proc *)mem; SDT_PROBE(proc, kernel, ctor , entry, p, size, arg, flags, 0); + SDT_PROBE_ARGTYPE(proc, kernel, ctor , entry, 0, "struct proc *"); + SDT_PROBE_ARGTYPE(proc, kernel, ctor , entry, 1, "int"); + SDT_PROBE_ARGTYPE(proc, kernel, ctor , entry, 2, "void *"); + SDT_PROBE_ARGTYPE(proc, kernel, ctor , entry, 3, "int"); EVENTHANDLER_INVOKE(process_ctor, p); SDT_PROBE(proc, kernel, ctor , return, p, size, arg, flags, 0); + SDT_PROBE_ARGTYPE(proc, kernel, ctor , return, 0, "struct proc *"); + SDT_PROBE_ARGTYPE(proc, kernel, ctor , return, 1, "int"); + SDT_PROBE_ARGTYPE(proc, kernel, ctor , return, 2, "void *"); + SDT_PROBE_ARGTYPE(proc, kernel, ctor , return, 3, "int"); return (0); } @@ -165,6 +173,10 @@ p = (struct proc *)mem; td = FIRST_THREAD_IN_PROC(p); SDT_PROBE(proc, kernel, dtor , entry, p, size, arg, td, 0); + SDT_PROBE_ARGTYPE(proc, kernel, dtor , entry, 0, "struct proc *"); + SDT_PROBE_ARGTYPE(proc, kernel, dtor , entry, 1, "int"); + SDT_PROBE_ARGTYPE(proc, kernel, dtor , entry, 2, "void *"); + SDT_PROBE_ARGTYPE(proc, kernel, dtor , entry, 3, "struct thread *"); if (td != NULL) { #ifdef INVARIANTS KASSERT((p->p_numthreads == 1), @@ -183,6 +195,9 @@ if (p->p_ksi != NULL) KASSERT(! KSI_ONQ(p->p_ksi), ("SIGCHLD queue")); SDT_PROBE(proc, kernel, dtor , return, p, size, arg, 0, 0); + SDT_PROBE_ARGTYPE(proc, kernel, dtor , return, 0, "struct proc *"); + SDT_PROBE_ARGTYPE(proc, kernel, dtor , return, 1, "int"); + SDT_PROBE_ARGTYPE(proc, kernel, dtor , return, 2, "void *"); } /* @@ -195,6 +210,9 @@ p = (struct proc *)mem; SDT_PROBE(proc, kernel, init , entry, p, size, flags, 0, 0); + SDT_PROBE_ARGTYPE(proc, kernel, init , entry, 0, "struct proc *"); + SDT_PROBE_ARGTYPE(proc, kernel, init , entry, 1, "int"); + SDT_PROBE_ARGTYPE(proc, kernel, init , entry, 2, "int"); p->p_sched = (struct p_sched *)&p[1]; bzero(&p->p_mtx, sizeof(struct mtx)); mtx_init(&p->p_mtx, "process lock", NULL, MTX_DEF | MTX_DUPOK); @@ -203,6 +221,9 @@ EVENTHANDLER_INVOKE(process_init, p); p->p_stats = pstats_alloc(); SDT_PROBE(proc, kernel, init , return, p, size, flags, 0, 0); + SDT_PROBE_ARGTYPE(proc, kernel, init , return, 0, "struct proc *"); + SDT_PROBE_ARGTYPE(proc, kernel, init , return, 1, "int"); + SDT_PROBE_ARGTYPE(proc, kernel, init , return, 2, "int"); return (0); } ==== //depot/projects/dtrace/src/sys/kern/kern_sdt.c#6 (text+ko) ==== @@ -123,6 +123,9 @@ sx_xlock(&sdt_sx); TAILQ_INSERT_TAIL(&probe->prov->probe_list, probe, probe_entry); + + TAILQ_INIT(&probe->argtype_list); + probe->state = SDT_INIT; sx_xunlock(&sdt_sx); @@ -146,6 +149,38 @@ sx_xunlock(&sdt_sx); } +/* + * Called from SYSINIT to register a statically defined trace probe argument. + */ +void +sdt_argtype_register(void *arg) +{ + struct sdt_argtype *argtype = arg; + + sx_xlock(&sdt_sx); + + TAILQ_INSERT_TAIL(&argtype->probe->argtype_list, argtype, argtype_entry); + + argtype->probe->n_args++; + + sx_xunlock(&sdt_sx); +} + +/* + * Called from SYSUNINIT to de-register a statically defined trace probe argument. + */ +void +sdt_argtype_deregister(void *arg) +{ + struct sdt_argtype *argtype = arg; + + sx_xlock(&sdt_sx); + + TAILQ_REMOVE(&argtype->probe->argtype_list, argtype, argtype_entry); + + sx_xunlock(&sdt_sx); +} + static void sdt_init(void *arg) { @@ -210,3 +245,29 @@ return (error); } + +/* + * List statically defined tracing probe arguments. + */ +int +sdt_argtype_listall(struct sdt_probe *probe, + sdt_argtype_listall_func_t callback_func,void *arg) +{ + int error = 0; + int locked; + struct sdt_argtype *argtype; + + locked = sx_xlocked(&sdt_sx); + if (!locked) + sx_xlock(&sdt_sx); + + TAILQ_FOREACH(argtype, &probe->argtype_list, argtype_entry) { + if ((error = callback_func(argtype, arg)) != 0) + break; + } + + if (!locked) + sx_xunlock(&sdt_sx); + + return (error); +} ==== //depot/projects/dtrace/src/sys/sys/sdt.h#11 (text+ko) ==== @@ -39,7 +39,8 @@ #define DTRACE_PROBE4(name, type1, arg1, type2, arg2, type3, arg3, type4, arg4) #ifndef _KERNEL -#error "no user-servicable parts inside (yet)" + +/* The promise of things to come. Worlds to explore. People to meet. Things to do. */ #else @@ -48,6 +49,7 @@ #define SDT_PROVIDER_DEFINE(prov) #define SDT_PROVIDER_DECLARE(prov) #define SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) +#define SDT_PROBE_ARGTYPE(prov, mod, func, name, num, type) #else @@ -70,8 +72,18 @@ SDT_INIT, } sdt_state_t; +struct sdt_probe; struct sdt_provider; +struct sdt_argtype { + int ndx; /* Argument index. */ + const char *type; /* Argument type string. */ + TAILQ_ENTRY(sdt_argtype) + argtype_entry; /* Argument type list entry. */ + struct sdt_probe + *probe; /* Ptr to the probe structure. */ +}; + struct sdt_probe { int version; /* Set to sizeof(struct sdt_ref). */ sdt_state_t state; @@ -79,10 +91,12 @@ *prov; /* Ptr to the provider structure. */ TAILQ_ENTRY(sdt_probe) probe_entry; /* SDT probe list entry. */ + TAILQ_HEAD(argtype_list_head, sdt_argtype) argtype_list; const char *mod; const char *func; const char *name; id_t id; /* DTrace probe ID. */ + int n_args; /* Number of arguments. */ }; struct sdt_provider { @@ -110,30 +124,46 @@ #define SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) \ static struct sdt_probe sdt_##prov##_##mod##_##func##_##name[1] = { \ { sizeof(struct sdt_probe), 0, sdt_provider_##prov, \ - { NULL, NULL }, #mod, #func, #name, 0 } \ + { NULL, NULL }, { NULL, NULL }, #mod, #func, #name, 0, 0 } \ }; \ SYSINIT(sdt_##prov##_##mod##_##func##_##name##_init, SI_SUB_KDTRACE, \ - SI_ORDER_ANY, sdt_probe_register, \ + SI_ORDER_SECOND + 1, sdt_probe_register, \ sdt_##prov##_##mod##_##func##_##name ); \ SYSUNINIT(sdt_##prov##_##mod##_##func##_##name##_uninit, \ - SI_SUB_KDTRACE, SI_ORDER_ANY, sdt_probe_deregister, \ + SI_SUB_KDTRACE, SI_ORDER_SECOND + 1, sdt_probe_deregister, \ sdt_##prov##_##mod##_##func##_##name ); \ if (sdt_##prov##_##mod##_##func##_##name->id) \ (*sdt_probe_func)(sdt_##prov##_##mod##_##func##_##name->id, \ (uintptr_t) arg0, (uintptr_t) arg1, (uintptr_t) arg2, \ (uintptr_t) arg3, (uintptr_t) arg4) +#define SDT_PROBE_ARGTYPE(prov, mod, func, name, num, type) \ + static struct sdt_argtype sdt_##prov##_##mod##_##func##_##name##num[1] \ + = { { num, type, { NULL, NULL }, \ + sdt_##prov##_##mod##_##func##_##name } \ + }; \ + SYSINIT(sdt_##prov##_##mod##_##func##_##name##num##_init, \ + SI_SUB_KDTRACE, SI_ORDER_SECOND + 2, sdt_argtype_register, \ + sdt_##prov##_##mod##_##func##_##name##num ); \ + SYSUNINIT(sdt_##prov##_##mod##_##func##_##name##num##_uninit, \ + SI_SUB_KDTRACE, SI_ORDER_SECOND + 2, sdt_argtype_deregister, \ + sdt_##prov##_##mod##_##func##_##name##num ) + +typedef int (*sdt_argtype_listall_func_t)(struct sdt_argtype *, void *); +typedef int (*sdt_probe_listall_func_t)(struct sdt_probe *, void *); typedef int (*sdt_provider_listall_func_t)(struct sdt_provider *, void *); -typedef int (*sdt_probe_listall_func_t)(struct sdt_probe *, void *); +void sdt_argtype_deregister(void *); +void sdt_argtype_register(void *); +void sdt_probe_deregister(void *); +void sdt_probe_register(void *); void sdt_provider_deregister(void *); void sdt_provider_register(void *); -void sdt_probe_deregister(void *); -void sdt_probe_register(void *); void sdt_probe_stub(u_int32_t, uintptr_t arg0, uintptr_t arg1, uintptr_t arg2, uintptr_t arg3, uintptr_t arg4); +int sdt_argtype_listall(struct sdt_probe *, sdt_argtype_listall_func_t, void *); +int sdt_probe_listall(struct sdt_provider *, sdt_probe_listall_func_t, void *); int sdt_provider_listall(sdt_provider_listall_func_t,void *); -int sdt_probe_listall(struct sdt_provider *, sdt_probe_listall_func_t, void *); #endif /* KDTRACE_HOOKS */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200801181039.m0IAdviq008312>