[DTrace-devel] [PATCH 7/7] Implement proc:::signal-clear

Kris Van Hees kris.van.hees at oracle.com
Wed May 17 17:51:28 UTC 2023


On Wed, May 17, 2023 at 12:16:00PM -0400, Eugene Loh via DTrace-devel wrote:
> Need tests.

There was a test for it already - but I just noticed it continues to fail
becaue I made a mistake.  Fixing.

> Otherwise looks good, I guess.
> 
> But I don't understand some stuff.  Like does one have to worry about, e.g.,
> rt_sigtimedwait_time64() calls?

We hook to the rt_sigtimedwait syscall, not specific functions.

> 
> On 5/9/23 18:34, Kris Van Hees via DTrace-devel wrote:
> > Drop the undocumented proc:::fault probe.
> > 
> > Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
> > ---
> >   libdtrace/dt_prov_proc.c | 23 ++++++++++++++++-------
> >   1 file changed, 16 insertions(+), 7 deletions(-)
> > 
> > diff --git a/libdtrace/dt_prov_proc.c b/libdtrace/dt_prov_proc.c
> > index 2ed3e3f7..e7fbdca2 100644
> > --- a/libdtrace/dt_prov_proc.c
> > +++ b/libdtrace/dt_prov_proc.c
> > @@ -87,18 +87,11 @@ static probe_arg_t probe_args[] = {
> >   	{ "exec-failure", 0, { 0, 0, "int", } },
> >   	{ "exec-success", },
> >   	{ "exit", 0, { 0, 0, "int", } },
> > -#if 0
> > -	{ "fault", 0, { 0, 0, "int", } },
> > -	{ "fault", 1, { 1, 0, "siginfo_t *", } },
> > -#endif
> >   	{ "lwp-create", 0, { 0, 0, "struct task_struct *", "lwpsinfo_t *" } },
> >   	{ "lwp-create", 1, { 0, 0, "struct task_struct *", "psinfo_t *" } },
> >   	{ "lwp-exit", },
> >   	{ "lwp-start", },
> > -#if 0
> >   	{ "signal-clear", 0, { 0, 0, "int", } },
> > -	{ "signal-clear", 1, { 1, 0, "siginfo_t *", } },
> > -#endif
> >   	{ "signal-discard", 0, { 0, 0, "struct task_struct *", "lwpsinfo_t *" } },
> >   	{ "signal-discard", 1, { 0, 0, "struct task_struct *", "psinfo_t *" } },
> >   	{ "signal-discard", 2, { 1, 0, "int", } },
> > @@ -219,6 +212,18 @@ static void enable(dtrace_hdl_t *dtp, dt_probe_t *prp)
> >   		uprp = dt_probe_lookup(dtp, &pd);
> >   		assert(uprp != NULL);
> > +		dt_probe_add_dependent(dtp, uprp, prp);
> > +		dt_probe_enable(dtp, uprp);
> > +	} else if (strcmp(prp->desc->prb, "signal-clear") == 0) {
> > +		pd.id = DTRACE_IDNONE;
> > +		pd.prv = "syscall";
> > +		pd.mod = "";
> > +		pd.fun = "rt_sigtimedwait";
> > +		pd.prb = "return";
> > +
> > +		uprp = dt_probe_lookup(dtp, &pd);
> > +		assert(uprp != NULL);
> > +
> >   		dt_probe_add_dependent(dtp, uprp, prp);
> >   		dt_probe_enable(dtp, uprp);
> >   	} else if (strcmp(prp->desc->prb, "signal-discard") == 0) {
> > @@ -363,6 +368,10 @@ static int trampoline(dt_pcb_t *pcb, uint_t exitlbl)
> >   	} else if (strcmp(prp->desc->prb, "lwp-create") == 0) {
> >   		emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, BPF_REG_7, DMST_ARG(1)));
> >   		emit(dlp, BPF_STORE(BPF_DW, BPF_REG_7, DMST_ARG(0), BPF_REG_0));
> > +	} else if (strcmp(prp->desc->prb, "signal-clear") == 0) {
> > +		/* Pre-condition: arg0 > 0 */
> > +		emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, BPF_REG_7, DMST_ARG(0)));
> > +		emit(dlp, BPF_BRANCH_IMM(BPF_JGT, BPF_REG_0, 0, exitlbl));
> >   	} else if (strcmp(prp->desc->prb, "signal-discard") == 0) {
> >   		/* Pre-condition: arg4 == 1 */
> >   		emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, BPF_REG_7, DMST_ARG(4)));
> 
> _______________________________________________
> 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