[lttng-dev] [PATCH 10/15] lttng: remove ftrace function tracer support (but keep

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Wed Nov 30 13:34:23 EST 2011


LTTng was using a non-exported ftrace symbol,
register_ftrace_function_probe(), for function-by-function selection for
function tracing.

We prefer to use kretprobes to do this, which gives us function entry
and exit.

Ftrace function tracer approach makes sense when selecting _all_
functions for tracing and calling one single callback (with same data)
to receive all the callback calls without polluting the cache too much.
This is now available to modules with register_ftrace_function(), but
does not allow private data pointer -- which goes against the LTTng
"session-based" tracing semantic.

We'll probably add back ftrace function tracing support for tracing "all
functions" at some point when the ftrace API supports private data.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
---
 drivers/staging/lttng/README                |    4 +-
 drivers/staging/lttng/ltt-events.c          |    9 +-
 drivers/staging/lttng/probes/Makefile       |    4 -
 drivers/staging/lttng/probes/lttng-ftrace.c |  187 ---------------------------
 drivers/staging/lttng/wrapper/ftrace.h      |   70 ----------
 5 files changed, 3 insertions(+), 271 deletions(-)
 delete mode 100644 drivers/staging/lttng/probes/lttng-ftrace.c
 delete mode 100644 drivers/staging/lttng/wrapper/ftrace.h

diff --git a/drivers/staging/lttng/README b/drivers/staging/lttng/README
index a154d6e..a808ee9 100644
--- a/drivers/staging/lttng/README
+++ b/drivers/staging/lttng/README
@@ -8,8 +8,8 @@ tree. It features (new features since LTTng 0.x):
 
 - Produces CTF (Common Trace Format) natively,
   (http://www.efficios.com/ctf)
-- Tracepoints, Function tracer, CPU Performance Monitoring Unit (PMU)
-  counters, kprobes, and kretprobes support,
+- Tracepoints, CPU Performance Monitoring Unit (PMU) counters, kprobes, and
+  kretprobes (function entry/exit) support,
 - Integrated interface for both kernel and userspace tracing,
 - Have the ability to attach "context" information to events in the
   trace (e.g. any PMU counter, pid, ppid, tid, comm name, etc).
diff --git a/drivers/staging/lttng/ltt-events.c b/drivers/staging/lttng/ltt-events.c
index f7438c5..de1372c 100644
--- a/drivers/staging/lttng/ltt-events.c
+++ b/drivers/staging/lttng/ltt-events.c
@@ -357,14 +357,7 @@ struct ltt_event *ltt_event_create(struct ltt_channel *chan,
 		break;
 	}
 	case LTTNG_KERNEL_FUNCTION:
-		ret = lttng_ftrace_register(event_param->name,
-				event_param->u.ftrace.symbol_name,
-				event);
-		if (ret)
-			goto register_error;
-		ret = try_module_get(event->desc->owner);
-		WARN_ON_ONCE(!ret);
-		break;
+		goto register_error;
 	case LTTNG_KERNEL_NOOP:
 		event->desc = internal_desc;
 		if (!event->desc)
diff --git a/drivers/staging/lttng/probes/Makefile b/drivers/staging/lttng/probes/Makefile
index bdc1179..78ab9f7 100644
--- a/drivers/staging/lttng/probes/Makefile
+++ b/drivers/staging/lttng/probes/Makefile
@@ -31,7 +31,3 @@ endif
 ifneq ($(CONFIG_KRETPROBES),)
 obj-m += lttng-kretprobes.o
 endif
-
-ifneq ($(CONFIG_DYNAMIC_FTRACE),)
-obj-m += lttng-ftrace.o
-endif
diff --git a/drivers/staging/lttng/probes/lttng-ftrace.c b/drivers/staging/lttng/probes/lttng-ftrace.c
deleted file mode 100644
index 7aae75b..0000000
--- a/drivers/staging/lttng/probes/lttng-ftrace.c
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * (C) Copyright	2009-2011 -
- * 		Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
- *
- * LTTng function tracer integration module.
- *
- * 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).
- *
- * TODO: Move to register_ftrace_function() (which is exported for
- * modules) for Linux >= 3.0. It is faster (only enables the selected
- * functions), and will stay there.
- */
-
-#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 "../ltt-tracer.h"
-
-static
-void lttng_ftrace_handler(unsigned long ip, unsigned long parent_ip, void **data)
-{
-	struct ltt_event *event = *data;
-	struct ltt_channel *chan = event->chan;
-	struct lib_ring_buffer_ctx ctx;
-	struct {
-		unsigned long ip;
-		unsigned long parent_ip;
-	} payload;
-	int ret;
-
-	if (unlikely(!ACCESS_ONCE(chan->session->active)))
-		return;
-	if (unlikely(!ACCESS_ONCE(chan->enabled)))
-		return;
-	if (unlikely(!ACCESS_ONCE(event->enabled)))
-		return;
-
-	lib_ring_buffer_ctx_init(&ctx, chan->chan, event,
-				 sizeof(payload), ltt_alignof(payload), -1);
-	ret = chan->ops->event_reserve(&ctx, event->id);
-	if (ret < 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;
-}
-
-/*
- * Create event description
- */
-static
-int lttng_create_ftrace_event(const char *name, struct ltt_event *event)
-{
-	struct lttng_event_field *fields;
-	struct lttng_event_desc *desc;
-	int ret;
-
-	desc = kzalloc(sizeof(*event->desc), GFP_KERNEL);
-	if (!desc)
-		return -ENOMEM;
-	desc->name = kstrdup(name, GFP_KERNEL);
-	if (!desc->name) {
-		ret = -ENOMEM;
-		goto error_str;
-	}
-	desc->nr_fields = 2;
-	desc->fields = fields =
-		kzalloc(2 * sizeof(struct lttng_event_field), GFP_KERNEL);
-	if (!desc->fields) {
-		ret = -ENOMEM;
-		goto error_fields;
-	}
-	fields[0].name = "ip";
-	fields[0].type.atype = atype_integer;
-	fields[0].type.u.basic.integer.size = sizeof(unsigned long) * CHAR_BIT;
-	fields[0].type.u.basic.integer.alignment = ltt_alignof(unsigned long) * CHAR_BIT;
-	fields[0].type.u.basic.integer.signedness = is_signed_type(unsigned long);
-	fields[0].type.u.basic.integer.reverse_byte_order = 0;
-	fields[0].type.u.basic.integer.base = 16;
-	fields[0].type.u.basic.integer.encoding = lttng_encode_none;
-
-	fields[1].name = "parent_ip";
-	fields[1].type.atype = atype_integer;
-	fields[1].type.u.basic.integer.size = sizeof(unsigned long) * CHAR_BIT;
-	fields[1].type.u.basic.integer.alignment = ltt_alignof(unsigned long) * CHAR_BIT;
-	fields[1].type.u.basic.integer.signedness = is_signed_type(unsigned long);
-	fields[1].type.u.basic.integer.reverse_byte_order = 0;
-	fields[1].type.u.basic.integer.base = 16;
-	fields[1].type.u.basic.integer.encoding = lttng_encode_none;
-
-	desc->owner = THIS_MODULE;
-	event->desc = desc;
-
-	return 0;
-
-error_fields:
-	kfree(desc->name);
-error_str:
-	kfree(desc);
-	return ret;
-}
-
-static
-struct ftrace_probe_ops lttng_ftrace_ops = {
-	.func = lttng_ftrace_handler,
-};
-
-int lttng_ftrace_register(const char *name,
-			  const char *symbol_name,
-			  struct ltt_event *event)
-{
-	int ret;
-
-	ret = lttng_create_ftrace_event(name, event);
-	if (ret)
-		goto error;
-
-	event->u.ftrace.symbol_name = kstrdup(symbol_name, GFP_KERNEL);
-	if (!event->u.ftrace.symbol_name)
-		goto name_error;
-
-	/* Ensure the memory we just allocated don't trigger page faults */
-	vmalloc_sync_all();
-
-	ret = wrapper_register_ftrace_function_probe(event->u.ftrace.symbol_name,
-			&lttng_ftrace_ops, event);
-	if (ret < 0)
-		goto register_error;
-	return 0;
-
-register_error:
-	kfree(event->u.ftrace.symbol_name);
-name_error:
-	kfree(event->desc->name);
-	kfree(event->desc);
-error:
-	return ret;
-}
-EXPORT_SYMBOL_GPL(lttng_ftrace_register);
-
-void lttng_ftrace_unregister(struct ltt_event *event)
-{
-	wrapper_unregister_ftrace_function_probe(event->u.ftrace.symbol_name,
-			&lttng_ftrace_ops, event);
-}
-EXPORT_SYMBOL_GPL(lttng_ftrace_unregister);
-
-void lttng_ftrace_destroy_private(struct ltt_event *event)
-{
-	kfree(event->u.ftrace.symbol_name);
-	kfree(event->desc->fields);
-	kfree(event->desc->name);
-	kfree(event->desc);
-}
-EXPORT_SYMBOL_GPL(lttng_ftrace_destroy_private);
-
-int lttng_ftrace_init(void)
-{
-	vmalloc_sync_all();
-	return 0;
-}
-module_init(lttng_ftrace_init)
-
-/*
- * Ftrace takes care of waiting for a grace period (RCU sched) at probe
- * unregistration, and disables preemption around probe call.
- */
-void lttng_ftrace_exit(void)
-{
-}
-module_exit(lttng_ftrace_exit)
-
-MODULE_LICENSE("GPL and additional rights");
-MODULE_AUTHOR("Mathieu Desnoyers");
-MODULE_DESCRIPTION("Linux Trace Toolkit Ftrace Support");
diff --git a/drivers/staging/lttng/wrapper/ftrace.h b/drivers/staging/lttng/wrapper/ftrace.h
deleted file mode 100644
index ace33c5..0000000
--- a/drivers/staging/lttng/wrapper/ftrace.h
+++ /dev/null
@@ -1,70 +0,0 @@
-#ifndef _LTT_WRAPPER_FTRACE_H
-#define _LTT_WRAPPER_FTRACE_H
-
-/*
- * Copyright (C) 2011 Mathieu Desnoyers (mathieu.desnoyers at 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>
-#include "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_funcptr("register_ftrace_function_probe");
-	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_funcptr("unregister_ftrace_function_probe");
-	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 register_ftrace_function_probe(glob, ops, data);
-}
-
-static inline
-void wrapper_unregister_ftrace_function_probe(char *glob,
-		struct ftrace_probe_ops *ops, void *data)
-{
-	return unregister_ftrace_function_probe(glob, ops, data);
-}
-#endif
-
-#endif /* _LTT_WRAPPER_FTRACE_H */
-- 
1.7.5.4




More information about the lttng-dev mailing list