PERFORCE change 101546 for review
Howard Su
howardsu at FreeBSD.org
Fri Jul 14 13:33:07 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=101546
Change 101546 by howardsu at su_laptop on 2006/07/14 13:32:18
Fix SDT bugs. kldload/unload SDT provider works now.
Affected files ...
.. //depot/projects/dtrace/src/sys/cddl/dev/sdt/sdt.c#6 edit
.. //depot/projects/dtrace/src/sys/i386/i386/elf_machdep.c#5 edit
.. //depot/projects/dtrace/src/sys/sys/kernel.h#7 edit
Differences ...
==== //depot/projects/dtrace/src/sys/cddl/dev/sdt/sdt.c#6 (text+ko) ====
@@ -1,4 +1,3 @@
-
/*
* CDDL HEADER START
*
@@ -94,7 +93,7 @@
sdt_disable,
sdt_suspend,
sdt_resume,
- NULL,
+ sdt_getargdesc,
NULL,
NULL,
sdt_destroy
@@ -141,9 +140,8 @@
}
static int
-sdt_provide_module_function(linker_file_t lf, linker_symval_t *symval, void *opaque)
+sdt_create_module_probes(linker_file_t lf, char *modname)
{
- char *modname = opaque;
sdt_probedesc_t *sdpd;
sdt_probe_t *sdp, *old;
sdt_provider_t *prov;
@@ -162,77 +160,74 @@
return (0);
for (; sdpd != NULL; sdpd = sdpd->sdpd_next) {
- char *name = sdpd->sdpd_name, *func, *nname;
+ char *name = sdpd->sdpd_name, *nname;
int i, j;
sdt_provider_t *prov;
dtrace_id_t id;
for (prov = sdt_providers; prov->sdtp_prefix != NULL; prov++) {
- char *prefix = prov->sdtp_prefix;
+ char *prefix = prov->sdtp_prefix;
- if (strncmp(name, prefix, strlen(prefix)) == 0) {
- name += strlen(prefix);
- break;
+ if (strncmp(name, prefix, strlen(prefix)) == 0) {
+ name += strlen(prefix);
+ break;
+ }
}
- }
+
+ while (*name != '\0') {
+ if (*name <= '9' && *name>='0')
+ name++;
+ else
+ break;
+ }
+
+ nname = malloc(len = strlen(name) + 1, M_SDT, M_WAITOK);
- nname = malloc(len = strlen(name) + 1, M_SDT, M_WAITOK);
+ for (i = 0, j = 0; name[j] != '\0'; i++) {
+ if (name[j] == '_' && name[j + 1] == '_') {
+ nname[i] = '-';
+ j += 2;
+ } else {
+ nname[i] = name[j++];
+ }
+ }
- for (i = 0, j = 0; name[j] != '\0'; i++) {
- if (name[j] == '_' && name[j + 1] == '_') {
- nname[i] = '-';
- j += 2;
- } else {
- nname[i] = name[j++];
- }
- }
+ nname[i] = '\0';
- nname[i] = '\0';
+ sdp = malloc(sizeof (sdt_probe_t), M_SDT, M_WAITOK | M_ZERO);
+ sdp->sdp_loadcnt = lf->loadcnt;
+ sdp->sdp_ctl = lf;
+ sdp->sdp_name = nname;
+ sdp->sdp_namelen = len;
+ sdp->sdp_provider = prov;
- sdp = malloc(sizeof (sdt_probe_t), M_SDT, M_WAITOK | M_ZERO);
- sdp->sdp_loadcnt = lf->loadcnt;
- sdp->sdp_ctl = lf;
- sdp->sdp_name = nname;
- sdp->sdp_namelen = len;
- sdp->sdp_provider = prov;
-
- if (symval->name == NULL)
- func = "<unknown>";
- else {
- /* HACK: we need change prototype of _probe_lookup */
- func = malloc(strlen(symval->name) + 1, M_SDT, M_WAITOK);
- strcpy(func, symval->name);
- }
-
- /*
- * We have our provider. Now create the probe.
- */
- if ((id = dtrace_probe_lookup(prov->sdtp_id, modname,
- func, nname)) != DTRACE_IDNONE) {
- old = dtrace_probe_arg(prov->sdtp_id, id);
- ASSERT(old != NULL);
+ /*
+ * We have our provider. Now create the probe.
+ */
+ if ((id = dtrace_probe_lookup(prov->sdtp_id, modname,
+ NULL, nname)) != DTRACE_IDNONE) {
+ old = dtrace_probe_arg(prov->sdtp_id, id);
+ ASSERT(old != NULL);
- sdp->sdp_next = old->sdp_next;
- sdp->sdp_id = id;
- old->sdp_next = sdp;
- } else {
- sdp->sdp_id = dtrace_probe_create(prov->sdtp_id,
- modname, func, nname, 3, sdp);
+ sdp->sdp_next = old->sdp_next;
+ sdp->sdp_id = id;
+ old->sdp_next = sdp;
+ } else {
+ sdp->sdp_id = dtrace_probe_create(prov->sdtp_id,
+ modname, NULL, nname, 3, sdp);
- lf->sdt_nprobes++;
- }
+ lf->sdt_nprobes++;
+ }
- sdp->sdp_hashnext =
- sdt_probetab[SDT_ADDR2NDX(sdpd->sdpd_offset)];
- sdt_probetab[SDT_ADDR2NDX(sdpd->sdpd_offset)] = sdp;
+ sdp->sdp_hashnext =
+ sdt_probetab[SDT_ADDR2NDX(sdpd->sdpd_offset)];
+ sdt_probetab[SDT_ADDR2NDX(sdpd->sdpd_offset)] = sdp;
- sdp->sdp_patchval = SDT_PATCHVAL;
- sdp->sdp_patchpoint = (uint8_t *)sdpd->sdpd_offset;
- sdp->sdp_savedval = *sdp->sdp_patchpoint;
- if (symval->name != NULL)
- free(func, M_SDT);
+ sdp->sdp_patchval = SDT_PATCHVAL;
+ sdp->sdp_patchpoint = (uint8_t *)sdpd->sdpd_offset;
+ sdp->sdp_savedval = *sdp->sdp_patchpoint;
}
- return (0);
+ return (0);
}
/*ARGSUSED*/
@@ -246,11 +241,8 @@
len = strlen(modname);
if (len > 3 && strcmp(modname + len - 3, ".ko") == 0)
modname[len - 3] = '\0';
-
- /*
- * List the functions in the module and the symbol values.
- */
- linker_file_function_listall(lf, sdt_provide_module_function, modname);
+
+ sdt_create_module_probes(lf, modname);
}
/* ARGSUSED */
@@ -258,14 +250,13 @@
sdt_destroy(void *arg, dtrace_id_t id, void *parg)
{
sdt_probe_t *sdt = parg, *next, *hash, *last;
- modctl_t *ctl;
+ modctl_t *ctl = sdt->sdp_ctl;
int ndx;
+ if (ctl->loadcnt == sdt->sdp_loadcnt)
+ ctl->sdt_nprobes--;
+
do {
- ctl = sdt->sdp_ctl;
-
- ctl->sdt_nentries--;
-
/*
* Now we need to remove this probe from the sdt_probetab.
*/
==== //depot/projects/dtrace/src/sys/i386/i386/elf_machdep.c#5 (text+ko) ====
@@ -241,11 +241,11 @@
sdt_reloc_resolve(uint8_t *instr, sdt_probedesc_t *sdp)
{
int i;
- instr -= SDT_SIZEOF_CALL;
+ instr -= SDT_SIZEOF_CALL - 1;
sdp->sdpd_offset = (uintptr_t)instr;
for(i = 0; i < SDT_NOPS; i++) {
- instr[i] = SDT_NOP;
+ instr[i - 1] = SDT_NOP;
}
return (1);
==== //depot/projects/dtrace/src/sys/sys/kernel.h#7 (text+ko) ====
@@ -112,7 +112,6 @@
SI_SUB_WITNESS = 0x1A80000, /* witness initialization */
SI_SUB_MTX_POOL_DYNAMIC = 0x1AC0000, /* dynamic mutex pool */
SI_SUB_LOCK = 0x1B00000, /* various locks */
- SI_SUB_SDT = 0x1B80000, /* statically defined tracing */
SI_SUB_EVENTHANDLER = 0x1C00000, /* eventhandler init */
SI_SUB_KLD = 0x2000000, /* KLD and module setup */
SI_SUB_CPU = 0x2100000, /* CPU resource(s)*/
More information about the p4-projects
mailing list