From: Alexei Starovoitov <a...@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 <a...@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

Reply via email to