Mirror of the lttng-dev mailing list
 help / color / mirror / Atom feed
From: mathieu.desnoyers@efficios.com (Mathieu Desnoyers)
Subject: [lttng-dev] [PATCH 10/15] lttng: remove ftrace function tracer support (but keep
Date: Wed, 30 Nov 2011 13:34:23 -0500	[thread overview]
Message-ID: <1322678068-5255-11-git-send-email-mathieu.desnoyers@efficios.com> (raw)
In-Reply-To: <1322678068-5255-1-git-send-email-mathieu.desnoyers@efficios.com>

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




  parent reply	other threads:[~2011-11-30 18:34 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-11-30 18:34 [lttng-dev] LTTng wrapper cleanup Mathieu Desnoyers
2011-11-30 18:34 ` [lttng-dev] [PATCH 01/15] lttng lib: ring buffer: remove stale null-pointer Mathieu Desnoyers
2011-11-30 18:34 ` [lttng-dev] [PATCH 02/15] lttng lib: ring buffer remove duplicate null pointer Mathieu Desnoyers
2011-11-30 18:34 ` [lttng-dev] [PATCH 03/15] lttng lib: ring buffer move null pointer check to open Mathieu Desnoyers
2011-11-30 18:34 ` [lttng-dev] [PATCH 04/15] Export vmalloc_sync_all symbol to GPL modules Mathieu Desnoyers
2011-11-30 18:34 ` [lttng-dev] [PATCH 05/15] lttng wrapper: add missing include to kallsyms wrapper Mathieu Desnoyers
2011-11-30 18:34 ` [lttng-dev] [PATCH 06/15] Remove LTTng vmalloc_sync_all wrapper Mathieu Desnoyers
2011-11-30 18:34 ` [lttng-dev] [PATCH 07/15] fs/splice: export splice_to_pipe to modules Mathieu Desnoyers
2011-11-30 18:34 ` [lttng-dev] [PATCH 08/15] lttng: remove splice_to_pipe wrapper Mathieu Desnoyers
2011-11-30 18:34 ` [lttng-dev] [PATCH 09/15] lttng: remove perf_event_create_kernel_counter wrapper Mathieu Desnoyers
2011-11-30 18:34 ` Mathieu Desnoyers [this message]
2011-11-30 18:34 ` [lttng-dev] [PATCH 11/15] lttng: remove raw spinlock wrapper Mathieu Desnoyers
2011-11-30 18:34 ` [lttng-dev] [PATCH 12/15] lttng: remove uuid wrapper Mathieu Desnoyers
2011-11-30 18:34 ` [lttng-dev] [PATCH 13/15] Export task_prio to modules Mathieu Desnoyers
2011-11-30 18:34 ` [lttng-dev] [PATCH 14/15] lttng: remove task_prio wrapper Mathieu Desnoyers
2011-11-30 18:34 ` [lttng-dev] [PATCH 15/15] lttng: remove kallsyms wrapper Mathieu Desnoyers
2011-11-30 18:47 ` [lttng-dev] LTTng wrapper cleanup Greg KH
2011-11-30 19:13   ` Mathieu Desnoyers

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1322678068-5255-11-git-send-email-mathieu.desnoyers@efficios.com \
    --to=mathieu.desnoyers@efficios.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox