[DTrace-devel] [PATCH 1/3] Ensure proper probe compilation context is set for trampolines
Kris Van Hees
kris.van.hees at oracle.com
Fri Jul 2 11:42:45 PDT 2021
On Fri, Jul 02, 2021 at 02:33:38PM -0400, Eugene Loh wrote:
> Reviewed-by: Eugene Loh <eugene.loh at oracle.com>
> ... but if there is a user-visible difference with this patch alone,
> would it make sense to add a test? Or, would that wait until a later patch?
No user visible effect from this - but it is necessary for the following
patches (especially 3/3). That last one could use a patch but I haven't found
a nice and stable one just yet because tracepoints are not the most stable
thing between kernel releases. It's a bit of a challenge similar to the stack
tests and basing them on a specific function.
> On 7/2/21 2:18 PM, Kris Van Hees wrote:
> > Trampolines are generated per-probe, well after the clauses have been
> > compiled. The code generation for the trampolines was not setting the
> > proper probe context which could lead to obscure issues like not having
> > the proper probe argument information when the trampoline is generated.
> >
> > Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
> > ---
> > libdtrace/dt_cc.c | 9 ++++++---
> > libdtrace/dt_impl.h | 2 +-
> > libdtrace/dt_pid.c | 9 +++++----
> > 3 files changed, 12 insertions(+), 8 deletions(-)
> >
> > diff --git a/libdtrace/dt_cc.c b/libdtrace/dt_cc.c
> > index 9c05e831..2a6904a0 100644
> > --- a/libdtrace/dt_cc.c
> > +++ b/libdtrace/dt_cc.c
> > @@ -1560,7 +1560,7 @@ dt_compile_xlator(dt_node_t *dnp)
> > }
> >
> > void
> > -dt_setcontext(dtrace_hdl_t *dtp, dtrace_probedesc_t *pdp)
> > +dt_setcontext(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp)
> > {
> > const dtrace_pattr_t *pap;
> > dt_probe_t *prp;
> > @@ -1585,7 +1585,7 @@ dt_setcontext(dtrace_hdl_t *dtp, dtrace_probedesc_t *pdp)
> > isdigit(pdp->prv[strlen(pdp->prv) - 1]) &&
> > ((pvp = dt_provider_lookup(dtp, pdp->prv)) == NULL ||
> > pvp->pv_flags & DT_PROVIDER_PID) &&
> > - dt_pid_create_probes(pdp, dtp, yypcb) != 0) {
> > + dt_pid_create_probes((dtrace_probedesc_t *)pdp, dtp, yypcb) != 0) {
> > longjmp(yypcb->pcb_jmpbuf, EDT_COMPILER);
> > }
> >
> > @@ -2117,7 +2117,7 @@ dt_construct(dtrace_hdl_t *dtp, dt_probe_t *prp, uint_t cflags, dt_ident_t *idp)
> > pcb.pcb_context = DT_CTX_DPROG;
> > pcb.pcb_token = DT_CTX_DPROG;
> > pcb.pcb_probe = prp;
> > - pcb.pcb_pdesc = NULL;
> > + pcb.pcb_pdesc = prp->desc;
> >
> > if ((err = setjmp(yypcb->pcb_jmpbuf)) != 0)
> > goto out;
> > @@ -2134,6 +2134,7 @@ dt_construct(dtrace_hdl_t *dtp, dt_probe_t *prp, uint_t cflags, dt_ident_t *idp)
> > if (yypcb->pcb_pragmas != NULL)
> > dt_idhash_iter(yypcb->pcb_pragmas, dt_idpragma, NULL);
> >
> > + dt_setcontext(dtp, yypcb->pcb_pdesc);
> > tnp = dt_node_trampoline(prp);
> > dt_node_type_assign(tnp, dtp->dt_ints[0].did_ctfp,
> > dtp->dt_ints[0].did_type);
> > @@ -2164,6 +2165,8 @@ out:
> > ctf_write(dtp->dt_ddefs->dm_ctfp, dtp->dt_ddefs_fd) == CTF_ERR))
> > dt_dprintf("failed to update CTF cache: %s\n", strerror(errno));
> >
> > + dt_endcontext(dtp);
> > +
> > dt_pcb_pop(dtp, err);
> > dt_set_errno(dtp, err);
> >
> > diff --git a/libdtrace/dt_impl.h b/libdtrace/dt_impl.h
> > index d3e133e7..bd8d9943 100644
> > --- a/libdtrace/dt_impl.h
> > +++ b/libdtrace/dt_impl.h
> > @@ -698,7 +698,7 @@ extern uint64_t dt_stddev(uint64_t *, uint64_t);
> >
> > extern int dt_options_load(dtrace_hdl_t *);
> >
> > -extern void dt_setcontext(dtrace_hdl_t *, dtrace_probedesc_t *);
> > +extern void dt_setcontext(dtrace_hdl_t *, const dtrace_probedesc_t *);
> > extern void dt_endcontext(dtrace_hdl_t *);
> >
> > extern void dt_dlib_init(dtrace_hdl_t *dtp);
> > diff --git a/libdtrace/dt_pid.c b/libdtrace/dt_pid.c
> > index dc710926..36e8e749 100644
> > --- a/libdtrace/dt_pid.c
> > +++ b/libdtrace/dt_pid.c
> > @@ -504,7 +504,7 @@ dt_pid_fix_mod(dt_pid_probe_t *pp, dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp,
> >
> > static int
> > dt_pid_create_pid_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp,
> > - dt_pcb_t *pcb, dt_proc_t *dpr)
> > + dt_pcb_t *pcb, dt_proc_t *dpr)
> > {
> > dt_pid_probe_t pp;
> > int ret = 0;
> > @@ -685,8 +685,8 @@ dt_pid_create_usdt_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp,
> > #endif
> >
> > static pid_t
> > -dt_pid_get_pid(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb,
> > - dt_proc_t *dpr)
> > +dt_pid_get_pid(const dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb,
> > + dt_proc_t *dpr)
> > {
> > pid_t pid;
> > char *end;
> > @@ -741,7 +741,8 @@ dt_pid_create_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb)
> > dpr = dt_proc_lookup(dtp, pid);
> > assert(dpr != NULL);
> >
> > - if ((err = dt_pid_create_pid_probes(pdp, dtp, pcb, dpr)) == 0) {
> > + err = dt_pid_create_pid_probes(pdp, dtp, pcb, dpr);
> > + if (err == 0) {
> > /*
> > * Alert other retained enablings which may match
> > * against the newly created probes.
>
> _______________________________________________
> 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