#include <linux/slab.h>
#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;
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;
}
/*
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;
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);
--- /dev/null
+#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 <linux/ftrace.h>
+
+#ifdef CONFIG_KALLSYMS
+
+#include <linux/kallsyms.h>
+
+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 */