Re: [PATCH v11 22/28] tracing: Add enable_hist/disable_hist triggers

2015-11-03 Thread Tom Zanussi
On Tue, 2015-11-03 at 17:55 +0900, Namhyung Kim wrote:
> On Thu, Oct 22, 2015 at 01:14:26PM -0500, Tom Zanussi wrote:
> > Similar to enable_event/disable_event triggers, these triggers enable
> > and disable the aggregation of events into maps rather than enabling
> > and disabling their writing into the trace buffer.
> > 
> > They can be used to automatically start and stop hist triggers based
> > on a matching filter condition.
> > 
> > If there's a paused hist trigger on system:event, the following would
> > start it when the filter condition was hit:
> > 
> >   # echo enable_hist:system:event [ if filter] > event/trigger
> > 
> > And the following would disable a running system:event hist trigger:
> > 
> >   # echo disable_hist:system:event [ if filter] > event/trigger
> 
> What about named hist triggers?  Maybe worth adding
> "enable/disable_hist_name" too?
> 

enable_disable_hist should work fine with both named and unnamed hist
triggers.  As an example, the below sets a couple each of both named and
unnamed triggers and enables and disables them using
enable/disable_hist.  Running this I got the expected output i.e. there
were events captured in both named and unnamed histograms:

echo 'hist:name=foo:keys=skbaddr.hex:vals=len:pause if len < 0' > 
/sys/kernel/debug/tracing/events/net/netif_receive_skb/trigger
echo 'hist:name=foo:keys=skbaddr.hex:vals=len:pause if len > 256' > 
/sys/kernel/debug/tracing/events/net/netif_receive_skb/trigger
echo 'hist:keys=skbaddr.hex:vals=len:pause if len == 256' > 
/sys/kernel/debug/tracing/events/net/netif_receive_skb/trigger
echo 'hist:keys=skbaddr.hex:vals=len:pause' > 
/sys/kernel/debug/tracing/events/net/netif_receive_skb/trigger

echo 'enable_hist:net:netif_receive_skb if filename==/usr/bin/wget' > 
/sys/kernel/debug/tracing/events/sched/sched_process_exec/trigger
echo 'disable_hist:net:netif_receive_skb if comm==wget' > 
/sys/kernel/debug/tracing/events/sched/sched_process_exit/trigger

Thanks,

Tom

> Thanks,
> Namhyung
> 
> 
> > 
> > See Documentation/trace/events.txt for real examples.
> > 
> > Signed-off-by: Tom Zanussi 
> > Tested-by: Masami Hiramatsu 


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v11 22/28] tracing: Add enable_hist/disable_hist triggers

2015-11-03 Thread Namhyung Kim
On Thu, Oct 22, 2015 at 01:14:26PM -0500, Tom Zanussi wrote:
> Similar to enable_event/disable_event triggers, these triggers enable
> and disable the aggregation of events into maps rather than enabling
> and disabling their writing into the trace buffer.
> 
> They can be used to automatically start and stop hist triggers based
> on a matching filter condition.
> 
> If there's a paused hist trigger on system:event, the following would
> start it when the filter condition was hit:
> 
>   # echo enable_hist:system:event [ if filter] > event/trigger
> 
> And the following would disable a running system:event hist trigger:
> 
>   # echo disable_hist:system:event [ if filter] > event/trigger

What about named hist triggers?  Maybe worth adding
"enable/disable_hist_name" too?

Thanks,
Namhyung


> 
> See Documentation/trace/events.txt for real examples.
> 
> Signed-off-by: Tom Zanussi 
> Tested-by: Masami Hiramatsu 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v11 22/28] tracing: Add enable_hist/disable_hist triggers

2015-11-03 Thread Namhyung Kim
On Thu, Oct 22, 2015 at 01:14:26PM -0500, Tom Zanussi wrote:
> Similar to enable_event/disable_event triggers, these triggers enable
> and disable the aggregation of events into maps rather than enabling
> and disabling their writing into the trace buffer.
> 
> They can be used to automatically start and stop hist triggers based
> on a matching filter condition.
> 
> If there's a paused hist trigger on system:event, the following would
> start it when the filter condition was hit:
> 
>   # echo enable_hist:system:event [ if filter] > event/trigger
> 
> And the following would disable a running system:event hist trigger:
> 
>   # echo disable_hist:system:event [ if filter] > event/trigger

What about named hist triggers?  Maybe worth adding
"enable/disable_hist_name" too?

Thanks,
Namhyung


> 
> See Documentation/trace/events.txt for real examples.
> 
> Signed-off-by: Tom Zanussi 
> Tested-by: Masami Hiramatsu 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v11 22/28] tracing: Add enable_hist/disable_hist triggers

2015-11-03 Thread Tom Zanussi
On Tue, 2015-11-03 at 17:55 +0900, Namhyung Kim wrote:
> On Thu, Oct 22, 2015 at 01:14:26PM -0500, Tom Zanussi wrote:
> > Similar to enable_event/disable_event triggers, these triggers enable
> > and disable the aggregation of events into maps rather than enabling
> > and disabling their writing into the trace buffer.
> > 
> > They can be used to automatically start and stop hist triggers based
> > on a matching filter condition.
> > 
> > If there's a paused hist trigger on system:event, the following would
> > start it when the filter condition was hit:
> > 
> >   # echo enable_hist:system:event [ if filter] > event/trigger
> > 
> > And the following would disable a running system:event hist trigger:
> > 
> >   # echo disable_hist:system:event [ if filter] > event/trigger
> 
> What about named hist triggers?  Maybe worth adding
> "enable/disable_hist_name" too?
> 

enable_disable_hist should work fine with both named and unnamed hist
triggers.  As an example, the below sets a couple each of both named and
unnamed triggers and enables and disables them using
enable/disable_hist.  Running this I got the expected output i.e. there
were events captured in both named and unnamed histograms:

echo 'hist:name=foo:keys=skbaddr.hex:vals=len:pause if len < 0' > 
/sys/kernel/debug/tracing/events/net/netif_receive_skb/trigger
echo 'hist:name=foo:keys=skbaddr.hex:vals=len:pause if len > 256' > 
/sys/kernel/debug/tracing/events/net/netif_receive_skb/trigger
echo 'hist:keys=skbaddr.hex:vals=len:pause if len == 256' > 
/sys/kernel/debug/tracing/events/net/netif_receive_skb/trigger
echo 'hist:keys=skbaddr.hex:vals=len:pause' > 
/sys/kernel/debug/tracing/events/net/netif_receive_skb/trigger

echo 'enable_hist:net:netif_receive_skb if filename==/usr/bin/wget' > 
/sys/kernel/debug/tracing/events/sched/sched_process_exec/trigger
echo 'disable_hist:net:netif_receive_skb if comm==wget' > 
/sys/kernel/debug/tracing/events/sched/sched_process_exit/trigger

Thanks,

Tom

> Thanks,
> Namhyung
> 
> 
> > 
> > See Documentation/trace/events.txt for real examples.
> > 
> > Signed-off-by: Tom Zanussi 
> > Tested-by: Masami Hiramatsu 


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v11 22/28] tracing: Add enable_hist/disable_hist triggers

2015-10-22 Thread Tom Zanussi
Similar to enable_event/disable_event triggers, these triggers enable
and disable the aggregation of events into maps rather than enabling
and disabling their writing into the trace buffer.

They can be used to automatically start and stop hist triggers based
on a matching filter condition.

If there's a paused hist trigger on system:event, the following would
start it when the filter condition was hit:

  # echo enable_hist:system:event [ if filter] > event/trigger

And the following would disable a running system:event hist trigger:

  # echo disable_hist:system:event [ if filter] > event/trigger

See Documentation/trace/events.txt for real examples.

Signed-off-by: Tom Zanussi 
Tested-by: Masami Hiramatsu 
---
 include/linux/trace_events.h|   1 +
 kernel/trace/trace.c|   8 +++
 kernel/trace/trace.h|  32 ++
 kernel/trace/trace_events_hist.c| 115 
 kernel/trace/trace_events_trigger.c |  71 --
 5 files changed, 196 insertions(+), 31 deletions(-)

diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h
index 4ebf22e..64d96f1 100644
--- a/include/linux/trace_events.h
+++ b/include/linux/trace_events.h
@@ -415,6 +415,7 @@ enum event_trigger_type {
ETT_STACKTRACE  = (1 << 2),
ETT_EVENT_ENABLE= (1 << 3),
ETT_EVENT_HIST  = (1 << 4),
+   ETT_HIST_ENABLE = (1 << 5),
 };
 
 extern int filter_match_preds(struct event_filter *filter, void *rec);
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index f3021f0..9e679dd 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -3772,6 +3772,10 @@ static const char readme_msg[] =
"\t   trigger: traceon, traceoff\n"
"\tenable_event::\n"
"\tdisable_event::\n"
+#ifdef CONFIG_HIST_TRIGGERS
+   "\tenable_hist::\n"
+   "\tdisable_hist::\n"
+#endif
 #ifdef CONFIG_STACKTRACE
"\t\tstacktrace\n"
 #endif
@@ -3832,6 +3836,10 @@ static const char readme_msg[] =
"\tThe 'clear' parameter will clear the contents of a running\n"
"\thist trigger and leave its current paused/active state\n"
"\tunchanged.\n\n"
+   "\tThe enable_hist and disable_hist triggers can be used to\n"
+   "\thave one event conditionally start and stop another event's\n"
+   "\talready-attached hist trigger.  The syntax is analagous to\n"
+   "\tthe enable_event and disable_event triggers.\n"
 #endif
 ;
 
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index cbf59fd..bbc091a 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -1160,8 +1160,10 @@ extern const struct file_operations event_hist_fops;
 
 #ifdef CONFIG_HIST_TRIGGERS
 extern int register_trigger_hist_cmd(void);
+extern int register_trigger_hist_enable_disable_cmds(void);
 #else
 static inline int register_trigger_hist_cmd(void) { return 0; }
+static inline int register_trigger_hist_enable_disable_cmds(void) { return 0; }
 #endif
 
 extern int register_trigger_cmds(void);
@@ -1179,6 +1181,34 @@ struct event_trigger_data {
struct list_headlist;
 };
 
+/* Avoid typos */
+#define ENABLE_EVENT_STR   "enable_event"
+#define DISABLE_EVENT_STR  "disable_event"
+#define ENABLE_HIST_STR"enable_hist"
+#define DISABLE_HIST_STR   "disable_hist"
+
+struct enable_trigger_data {
+   struct trace_event_file *file;
+   boolenable;
+   boolhist;
+};
+
+extern int event_enable_trigger_print(struct seq_file *m,
+ struct event_trigger_ops *ops,
+ struct event_trigger_data *data);
+extern void event_enable_trigger_free(struct event_trigger_ops *ops,
+ struct event_trigger_data *data);
+extern int event_enable_trigger_func(struct event_command *cmd_ops,
+struct trace_event_file *file,
+char *glob, char *cmd, char *param);
+extern int event_enable_register_trigger(char *glob,
+struct event_trigger_ops *ops,
+struct event_trigger_data *data,
+struct trace_event_file *file);
+extern void event_enable_unregister_trigger(char *glob,
+   struct event_trigger_ops *ops,
+   struct event_trigger_data *test,
+   struct trace_event_file *file);
 extern void trigger_data_free(struct event_trigger_data *data);
 extern int event_trigger_init(struct event_trigger_ops *ops,
  struct event_trigger_data *data);
@@ -1192,6 +1222,8 @@ extern int 

[PATCH v11 22/28] tracing: Add enable_hist/disable_hist triggers

2015-10-22 Thread Tom Zanussi
Similar to enable_event/disable_event triggers, these triggers enable
and disable the aggregation of events into maps rather than enabling
and disabling their writing into the trace buffer.

They can be used to automatically start and stop hist triggers based
on a matching filter condition.

If there's a paused hist trigger on system:event, the following would
start it when the filter condition was hit:

  # echo enable_hist:system:event [ if filter] > event/trigger

And the following would disable a running system:event hist trigger:

  # echo disable_hist:system:event [ if filter] > event/trigger

See Documentation/trace/events.txt for real examples.

Signed-off-by: Tom Zanussi 
Tested-by: Masami Hiramatsu 
---
 include/linux/trace_events.h|   1 +
 kernel/trace/trace.c|   8 +++
 kernel/trace/trace.h|  32 ++
 kernel/trace/trace_events_hist.c| 115 
 kernel/trace/trace_events_trigger.c |  71 --
 5 files changed, 196 insertions(+), 31 deletions(-)

diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h
index 4ebf22e..64d96f1 100644
--- a/include/linux/trace_events.h
+++ b/include/linux/trace_events.h
@@ -415,6 +415,7 @@ enum event_trigger_type {
ETT_STACKTRACE  = (1 << 2),
ETT_EVENT_ENABLE= (1 << 3),
ETT_EVENT_HIST  = (1 << 4),
+   ETT_HIST_ENABLE = (1 << 5),
 };
 
 extern int filter_match_preds(struct event_filter *filter, void *rec);
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index f3021f0..9e679dd 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -3772,6 +3772,10 @@ static const char readme_msg[] =
"\t   trigger: traceon, traceoff\n"
"\tenable_event::\n"
"\tdisable_event::\n"
+#ifdef CONFIG_HIST_TRIGGERS
+   "\tenable_hist::\n"
+   "\tdisable_hist::\n"
+#endif
 #ifdef CONFIG_STACKTRACE
"\t\tstacktrace\n"
 #endif
@@ -3832,6 +3836,10 @@ static const char readme_msg[] =
"\tThe 'clear' parameter will clear the contents of a running\n"
"\thist trigger and leave its current paused/active state\n"
"\tunchanged.\n\n"
+   "\tThe enable_hist and disable_hist triggers can be used to\n"
+   "\thave one event conditionally start and stop another event's\n"
+   "\talready-attached hist trigger.  The syntax is analagous to\n"
+   "\tthe enable_event and disable_event triggers.\n"
 #endif
 ;
 
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index cbf59fd..bbc091a 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -1160,8 +1160,10 @@ extern const struct file_operations event_hist_fops;
 
 #ifdef CONFIG_HIST_TRIGGERS
 extern int register_trigger_hist_cmd(void);
+extern int register_trigger_hist_enable_disable_cmds(void);
 #else
 static inline int register_trigger_hist_cmd(void) { return 0; }
+static inline int register_trigger_hist_enable_disable_cmds(void) { return 0; }
 #endif
 
 extern int register_trigger_cmds(void);
@@ -1179,6 +1181,34 @@ struct event_trigger_data {
struct list_headlist;
 };
 
+/* Avoid typos */
+#define ENABLE_EVENT_STR   "enable_event"
+#define DISABLE_EVENT_STR  "disable_event"
+#define ENABLE_HIST_STR"enable_hist"
+#define DISABLE_HIST_STR   "disable_hist"
+
+struct enable_trigger_data {
+   struct trace_event_file *file;
+   boolenable;
+   boolhist;
+};
+
+extern int event_enable_trigger_print(struct seq_file *m,
+ struct event_trigger_ops *ops,
+ struct event_trigger_data *data);
+extern void event_enable_trigger_free(struct event_trigger_ops *ops,
+ struct event_trigger_data *data);
+extern int event_enable_trigger_func(struct event_command *cmd_ops,
+struct trace_event_file *file,
+char *glob, char *cmd, char *param);
+extern int event_enable_register_trigger(char *glob,
+struct event_trigger_ops *ops,
+struct event_trigger_data *data,
+struct trace_event_file *file);
+extern void event_enable_unregister_trigger(char *glob,
+   struct event_trigger_ops *ops,
+   struct event_trigger_data *test,
+   struct trace_event_file *file);
 extern void trigger_data_free(struct event_trigger_data *data);
 extern int event_trigger_init(struct event_trigger_ops *ops,
  struct