[DTrace-devel] [PATCH 3/7] provider: change the trampoline return type

Eugene Loh eugene.loh at oracle.com
Fri May 12 19:06:08 UTC 2023


Reviewed-by: Eugene Loh <eugene.loh at oracle.com>
though need copyright year updates on:
libdtrace/dt_prov_dtrace.c
libdtrace/dt_prov_fbt.c
libdtrace/dt_prov_rawtp.c
libdtrace/dt_prov_sdt.c
libdtrace/dt_prov_syscall.c
libdtrace/dt_prov_uprobe.c
and...

On 5/9/23 18:30, Kris Van Hees via DTrace-devel wrote:
> The trampoline callback can now return 1 to indicate that no calls
> should be made to clause functions (or 0 to retain the regular
> operation of calling the clause functions.

Need ')'.

> This will be used by some providers to attach to probes that perform
> auxiliary operations, e.g. setting up some data items that will be
> needed for the actual probe processing.
>
> Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
> ---
>   libdtrace/dt_cg.c           | 7 +++++--
>   libdtrace/dt_prov_cpc.c     | 4 +++-
>   libdtrace/dt_prov_dtrace.c  | 6 ++++--
>   libdtrace/dt_prov_fbt.c     | 4 +++-
>   libdtrace/dt_prov_proc.c    | 4 +++-
>   libdtrace/dt_prov_profile.c | 4 +++-
>   libdtrace/dt_prov_rawtp.c   | 4 +++-
>   libdtrace/dt_prov_sched.c   | 4 +++-
>   libdtrace/dt_prov_sdt.c     | 4 +++-
>   libdtrace/dt_prov_syscall.c | 4 +++-
>   libdtrace/dt_prov_uprobe.c  | 4 +++-
>   libdtrace/dt_provider.h     | 2 +-
>   12 files changed, 37 insertions(+), 14 deletions(-)
>
> diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
> index d308fe18..c8e95168 100644
> --- a/libdtrace/dt_cg.c
> +++ b/libdtrace/dt_cg.c
> @@ -590,13 +590,16 @@ dt_cg_add_dependent(dtrace_hdl_t *dtp, dt_probe_t *prp, void *arg)
>   	dt_ident_t	*idp = dt_dlib_add_probe_var(pcb->pcb_hdl, prp);
>   	dt_probe_t	*saved_prp = pcb->pcb_probe;
>   	uint_t		exitlbl = dt_irlist_label(dlp);
> +	int		skip = 0;
>   
>   	dt_cg_tramp_save_args(pcb);
>   	pcb->pcb_probe = prp;
>   	emite(dlp, BPF_STORE_IMM(BPF_W, BPF_REG_7, DMST_PRID, prp->desc->id), idp);
>   	if (prp->prov->impl->trampoline != NULL)
> -		prp->prov->impl->trampoline(pcb, exitlbl);
> -	dt_cg_tramp_call_clauses(pcb, prp, DT_ACTIVITY_ACTIVE);
> +		skip = prp->prov->impl->trampoline(pcb, exitlbl);
> +
> +	if (!skip)
> +		dt_cg_tramp_call_clauses(pcb, prp, DT_ACTIVITY_ACTIVE);
>   
>   	pcb->pcb_probe = saved_prp;
>   	dt_cg_tramp_restore_args(pcb);
> diff --git a/libdtrace/dt_prov_cpc.c b/libdtrace/dt_prov_cpc.c
> index 41418402..aec4367d 100644
> --- a/libdtrace/dt_prov_cpc.c
> +++ b/libdtrace/dt_prov_cpc.c
> @@ -383,7 +383,7 @@ static int provide(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp)
>    *         __u64 addr;
>    *     }
>    */
> -static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
> +static int trampoline(dt_pcb_t *pcb, uint_t exitlbl)
>   {
>   	int		i;
>   	dt_irlist_t	*dlp = &pcb->pcb_ir;
> @@ -406,6 +406,8 @@ static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
>   		emit(dlp, BPF_STORE_IMM(BPF_DW, BPF_REG_7, DMST_ARG(i), 0));
>   
>   	dt_cg_tramp_epilogue(pcb);
> +
> +	return 0;
>   }
>   
>   static int attach(dtrace_hdl_t *dtp, const dt_probe_t *prp, int bpf_fd)
> diff --git a/libdtrace/dt_prov_dtrace.c b/libdtrace/dt_prov_dtrace.c
> index 38158ace..27fa0cfd 100644
> --- a/libdtrace/dt_prov_dtrace.c
> +++ b/libdtrace/dt_prov_dtrace.c
> @@ -77,7 +77,7 @@ static int populate(dtrace_hdl_t *dtp)
>    * The trampoline will populate a dt_dctx_t struct and then call the function
>    * that implements the compiled D clause.  It returns 0 to the caller.
>    */
> -static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
> +static int trampoline(dt_pcb_t *pcb, uint_t exitlbl)
>   {
>   	dt_irlist_t	*dlp = &pcb->pcb_ir;
>   	dt_activity_t	act = DT_ACTIVITY_ACTIVE;
> @@ -90,7 +90,7 @@ static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
>   	 */
>   	if (strcmp(pcb->pcb_probe->desc->prb, "ERROR") == 0) {
>   		dt_cg_tramp_error(pcb);
> -		return;
> +		return 0;
>   	}
>   
>   	/*
> @@ -163,6 +163,8 @@ static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
>   		emit(dlp, BPF_STORE_IMM(BPF_DW, BPF_REG_7, DMST_ARG(i), 0));
>   
>   	dt_cg_tramp_epilogue_advance(pcb, act);
> +
> +	return 0;
>   }
>   
>   static char *uprobe_spec(const char *prb)
> diff --git a/libdtrace/dt_prov_fbt.c b/libdtrace/dt_prov_fbt.c
> index add76c55..462ab7ed 100644
> --- a/libdtrace/dt_prov_fbt.c
> +++ b/libdtrace/dt_prov_fbt.c
> @@ -148,7 +148,7 @@ static int populate(dtrace_hdl_t *dtp)
>    * The trampoline will populate a dt_dctx_t struct and then call the function
>    * that implements the compiled D clause.  It returns 0 to the caller.
>    */
> -static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
> +static int trampoline(dt_pcb_t *pcb, uint_t exitlbl)
>   {
>   	dt_cg_tramp_prologue(pcb);
>   
> @@ -177,6 +177,8 @@ static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
>   	} else
>   		dt_cg_tramp_copy_args_from_regs(pcb, 1);
>   	dt_cg_tramp_epilogue(pcb);
> +
> +	return 0;
>   }
>   
>   static int attach(dtrace_hdl_t *dtp, const dt_probe_t *prp, int bpf_fd)
> diff --git a/libdtrace/dt_prov_proc.c b/libdtrace/dt_prov_proc.c
> index 4544f594..2ed3e3f7 100644
> --- a/libdtrace/dt_prov_proc.c
> +++ b/libdtrace/dt_prov_proc.c
> @@ -293,7 +293,7 @@ static void enable(dtrace_hdl_t *dtp, dt_probe_t *prp)
>    * that implements the compiled D clause.  It returns the value that it gets
>    * back from that function.
>    */
> -static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
> +static int trampoline(dt_pcb_t *pcb, uint_t exitlbl)
>   {
>   	dtrace_hdl_t	*dtp = pcb->pcb_hdl;
>   	dt_irlist_t	*dlp = &pcb->pcb_ir;
> @@ -379,6 +379,8 @@ static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
>   		emit(dlp, BPF_STORE(BPF_DW, BPF_REG_7, DMST_ARG(0), BPF_REG_0));
>   		emit(dlp, BPF_STORE(BPF_DW, BPF_REG_7, DMST_ARG(1), BPF_REG_1));
>   	}
> +
> +	return 0;
>   }
>   
>   static int probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp,
> diff --git a/libdtrace/dt_prov_profile.c b/libdtrace/dt_prov_profile.c
> index 229c96ee..22dcca5c 100644
> --- a/libdtrace/dt_prov_profile.c
> +++ b/libdtrace/dt_prov_profile.c
> @@ -213,7 +213,7 @@ static int provide(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp)
>    *         __u64 addr;
>    *     }
>    */
> -static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
> +static int trampoline(dt_pcb_t *pcb, uint_t exitlbl)
>   {
>   	int		i;
>   	dt_irlist_t	*dlp = &pcb->pcb_ir;
> @@ -252,6 +252,8 @@ static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
>   		emit(dlp, BPF_STORE_IMM(BPF_DW, BPF_REG_7, DMST_ARG(i), 0));
>   
>   	dt_cg_tramp_epilogue(pcb);
> +
> +	return 0;
>   }
>   
>   static int attach(dtrace_hdl_t *dtp, const dt_probe_t *prp, int bpf_fd)
> diff --git a/libdtrace/dt_prov_rawtp.c b/libdtrace/dt_prov_rawtp.c
> index ac95df34..9954495c 100644
> --- a/libdtrace/dt_prov_rawtp.c
> +++ b/libdtrace/dt_prov_rawtp.c
> @@ -131,7 +131,7 @@ static int populate(dtrace_hdl_t *dtp)
>    * that implements the compiled D clause.  It returns the value that it gets
>    * back from that function.
>    */
> -static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
> +static int trampoline(dt_pcb_t *pcb, uint_t exitlbl)
>   {
>   	int		i;
>   	dt_irlist_t	*dlp = &pcb->pcb_ir;
> @@ -153,6 +153,8 @@ static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
>   	}
>   
>   	dt_cg_tramp_epilogue(pcb);
> +
> +	return 0;
>   }
>   
>   static int probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp,
> diff --git a/libdtrace/dt_prov_sched.c b/libdtrace/dt_prov_sched.c
> index 0308e212..dfa8c1a2 100644
> --- a/libdtrace/dt_prov_sched.c
> +++ b/libdtrace/dt_prov_sched.c
> @@ -182,7 +182,7 @@ static void enable(dtrace_hdl_t *dtp, dt_probe_t *prp)
>    * that implements the compiled D clause.  It returns the value that it gets
>    * back from that function.
>    */
> -static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
> +static int trampoline(dt_pcb_t *pcb, uint_t exitlbl)
>   {
>   	dtrace_hdl_t	*dtp = pcb->pcb_hdl;
>   	dt_irlist_t	*dlp = &pcb->pcb_ir;
> @@ -195,6 +195,8 @@ static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
>   		emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, BPF_REG_7, DMST_ARG(3)));
>                   emit(dlp, BPF_BRANCH_IMM(BPF_JGE, BPF_REG_0, 1 << 8, pcb->pcb_exitlbl));
>   	}
> +
> +	return 0;
>   }
>   
>   static int probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp,
> diff --git a/libdtrace/dt_prov_sdt.c b/libdtrace/dt_prov_sdt.c
> index dd0d06f0..bfb699a5 100644
> --- a/libdtrace/dt_prov_sdt.c
> +++ b/libdtrace/dt_prov_sdt.c
> @@ -128,7 +128,7 @@ static int populate(dtrace_hdl_t *dtp)
>    * that implements the compiled D clause.  It returns the value that it gets
>    * back from that function.
>    */
> -static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
> +static int trampoline(dt_pcb_t *pcb, uint_t exitlbl)
>   {
>   	int		i;
>   	dt_irlist_t	*dlp = &pcb->pcb_ir;
> @@ -182,6 +182,8 @@ static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
>   		emit(dlp, BPF_STORE_IMM(BPF_DW, BPF_REG_7, DMST_ARG(i), 0));
>   
>   	dt_cg_tramp_epilogue(pcb);
> +
> +	return 0;
>   }
>   
>   static int probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp,
> diff --git a/libdtrace/dt_prov_syscall.c b/libdtrace/dt_prov_syscall.c
> index 18d451f8..13afb73a 100644
> --- a/libdtrace/dt_prov_syscall.c
> +++ b/libdtrace/dt_prov_syscall.c
> @@ -131,7 +131,7 @@ static int populate(dtrace_hdl_t *dtp)
>    * The trampoline will populate a dt_dctx_t struct and then call the function
>    * that implements the compiled D clause.  It returns 0 to the caller.
>    */
> -static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
> +static int trampoline(dt_pcb_t *pcb, uint_t exitlbl)
>   {
>   	int		i;
>   	dt_irlist_t	*dlp = &pcb->pcb_ir;
> @@ -188,6 +188,8 @@ static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
>   	}
>   
>   	dt_cg_tramp_epilogue(pcb);
> +
> +	return 0;
>   }
>   
>   static int probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp,
> diff --git a/libdtrace/dt_prov_uprobe.c b/libdtrace/dt_prov_uprobe.c
> index f85d1529..9797bad2 100644
> --- a/libdtrace/dt_prov_uprobe.c
> +++ b/libdtrace/dt_prov_uprobe.c
> @@ -344,7 +344,7 @@ static void enable(dtrace_hdl_t *dtp, dt_probe_t *prp)
>    * The trampoline will first populate a dt_dctx_t struct.  It will then emulate
>    * the firing of all dependent pid* probes and their clauses.
>    */
> -static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
> +static int trampoline(dt_pcb_t *pcb, uint_t exitlbl)
>   {
>   	dt_irlist_t		*dlp = &pcb->pcb_ir;
>   	const dt_probe_t	*prp = pcb->pcb_probe;
> @@ -418,6 +418,8 @@ static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
>   	}
>   
>   	dt_cg_tramp_return(pcb);
> +
> +	return 0;
>   }
>   
>   static int attach(dtrace_hdl_t *dtp, const dt_probe_t *prp, int bpf_fd)
> diff --git a/libdtrace/dt_provider.h b/libdtrace/dt_provider.h
> index f3b21f55..d45244fe 100644
> --- a/libdtrace/dt_provider.h
> +++ b/libdtrace/dt_provider.h
> @@ -63,7 +63,7 @@ typedef struct dt_provimpl {
>   		       const pid_probespec_t *psp);
>   	void (*enable)(dtrace_hdl_t *dtp,	/* enable the given probe */
>   		       struct dt_probe *prp);
> -	void (*trampoline)(dt_pcb_t *pcb,	/* generate BPF trampoline */
> +	int (*trampoline)(dt_pcb_t *pcb,	/* generate BPF trampoline */
>   			   uint_t exitlbl);
>   	int (*attach)(dtrace_hdl_t *dtp,	/* attach BPF prog to probe */
>   		      const struct dt_probe *prp, int bpf_fd);



More information about the DTrace-devel mailing list