From 5a9479dcba0b43d326569fa0bd48318222d23fcb Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Wed, 18 May 2011 23:57:08 -0400 Subject: [PATCH] Fix ftrace support Signed-off-by: Mathieu Desnoyers --- probes/lttng-ftrace.c | 13 ++++---- wrapper/ftrace.h | 70 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 6 deletions(-) create mode 100644 wrapper/ftrace.h diff --git a/probes/lttng-ftrace.c b/probes/lttng-ftrace.c index 4b7be183..3ec000ae 100644 --- a/probes/lttng-ftrace.c +++ b/probes/lttng-ftrace.c @@ -12,10 +12,11 @@ #include #include "../ltt-events.h" #include "../wrapper/ringbuffer/frontend_types.h" +#include "../wrapper/ftrace.h" #include "../ltt-tracer.h" static -int lttng_ftrace_handler(unsigned long ip, unsigned long parent_ip, void **data) +void lttng_ftrace_handler(unsigned long ip, unsigned long parent_ip, void **data) { struct ltt_event *event = *data; struct ltt_channel *chan = event->chan; @@ -27,18 +28,18 @@ int lttng_ftrace_handler(unsigned long ip, unsigned long parent_ip, void **data) int ret; if (!ACCESS_ONCE(chan->session->active)) - return 0; + return; lib_ring_buffer_ctx_init(&ctx, chan->chan, NULL, sizeof(payload), ltt_alignof(payload), -1); ret = chan->ops->event_reserve(&ctx); if (ret < 0) - return 0; + return; payload.ip = ip; payload.parent_ip = parent_ip; lib_ring_buffer_align_ctx(&ctx, ltt_alignof(payload)); chan->ops->event_write(&ctx, &payload, sizeof(payload)); chan->ops->event_commit(&ctx); - return 0; + return; } /* @@ -108,7 +109,7 @@ int lttng_ftrace_register(const char *name, if (!event->u.ftrace.symbol_name) goto name_error; - ret = register_ftrace_function_probe(symbol_name, + ret = wrapper_register_ftrace_function_probe(event->u.ftrace.symbol_name, <tng_ftrace_ops, event); if (ret) goto register_error; @@ -126,7 +127,7 @@ EXPORT_SYMBOL_GPL(lttng_ftrace_register); void lttng_ftrace_unregister(struct ltt_event *event) { - unregister_ftrace_function_probe(event->u.ftrace.symbol_name, + wrapper_unregister_ftrace_function_probe(event->u.ftrace.symbol_name, <tng_ftrace_ops, event); kfree(event->u.ftrace.symbol_name); kfree(event->desc->name); diff --git a/wrapper/ftrace.h b/wrapper/ftrace.h new file mode 100644 index 00000000..44014692 --- /dev/null +++ b/wrapper/ftrace.h @@ -0,0 +1,70 @@ +#ifndef _LTT_WRAPPER_FTRACE_H +#define _LTT_WRAPPER_FTRACE_H + +/* + * Copyright (C) 2011 Mathieu Desnoyers (mathieu.desnoyers@efficios.com) + * + * wrapper around vmalloc_sync_all. Using KALLSYMS to get its address when + * available, else we need to have a kernel that exports this function to GPL + * modules. + * + * Dual LGPL v2.1/GPL v2 license. + */ + +#include + +#ifdef CONFIG_KALLSYMS + +#include + +static inline +int wrapper_register_ftrace_function_probe(char *glob, + struct ftrace_probe_ops *ops, void *data) +{ + int (*register_ftrace_function_probe_sym)(char *glob, + struct ftrace_probe_ops *ops, void *data); + + register_ftrace_function_probe_sym = (void *) kallsyms_lookup_name("register_ftrace_function_probe_sym"); + if (register_ftrace_function_probe_sym) { + return register_ftrace_function_probe_sym(glob, ops, data); + } else { + printk(KERN_WARNING "LTTng: register_ftrace_function_probe symbol lookup failed.\n"); + return -EINVAL; + } +} + +static inline +void wrapper_unregister_ftrace_function_probe(char *glob, + struct ftrace_probe_ops *ops, void *data) +{ + void (*unregister_ftrace_function_probe_sym)(char *glob, + struct ftrace_probe_ops *ops, void *data); + + unregister_ftrace_function_probe_sym = (void *) kallsyms_lookup_name("unregister_ftrace_function_probe_sym"); + if (unregister_ftrace_function_probe_sym) { + unregister_ftrace_function_probe_sym(glob, ops, data); + } else { + printk(KERN_WARNING "LTTng: unregister_ftrace_function_probe symbol lookup failed.\n"); + WARN_ON(1); + } +} + +#else + +static inline +int wrapper_register_ftrace_function_probe(char *glob, + struct ftrace_probe_ops *ops, void *data); + +{ + return unregister_ftrace_function_probe(); +} + +static inline +void wrapper_unregister_ftrace_function_probe(char *glob, + struct ftrace_probe_ops *ops, void *data); +{ + return unregister_ftrace_function_probe(); +} +#endif + +#endif /* _LTT_WRAPPER_FTRACE_H */ -- 2.34.1