[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