[DTrace-devel] [PATCH 04/12] Add ability to provide user-specified probes on demand
eugene.loh at oracle.com
eugene.loh at oracle.com
Sat Jul 11 17:38:28 PDT 2020
From: Eugene Loh <eugene.loh at oracle.com>
Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
libdtrace/dt_probe.c | 14 ++++++++++++++
libdtrace/dt_provider.h | 2 ++
2 files changed, 16 insertions(+)
diff --git a/libdtrace/dt_probe.c b/libdtrace/dt_probe.c
index 4068fb83..5add8ae6 100644
--- a/libdtrace/dt_probe.c
+++ b/libdtrace/dt_probe.c
@@ -1084,6 +1084,7 @@ dt_probe_iter(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp,
dtrace_probedesc_t desc;
dt_probe_t tmpl;
dt_probe_t *prp;
+ dt_provider_t *pvp;
int i;
int p_is_glob, m_is_glob, f_is_glob, n_is_glob;
int rv = 0;
@@ -1143,6 +1144,19 @@ dt_probe_iter(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp,
tmpl.desc = pdp;
+ /*
+ * Loop over providers, allowing them to provide these probes.
+ */
+ for (pvp = dt_list_next(&dtp->dt_provlist);
+ pvp != NULL; pvp = dt_list_next(pvp)) {
+ if (pvp->impl->provide == NULL ||
+ !dt_gmatch(pvp->desc.dtvd_name, pdp->prv))
+ continue;
+ memcpy(&desc, pdp, sizeof (desc));
+ desc.prv = pvp->desc.dtvd_name;
+ pvp->impl->provide(dtp, &desc);
+ }
+
/*
* Special case: if the probe is fully specified (none of the elements
* are empty of a glob pattern, we can do a direct lookup based on the
diff --git a/libdtrace/dt_provider.h b/libdtrace/dt_provider.h
index e98bfac1..4f488460 100644
--- a/libdtrace/dt_provider.h
+++ b/libdtrace/dt_provider.h
@@ -59,6 +59,8 @@ typedef struct dt_provimpl {
const char *name; /* provider generic name */
int prog_type; /* BPF program type */
int (*populate)(dtrace_hdl_t *dtp); /* register probes */
+ int (*provide)(dtrace_hdl_t *dtp, /* provide probes */
+ const dtrace_probedesc_t *pdp);
int (*probe_info)(dtrace_hdl_t *dtp, /* get probe info */
const struct dt_probe *prp,
int *idp, int *argcp, dt_argdesc_t **argvp);
--
2.18.2
More information about the DTrace-devel
mailing list