mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Yuanhan Liu <yuanhan.liu@linux.intel.com>
To: linux-kernel@vger.kernel.org
Cc: rostedt@goodmis.org, fweisbec@gmail.com, mingo@redhat.com,
	chris@chris-wilson.co.uk,
	Yuanhan Liu <yuanhan.liu@linux.intel.com>
Subject: [PATCH 2/4] tracing: introduce trace_set_clr_module_event
Date: Tue,  9 Nov 2010 17:12:45 +0800	[thread overview]
Message-ID: <1289293967-31761-2-git-send-email-yuanhan.liu@linux.intel.com> (raw)
In-Reply-To: <1289293967-31761-1-git-send-email-yuanhan.liu@linux.intel.com>

Trace events belong to a module does exist only when that module is
loaded. While, when the module loaded, we may miss some trace event
happened at the module load time.

This is so true for gpu driver: when X(or shell) is started, you would
be going to miss lots of events. This would be worse when the KMS is
failed.

So, introduce trace_set_clr_module_event function, and do export it.
Trace event then can be enabled on module load by doing something like
follows at your module init function:

char *xxx_trace = NULL;
module_param_named(trace, xxx_trace, charp, 0400);

xxx_init()
{
	....
	if (xxx_trace)
		ret = trace_set_clr_module_event(THIS_MODULE, xxx_trace, 1);
	....
}

where, xxx_trace is a comm separated event list, * for all event in that
module, NO subsystem is needed.

Signed-off-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
---
 include/linux/ftrace_event.h |    3 ++
 kernel/trace/trace_events.c  |   45 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 48 insertions(+), 0 deletions(-)

diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h
index 8beabb9..8fbdbbd 100644
--- a/include/linux/ftrace_event.h
+++ b/include/linux/ftrace_event.h
@@ -226,6 +226,9 @@ extern void trace_remove_event_call(struct ftrace_event_call *call);
 
 int trace_set_clr_event(const char *system, const char *event, int set);
 
+int trace_set_clr_module_event(struct module *mod, 
+			       const char *event_list, int set);
+
 /*
  * The double __builtin_constant_p is because gcc will give us an error
  * if we try to allocate the static variable to fmt if it is not a
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
index fe15b7c..711a1d1 100644
--- a/kernel/trace/trace_events.c
+++ b/kernel/trace/trace_events.c
@@ -1353,6 +1353,51 @@ static int trace_module_notify(struct notifier_block *self,
 
 	return 0;
 }
+
+/**
+ * trace_set_clr_module_event - enable or disable events for specified module
+ * @mod: the module, the caller should mostly pass by THIS_MODULE
+ * @event_list: the event list, separated by comma.
+ * @set: 1 to enable, 0 to disable
+ *
+ * This function is used by a module to enable or disable events belong to that 
+ * module. This is a way for module to enable some events on module loading.
+ */
+int trace_set_clr_module_event(struct module *mod, 
+				const char *event_list, int set)
+{
+	struct ftrace_event_call *call, *start, *end;
+	char *buf, *p;
+	char *token;
+
+	start = mod->trace_events;
+	end = mod->trace_events + mod->num_trace_events;
+	if (start == end)
+		return 0;
+	
+	if (!event_list)
+		return 0;
+	buf = p = kstrdup(event_list, GFP_KERNEL);
+	if (!buf)
+		return -ENOMEM;
+
+	for_each_token(token, p) {
+		for_each_event(call, start, end) {
+			if (strcmp(token, "*") == 0 ||
+			    strcmp(token, call->name) == 0) 
+				ftrace_event_enable_disable(call, set);
+			else
+				pr_warning("Failed to find trace event: %s "
+					   "in module %s\n", token, mod->name);
+		
+		}
+	}
+	kfree(buf);
+	return 0;
+}
+EXPORT_SYMBOL_GPL(trace_set_clr_module_event);
+
+
 #else
 static int trace_module_notify(struct notifier_block *self,
 			       unsigned long val, void *data)
-- 
1.7.2.3


  reply	other threads:[~2010-11-09  9:12 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-11-09  9:12 [PATCH 1/4] tracing: introduce for_each_token macro Yuanhan Liu
2010-11-09  9:12 ` Yuanhan Liu [this message]
2010-11-09 11:23   ` [PATCH 2/4] tracing: introduce trace_set_clr_module_event Yuanhan Liu
2010-11-09 11:27     ` Chris Wilson
2010-11-09 13:20       ` Yuanhan Liu
2010-11-09 13:31         ` Chris Wilson
2010-11-09 13:56           ` Steven Rostedt
2010-11-09 14:06             ` Yuanhan Liu
2010-11-09 13:59           ` Yuanhan Liu
2010-11-09 14:01             ` Steven Rostedt
2010-11-09 14:11           ` [PATCH] Delegate unknown module parameters to interested parties Chris Wilson
2010-11-09 14:39             ` Steven Rostedt
2010-11-10  5:51               ` Rusty Russell
2010-11-10 13:56                 ` Steven Rostedt
2010-11-11  0:35                   ` Rusty Russell
2010-11-11  1:05                     ` Steven Rostedt
2010-11-09  9:12 ` [PATCH 3/4] tracing: update trace-events-sample.c Yuanhan Liu
2010-11-09  9:12 ` [PATCH 4/4] tracing: update the trace/events.txt documentation Yuanhan Liu

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=1289293967-31761-2-git-send-email-yuanhan.liu@linux.intel.com \
    --to=yuanhan.liu@linux.intel.com \
    --cc=chris@chris-wilson.co.uk \
    --cc=fweisbec@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=rostedt@goodmis.org \
    /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

Powered by JetHome