[DTrace-devel] [PATCH v2 dtrace 2/3] fbt: revert to kprobe impl if we cannot find BTF for fprobe function
Alan Maguire
alan.maguire at oracle.com
Fri Oct 11 10:28:09 UTC 2024
When using fprobes, it is possible the to-be-probed function does not
have a BTF representation. If this occurs, revert to using the kprobe
implementation.
Signed-off-by: Alan Maguire <alan.maguire at oracle.com>
---
libdtrace/dt_bpf.h | 5 +++++
libdtrace/dt_prov_fbt.c | 8 +++++++-
2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/libdtrace/dt_bpf.h b/libdtrace/dt_bpf.h
index 5716d232..dc4eb64d 100644
--- a/libdtrace/dt_bpf.h
+++ b/libdtrace/dt_bpf.h
@@ -32,6 +32,11 @@ extern "C" {
(dtp)->dt_bpffeatures |= (feat); \
} while (0)
+#define BPF_UNSET_FEATURE(dtp, feat) \
+ do { \
+ (dtp)->dt_bpffeatures ^= (feat); \
+ } while (0)
+
#define DT_CONST_PRID 1
#define DT_CONST_ARGC 2
#define DT_CONST_STBSZ 3
diff --git a/libdtrace/dt_prov_fbt.c b/libdtrace/dt_prov_fbt.c
index 0ba0fb71..15ffa137 100644
--- a/libdtrace/dt_prov_fbt.c
+++ b/libdtrace/dt_prov_fbt.c
@@ -232,8 +232,14 @@ static int fprobe_probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp,
btf_id = dt_btf_lookup_name_kind(dtp, dmp->dm_btf, desc->fun,
BTF_KIND_FUNC);
- if (btf_id <= 0)
+ if (btf_id <= 0) {
+ if (btf_id == -ENOENT) {
+ dt_dprintf("fbt: cannot use fprobes, reverting to kprobes\n");
+ BPF_UNSET_FEATURE(dtp, BPF_FEAT_FENTRY);
+ prp->prov->impl = &dt_fbt_kprobe;
+ }
goto done;
+ }
dt_tp_set_event_id(prp, btf_id);
--
2.43.5
More information about the DTrace-devel
mailing list