From: Alexei Starovoitov <ast@kernel.org>
introduce kernel_tracepoint_find_by_name() helper to let bpf core
find tracepoint by name and later attach bpf probe to a tracepoint
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
---
include/linux/tracepoint.h | 6 ++++++
kernel/tracepoint.c | 9 +++++++++
2 files changed, 15 insertions(+)
diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h
index c92f4adbc0d7..a00b84473211 100644
--- a/include/linux/tracepoint.h
+++ b/include/linux/tracepoint.h
@@ -43,6 +43,12 @@ tracepoint_probe_unregister(struct tracepoint *tp, void *probe, void *data);
extern void
for_each_kernel_tracepoint(void (*fct)(struct tracepoint *tp, void *priv),
void *priv);
+#ifdef CONFIG_TRACEPOINTS
+struct tracepoint *kernel_tracepoint_find_by_name(const char *name);
+#else
+static inline struct tracepoint *
+kernel_tracepoint_find_by_name(const char *name) { return NULL; }
+#endif
#ifdef CONFIG_MODULES
struct tp_module {diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c
index 671b13457387..e2a9a0391ae2 100644
--- a/kernel/tracepoint.c
+++ b/kernel/tracepoint.c
@@ -528,6 +528,15 @@ void for_each_kernel_tracepoint(void (*fct)(struct tracepoint *tp, void *priv),
}
EXPORT_SYMBOL_GPL(for_each_kernel_tracepoint);
+struct tracepoint *kernel_tracepoint_find_by_name(const char *name)
+{
+ struct tracepoint * const *tp = __start___tracepoints_ptrs;
+
+ for (; tp < __stop___tracepoints_ptrs; tp++)
+ if (!strcmp((*tp)->name, name))
+ return *tp;
+ return NULL;
+}
#ifdef CONFIG_HAVE_SYSCALL_TRACEPOINTS
/* NB: reg/unreg are called while guarded with the tracepoints_mutex */--
2.9.5