[DTrace-devel] [PATCH 04/14] Track uprobe provider descriptions

Eugene Loh eugene.loh at oracle.com
Fri Jun 7 21:40:51 UTC 2024


On 6/4/24 17:10, Kris Van Hees wrote:

> On Tue, Jun 04, 2024 at 02:11:03PM -0400, eugene.loh--- via DTrace-devel wrote:
>> From: Eugene Loh <eugene.loh at oracle.com>
>>
>> A uprobe will have to decide which of its clauses to run for a
>> given pid.  For now, keep the provider description for each clause.
>> There are many shortcomings to the way this is done in this patch,
>> but it is quick and dirty and helps us bootstrap real support.
>> Clean this up later, probably turning it into a growable array.
> This is the wrong way to look at it, I think.  The underlying concept is that
> DTrace supports specifying probes that do not match anything yet (-Z).  Those
> are called retained enablings and they can exist for more than just uprobes.
> So this needs to be more generic.

Okay.  I looked at legacy-DTrace retained enablings.  They seem to be a 
linked list -- (mainly) of arrays of dtrace_ecbdesc pointers. And 
dtrace_ecbdesc has dtrace_probedesc, dtrace_preddesc, and 
dtrace_actdesc.  In DTrace on eBPF, dtrace_ecbdesc is much simpler -- 
it's really just a dtrace_probedesc.  So it seems to me we could just 
make our retained enablings be an array of probe desc pointers.  That 
would be a small change to this (small) patch.

> We also shouldn't do this non-discriminately for all clauses all the time.
> Obviously, when -Z is not used, there is no point in doing this because there
> cannot be a match-after-start.

FWIW, that's not how legacy DTrace seems to work:  there *can* be 
match-after-start without -Z.  The -Z option only addresses whether 
there is an initial match.  If there is, then -Z is not needed, not even 
for subsequent matches to work.

> Even when -Z is specified, you might be able
> to determine whether the probe specification for a probe matches perfectly
> or whether it needs to be retained for match-after-start.

Maybe.  But what if you have pid1234:a.out:main:go, but pid 1234 has not 
yet started up?  (Yes, that's an extremely weird example.)

Mostly (going back to your "shouldn't non-discriminately" comment), 
trying to decide whether to keep a probe desc seems unnecessary. Just 
keep them all.  They will likely be dwarfed by dtp->dt_probes[] anyhow.

> So, let's put some thought into designing this in the more generic case, so
> that we can avoid going down a rabbit hole that gets tough to recover from.

What do you think of:

     struct dtrace_hdl {
         [...]
         dt_list_t dt_enablings; /* list of (to be) enabled probes */
+       dtrace_probedesc_t **dt_retained;
+       int dt_nretained;
+       int dt_maxretained;
         struct dt_xlator **dt_xlatormap; /* dt_xlator_t's indexed by 
dx_id */
         [...]
     }


> (And whatever we store the retained enablings in probably should be added to
>   dtrace_hdl_t after dt_enablings.)

No problem.

>> diff --git a/libdtrace/dt_cc.c b/libdtrace/dt_cc.c
>> @@ -215,6 +215,7 @@ dt_compile_one_clause(dtrace_hdl_t *dtp, dt_node_t *cnp, dt_node_t *pnp)
>>   	 */
>>   	dt_cg(yypcb, cnp);
>>   	sdp->dtsd_clause = dt_clause_create(dtp, dt_as(yypcb));
>> +	dtp->dt_uprovdescs[dtp->dt_clause_nextid - 1] = strdup(pnp->dn_desc->prv);
>>   
>>   	assert(yypcb->pcb_stmt == sdp);
>>   	if (dtrace_stmt_add(yypcb->pcb_hdl, yypcb->pcb_prog, sdp) != 0)
>> diff --git a/libdtrace/dt_impl.h b/libdtrace/dt_impl.h
>> @@ -310,6 +310,7 @@ struct dtrace_hdl {
>>   	dt_pcb_t *dt_pcb;	/* pointer to current parsing control block */
>>   	ulong_t dt_gen;		/* compiler generation number */
>>   	uint_t dt_clause_nextid; /* next ID to use for programs */
>> +	char *dt_uprovdescs[256]; /* uprobe provider descriptor per clause... FIXME turn this into a growable array */
>>   	dt_list_t dt_programs;	/* linked list of dtrace_prog_t's */
>>   	dt_list_t dt_xlators;	/* linked list of dt_xlator_t's */
>>   	dt_list_t dt_enablings;	/* list of (to be) enabled probes */



More information about the DTrace-devel mailing list