[DTrace-devel] [PATCH 4/6] fbt: do not provide untraceable functions (for fprobes)

Kris Van Hees kris.van.hees at oracle.com
Tue Apr 28 19:05:25 UTC 2026


Ensure that we do not provide FBT probes for functions that cannot be
probed using BPF fentry/fexit probes if fprobes are the default.

The provide_probe() function now takes a dt_module_t argument so that
dt_btf_func_is_traceable() can be called.

Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 libdtrace/dt_prov_fbt.c | 39 ++++++++++++++++++++++++++-------------
 1 file changed, 26 insertions(+), 13 deletions(-)

diff --git a/libdtrace/dt_prov_fbt.c b/libdtrace/dt_prov_fbt.c
index 59e4583b2..d6f57c67f 100644
--- a/libdtrace/dt_prov_fbt.c
+++ b/libdtrace/dt_prov_fbt.c
@@ -86,14 +86,31 @@ static int populate(dtrace_hdl_t *dtp)
 }
 
 /* Create a probe (if it does not exist yet). */
-static int provide_probe(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp)
+static int provide_probe(dtrace_hdl_t *dtp, dt_module_t *dmp,
+			 dtrace_probedesc_t *pdp)
 {
 	dt_provider_t	*prv = dt_provider_lookup(dtp, pdp->prv);
 
 	if (prv == NULL)
 		return 0;
+	pdp->mod = dmp->dm_name;
 	if (dt_probe_lookup(dtp, pdp) != NULL)
 		return 0;
+
+	/*
+	 * Do not provide fentry/fexit-based probes for functions that BPF does
+	 * not currently support (see dt_btf_func_is_traceable() for more
+	 * details).
+	 */
+	if (prv->impl->prog_type == BPF_PROG_TYPE_TRACING) {
+		int32_t	btf_id;
+
+		btf_id = dt_btf_lookup_name_kind(dtp, dmp, pdp->fun, BTF_KIND_FUNC);
+		if (btf_id <= 0 ||
+		    !dt_btf_func_is_traceable(dtp, dmp->dm_btf, btf_id))
+			return -1;
+	}
+
 	if (dt_tp_probe_insert(dtp, prv, pdp->prv, pdp->mod, pdp->fun, pdp->prb))
 		return 1;
 
@@ -173,16 +190,15 @@ static int provide(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp)
 
 			pd.id = DTRACE_IDNONE;
 			pd.prv = pdp->prv;
-			pd.mod = dmp->dm_name;
 			pd.fun = pdp->fun;
 
 			if (prb & FBT_ENTRY) {
 				pd.prb = "entry";
-				n += provide_probe(dtp, &pd);
+				n += provide_probe(dtp, dmp, &pd);
 			}
 			if (prb & FBT_RETURN) {
 				pd.prb = "return";
-				n += provide_probe(dtp, &pd);
+				n += provide_probe(dtp, dmp, &pd);
 			}
 
 			return n;
@@ -190,22 +206,20 @@ static int provide(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp)
 
 		sym = dt_symbol_by_name(dtp, pdp->fun);
 		while (sym != NULL) {
-			const char	*mod = dt_symbol_module(sym)->dm_name;
-
+			dmp = dt_symbol_module(sym);
 			if (dt_symbol_traceable(sym) &&
-			    dt_gmatch(mod, pdp->mod)) {
+			    dt_gmatch(dmp->dm_name, pdp->mod)) {
 				pd.id = DTRACE_IDNONE;
 				pd.prv = pdp->prv;
-				pd.mod = mod;
 				pd.fun = pdp->fun;
 
 				if (prb & FBT_ENTRY) {
 					pd.prb = "entry";
-					n += provide_probe(dtp, &pd);
+					n += provide_probe(dtp, dmp, &pd);
 				}
 				if (prb & FBT_RETURN) {
 					pd.prb = "return";
-					n += provide_probe(dtp, &pd);
+					n += provide_probe(dtp, dmp, &pd);
 				}
 
 			}
@@ -242,16 +256,15 @@ static int provide(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp)
 
 		pd.id = DTRACE_IDNONE;
 		pd.prv = pdp->prv;
-		pd.mod = smp->dm_name;
 		pd.fun = fun;
 
 		if (prb & FBT_ENTRY) {
 			pd.prb = "entry";
-			n += provide_probe(dtp, &pd);
+			n += provide_probe(dtp, smp, &pd);
 		}
 		if (prb & FBT_RETURN) {
 			pd.prb = "return";
-			n += provide_probe(dtp, &pd);
+			n += provide_probe(dtp, smp, &pd);
 		}
 	}
 
-- 
2.53.0




More information about the DTrace-devel mailing list