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

Kris Van Hees kris.van.hees at oracle.com
Tue May 9 22:30:20 UTC 2023


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.

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);
-- 
2.40.1




More information about the DTrace-devel mailing list