All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tom Zanussi <tom.zanussi@linux.intel.com>
To: rostedt@goodmis.org
Cc: masami.hiramatsu.pt@hitachi.com, namhyung@kernel.org,
	josh@joshtriplett.org, andi@firstfloor.org,
	mathieu.desnoyers@efficios.com, peterz@infradead.org,
	linux-kernel@vger.kernel.org,
	Tom Zanussi <tom.zanussi@linux.intel.com>
Subject: [PATCH v14 18/22] tracing: Add support for named triggers
Date: Wed, 24 Feb 2016 12:31:53 -0600	[thread overview]
Message-ID: <2010338979ec9d0d84e13323ed3c97f39da2a53a.1456333190.git.tom.zanussi@linux.intel.com> (raw)
In-Reply-To: <cover.1456333190.git.tom.zanussi@linux.intel.com>
In-Reply-To: <cover.1456333190.git.tom.zanussi@linux.intel.com>

Named triggers are sets of triggers that share a common set of trigger
data.  An example of functionality that could benefit from this type
of capability would be a set of inlined probes that would each
contribute event counts, for example, to a shared counter data
structure.

The first named trigger registered with a given name owns the common
trigger data that the others subsequently registered with the same
name will reference.  The functions defined here allow users to add,
delete, and find named triggers.

It also adds functions to pause and unpause named triggers; since
named triggers act upon common data, they should also be paused and
unpaused as a group.

Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
Tested-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Reviewed-by: Namhyung Kim <namhyung@kernel.org>
---
 kernel/trace/trace.h                |  13 ++++
 kernel/trace/trace_events_trigger.c | 143 ++++++++++++++++++++++++++++++++++++
 2 files changed, 156 insertions(+)

diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index 973427e..8ca697a 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -1183,7 +1183,11 @@ struct event_trigger_data {
 	char				*filter_str;
 	void				*private_data;
 	bool				paused;
+	bool				paused_tmp;
 	struct list_head		list;
+	char				*name;
+	struct list_head		named_list;
+	struct event_trigger_data	*named_data;
 };
 
 /* Avoid typos */
@@ -1226,6 +1230,15 @@ extern void unregister_trigger(char *glob, struct event_trigger_ops *ops,
 extern int set_trigger_filter(char *filter_str,
 			      struct event_trigger_data *trigger_data,
 			      struct trace_event_file *file);
+extern struct event_trigger_data *find_named_trigger(const char *name);
+extern bool is_named_trigger(struct event_trigger_data *test);
+extern int save_named_trigger(const char *name,
+			      struct event_trigger_data *data);
+extern void del_named_trigger(struct event_trigger_data *data);
+extern void pause_named_trigger(struct event_trigger_data *data);
+extern void unpause_named_trigger(struct event_trigger_data *data);
+extern void set_named_trigger_data(struct event_trigger_data *data,
+				   struct event_trigger_data *named_data);
 extern int register_event_command(struct event_command *cmd);
 extern int unregister_event_command(struct event_command *cmd);
 extern int register_trigger_hist_enable_disable_cmds(void);
diff --git a/kernel/trace/trace_events_trigger.c b/kernel/trace/trace_events_trigger.c
index 03109f1..02354ff 100644
--- a/kernel/trace/trace_events_trigger.c
+++ b/kernel/trace/trace_events_trigger.c
@@ -645,6 +645,7 @@ event_trigger_callback(struct event_command *cmd_ops,
 	trigger_data->ops = trigger_ops;
 	trigger_data->cmd_ops = cmd_ops;
 	INIT_LIST_HEAD(&trigger_data->list);
+	INIT_LIST_HEAD(&trigger_data->named_list);
 
 	if (glob[0] == '!') {
 		cmd_ops->unreg(glob+1, trigger_ops, trigger_data, file);
@@ -768,6 +769,148 @@ int set_trigger_filter(char *filter_str,
 	return ret;
 }
 
+static LIST_HEAD(named_triggers);
+
+/**
+ * find_named_trigger - Find the common named trigger associated with @name
+ * @name: The name of the set of named triggers to find the common data for
+ *
+ * Named triggers are sets of triggers that share a common set of
+ * trigger data.  The first named trigger registered with a given name
+ * owns the common trigger data that the others subsequently
+ * registered with the same name will reference.  This function
+ * returns the common trigger data associated with that first
+ * registered instance.
+ *
+ * Return: the common trigger data for the given named trigger on
+ * success, NULL otherwise.
+ */
+struct event_trigger_data *find_named_trigger(const char *name)
+{
+	struct event_trigger_data *data;
+
+	if (!name)
+		return NULL;
+
+	list_for_each_entry(data, &named_triggers, named_list) {
+		if (data->named_data)
+			continue;
+		if (strcmp(data->name, name) == 0)
+			return data;
+	}
+
+	return NULL;
+}
+
+/**
+ * is_named_trigger - determine if a given trigger is a named trigger
+ * @test: The trigger data to test
+ *
+ * Return: true if 'test' is a named trigger, false otherwise.
+ */
+bool is_named_trigger(struct event_trigger_data *test)
+{
+	struct event_trigger_data *data;
+
+	list_for_each_entry(data, &named_triggers, named_list) {
+		if (test == data)
+			return true;
+	}
+
+	return false;
+}
+
+/**
+ * save_named_trigger - save the trigger in the named trigger list
+ * @name: The name of the named trigger set
+ * @data: The trigger data to save
+ *
+ * Return: 0 if successful, negative error otherwise.
+ */
+int save_named_trigger(const char *name, struct event_trigger_data *data)
+{
+	data->name = kstrdup(name, GFP_KERNEL);
+	if (!data->name)
+		return -ENOMEM;
+
+	list_add(&data->named_list, &named_triggers);
+
+	return 0;
+}
+
+/**
+ * del_named_trigger - delete a trigger from the named trigger list
+ * @data: The trigger data to delete
+ */
+void del_named_trigger(struct event_trigger_data *data)
+{
+	kfree(data->name);
+	data->name = NULL;
+
+	list_del(&data->named_list);
+}
+
+static void __pause_named_trigger(struct event_trigger_data *data, bool pause)
+{
+	struct event_trigger_data *test;
+
+	list_for_each_entry(test, &named_triggers, named_list) {
+		if (strcmp(test->name, data->name) == 0) {
+			if (pause) {
+				test->paused_tmp = test->paused;
+				test->paused = true;
+			} else {
+				test->paused = test->paused_tmp;
+			}
+		}
+	}
+}
+
+/**
+ * pause_named_trigger - Pause all named triggers with the same name
+ * @data: The trigger data of a named trigger to pause
+ *
+ * Pauses a named trigger along with all other triggers having the
+ * same name.  Because named triggers share a common set of data,
+ * pausing only one is meaningless, so pausing one named trigger needs
+ * to pause all triggers with the same name.
+ */
+void pause_named_trigger(struct event_trigger_data *data)
+{
+	__pause_named_trigger(data, true);
+}
+
+/**
+ * unpause_named_trigger - Un-pause all named triggers with the same name
+ * @data: The trigger data of a named trigger to unpause
+ *
+ * Un-pauses a named trigger along with all other triggers having the
+ * same name.  Because named triggers share a common set of data,
+ * unpausing only one is meaningless, so unpausing one named trigger
+ * needs to unpause all triggers with the same name.
+ */
+void unpause_named_trigger(struct event_trigger_data *data)
+{
+	__pause_named_trigger(data, false);
+}
+
+/**
+ * set_named_trigger_data - Associate common named trigger data
+ * @data: The trigger data of a named trigger to unpause
+ *
+ * Named triggers are sets of triggers that share a common set of
+ * trigger data.  The first named trigger registered with a given name
+ * owns the common trigger data that the others subsequently
+ * registered with the same name will reference.  This function
+ * associates the common trigger data from the first trigger with the
+ * given trigger.
+ */
+void set_named_trigger_data(struct event_trigger_data *data,
+			    struct event_trigger_data *named_data)
+{
+	data->named_data = named_data;
+}
+
 static void
 traceon_trigger(struct event_trigger_data *data, void *rec)
 {
-- 
1.9.3

  parent reply	other threads:[~2016-02-24 18:33 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-24 18:31 [PATCH 00/22] tracing: 'hist' triggers Tom Zanussi
2016-02-24 18:31 ` [PATCH v14 01/22] tracing: Update some tracing_map constants and comments Tom Zanussi
2016-02-25  5:55   ` 平松雅巳 / HIRAMATU,MASAMI
2016-02-25 14:54     ` Tom Zanussi
2016-02-24 18:31 ` [PATCH v14 02/22] tracing: Add 'hist' event trigger command Tom Zanussi
2016-02-24 18:31 ` [PATCH v14 03/22] tracing: Add hist trigger support for multiple values ('vals=' param) Tom Zanussi
2016-02-24 18:31 ` [PATCH v14 04/22] tracing: Add hist trigger support for compound keys Tom Zanussi
2016-02-24 18:31 ` [PATCH v14 05/22] tracing: Add hist trigger support for user-defined sorting ('sort=' param) Tom Zanussi
2016-02-24 18:31 ` [PATCH v14 06/22] tracing: Add hist trigger support for pausing and continuing a trace Tom Zanussi
2016-02-24 18:31 ` [PATCH v14 07/22] tracing: Add hist trigger support for clearing " Tom Zanussi
2016-02-24 18:31 ` [PATCH v14 08/22] tracing: Add hist trigger 'hex' modifier for displaying numeric fields Tom Zanussi
2016-02-24 18:31 ` [PATCH v14 09/22] tracing: Add hist trigger 'sym' and 'sym-offset' modifiers Tom Zanussi
2016-02-24 18:31 ` [PATCH v14 10/22] tracing: Add hist trigger 'execname' modifier Tom Zanussi
2016-02-24 18:31 ` [PATCH v14 11/22] tracing: Add hist trigger 'syscall' modifier Tom Zanussi
2016-02-24 18:31 ` [PATCH v14 12/22] tracing: Add hist trigger support for stacktraces as keys Tom Zanussi
2016-02-24 18:31 ` [PATCH v14 13/22] tracing: Support string type key properly Tom Zanussi
2016-02-24 18:31 ` [PATCH v14 14/22] tracing: Remove restriction on string position in hist trigger keys Tom Zanussi
2016-02-24 18:31 ` [PATCH v14 15/22] tracing: Add enable_hist/disable_hist triggers Tom Zanussi
2016-02-24 18:31 ` [PATCH v14 16/22] tracing: Add 'hist' trigger Documentation Tom Zanussi
2016-02-24 18:31 ` [PATCH v14 17/22] tracing: Add support for multiple hist triggers per event Tom Zanussi
2016-02-24 18:31 ` Tom Zanussi [this message]
2016-02-24 18:31 ` [PATCH v14 19/22] tracing: Add support for named hist triggers Tom Zanussi
2016-02-24 18:31 ` [PATCH v14 20/22] kselftests/ftrace : Add event trigger testcases Tom Zanussi
2016-02-24 18:31 ` [PATCH v14 21/22] kselftests/ftrace: Add hist " Tom Zanussi
2016-02-24 18:31 ` [PATCH v14 22/22] tracing: Add hist trigger 'log2' modifier Tom Zanussi
2016-02-25  9:19 ` [PATCH] kselftests/ftrace: Add a test for log2 modifier of hist trigger Masami Hiramatsu
2016-02-25 14:56   ` Tom Zanussi

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=2010338979ec9d0d84e13323ed3c97f39da2a53a.1456333190.git.tom.zanussi@linux.intel.com \
    --to=tom.zanussi@linux.intel.com \
    --cc=andi@firstfloor.org \
    --cc=josh@joshtriplett.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=masami.hiramatsu.pt@hitachi.com \
    --cc=mathieu.desnoyers@efficios.com \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.