[DTrace-devel] [PATCH 04/13] Add ability to provide user-specified probes on demand
Eugene Loh
eugene.loh at oracle.com
Mon Jul 6 09:32:45 PDT 2020
On 07/06/2020 08:31 AM, Kris Van Hees wrote:
> On Wed, Jul 01, 2020 at 10:41:09PM -0400, eugene.loh at oracle.com wrote:
>> From: Eugene Loh <eugene.loh at oracle.com>
>>
>> Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
>> ---
>> libdtrace/dt_probe.c | 20 ++++++++++++++++++++
>> libdtrace/dt_provider.h | 2 ++
>> 2 files changed, 22 insertions(+)
>>
>> diff --git a/libdtrace/dt_probe.c b/libdtrace/dt_probe.c
>> index 46c47fbe..be407dd2 100644
>> --- a/libdtrace/dt_probe.c
>> +++ b/libdtrace/dt_probe.c
>> @@ -1141,6 +1141,26 @@ dt_probe_iter(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp,
>>
>> tmpl.desc = pdp;
>>
>> + /*
>> + * Special case: if the probe name is specified,
>> + * give all providers the opportunity to provide it.
>> + */
>> + if (n_is_glob == 0) {
>> + dt_provider_t *pvp;
>> + dtrace_probedesc_t pd;
>> +
>> + /* loop over providers */
>> + 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(&pd, pdp, sizeof (pd));
>> + pd.prv = pvp->desc.dtvd_name;
>> + pvp->impl->provide(dtp, &pd);
>> + }
>> + }
>> +
> You introduce a limitation here that did not exist in DTrace v1 and I do not
> see a reason why we would be more restrictive than DTrace v1. Why would we not
> allow globs in the probe name? Any filtering on probe descriptions that a
> provider might be able to work with (nor not) should be at the level of the
> provider.
Good point. Yes, I agree.
> Now, for efficiency sake, I do think we might be able to implement this slightly
> differently from DTrace v1 without creating different behaviour. I think it
> would be valid to first try to find a matching probe first and if one is not
> found, to then give all providers a chance to provide it. We could then loop
> back to performing the lookup one more time.
It seems to me that such an optimization would change semantics. E.g.,
let's imagine that these two probes are provided on demand:
foo:bar:baz:name1
foo:bar:baz:name2
What would "-n foo:bar:baz:name1 -n foo:bar:baz:*" do?
With provide-look, the second probe description would find both name1
and name2.
With look-provide-look, the second probe description would see only name1.
Or am I missing something?
> That is an optimiztion that we could leave for later but it seems to be a very
> simple and obvious one. Most of the time, probes people refer to will already
> exist. The lookup process is also a lot faster than DTrace v1 could provide
> (due to the userspace-kernel interaction), so the penalty for
> lookup-provide-lookup is very small.
How about we defer discussion of this change (mainly because I'm
concerned about the change in semantics).
>> /*
>> * 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..50f663f1 100644
>> --- a/libdtrace/dt_provider.h
>> +++ b/libdtrace/dt_provider.h
>> @@ -62,6 +62,8 @@ typedef struct dt_provimpl {
>> int (*probe_info)(dtrace_hdl_t *dtp, /* get probe info */
>> const struct dt_probe *prp,
>> int *idp, int *argcp, dt_argdesc_t **argvp);
>> + int (*provide)(dtrace_hdl_t *dtp, /* provide probes */
>> + const dtrace_probedesc_t *pdp);
> I think it would be more appropriate to place this right after the populate
> callback because they perform the same kind of function (add probes to the
> global probe list).
Okay.
>> void (*trampoline)(dt_pcb_t *pcb); /* generate BPF trampoline */
>> int (*probe_fini)(dtrace_hdl_t *dtp, /* probe cleanup */
>> struct dt_probe *prb);
>> --
>> 2.18.2
>>
>>
>> _______________________________________________
>> DTrace-devel mailing list
>> DTrace-devel at oss.oracle.com
>> https://oss.oracle.com/mailman/listinfo/dtrace-devel
More information about the DTrace-devel
mailing list