* Dual LGPL v2.1/GPL v2 license.
*/
+/*
+ * Ftrace function tracer does not seem to provide synchronization between probe
+ * teardown and callback execution. Therefore, we make this module permanently
+ * loaded (unloadable).
+ */
+
#include <linux/module.h>
#include <linux/ftrace.h>
#include <linux/slab.h>
#include "../ltt-events.h"
#include "../wrapper/ringbuffer/frontend_types.h"
+#include "../wrapper/ftrace.h"
+#include "../wrapper/vmalloc.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,
+ /* Ensure the memory we just allocated don't trigger page faults */
+ wrapper_vmalloc_sync_all();
+
+ 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);
}
EXPORT_SYMBOL_GPL(lttng_ftrace_unregister);
+/* This module is permanent. */
+int lttng_ftrace_init(void)
+{
+ wrapper_vmalloc_sync_all();
+ return 0;
+}
+module_init(lttng_ftrace_init)
+
MODULE_LICENSE("GPL and additional rights");
MODULE_AUTHOR("Mathieu Desnoyers");
MODULE_DESCRIPTION("Linux Trace Toolkit Ftrace Support");