tracing/boot: Support multiple histograms for each event
Add multiple histograms support for each event. This allows
user to set multiple histograms to an event.
ftrace.[instance.INSTANCE.]event.GROUP.EVENT.hist[.N] {
...
}
The 'N' is a digit started string and it can be omitted
for the default histogram.
For example, multiple hist triggers example in the
Documentation/trace/histogram.rst can be written as below;
ftrace.event.net.netif_receive_skb.hist {
1 {
keys = skbaddr.hex
values = len
filter = len < 0
}
2 {
keys = skbaddr.hex
values = len
filter = len > 4096
}
3 {
keys = skbaddr.hex
values = len
filter = len == 256
}
4 {
keys = skbaddr.hex
values = len
}
5 {
keys = len
values = common_preempt_count
}
}
Link: https://lkml.kernel.org/r/162856125628.203126.15846930277378572120.stgit@devnote2
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
This commit is contained in:
committed by
Steven Rostedt (VMware)
parent
8993665abc
commit
17abd7c36c
@@ -324,7 +324,7 @@ trace_boot_hist_add_handlers(struct xbc_node *hnode, char **bufp,
|
|||||||
/*
|
/*
|
||||||
* Histogram boottime tracing syntax.
|
* Histogram boottime tracing syntax.
|
||||||
*
|
*
|
||||||
* ftrace.[instance.INSTANCE.]event.GROUP.EVENT.hist {
|
* ftrace.[instance.INSTANCE.]event.GROUP.EVENT.hist[.N] {
|
||||||
* keys = <KEY>[,...]
|
* keys = <KEY>[,...]
|
||||||
* values = <VAL>[,...]
|
* values = <VAL>[,...]
|
||||||
* sort = <SORT-KEY>[,...]
|
* sort = <SORT-KEY>[,...]
|
||||||
@@ -415,11 +415,37 @@ trace_boot_compose_hist_cmd(struct xbc_node *hnode, char *buf, size_t size)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
static int __init
|
static void __init
|
||||||
trace_boot_compose_hist_cmd(struct xbc_node *hnode, char *buf, size_t size)
|
trace_boot_init_histograms(struct trace_event_file *file,
|
||||||
|
struct xbc_node *hnode, char *buf, size_t size)
|
||||||
{
|
{
|
||||||
return -EOPNOTSUPP;
|
struct xbc_node *node;
|
||||||
|
const char *p;
|
||||||
|
|
||||||
|
xbc_node_for_each_subkey(hnode, node) {
|
||||||
|
p = xbc_node_get_data(node);
|
||||||
|
if (!isdigit(p[0]))
|
||||||
|
continue;
|
||||||
|
/* All digit started node should be instances. */
|
||||||
|
if (trace_boot_compose_hist_cmd(node, buf, size) == 0) {
|
||||||
|
if (trigger_process_regex(file, buf) < 0)
|
||||||
|
pr_err("Failed to apply hist trigger: %s\n", buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (xbc_node_find_child(hnode, "keys")) {
|
||||||
|
if (trace_boot_compose_hist_cmd(hnode, buf, size) == 0)
|
||||||
|
if (trigger_process_regex(file, buf) < 0)
|
||||||
|
pr_err("Failed to apply hist trigger: %s\n", buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static void __init
|
||||||
|
trace_boot_init_histograms(struct trace_event_file *file,
|
||||||
|
struct xbc_node *hnode, char *buf, size_t size)
|
||||||
|
{
|
||||||
|
/* do nothing */
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -465,11 +491,8 @@ trace_boot_init_one_event(struct trace_array *tr, struct xbc_node *gnode,
|
|||||||
pr_err("Failed to apply an action: %s\n", buf);
|
pr_err("Failed to apply an action: %s\n", buf);
|
||||||
}
|
}
|
||||||
anode = xbc_node_find_child(enode, "hist");
|
anode = xbc_node_find_child(enode, "hist");
|
||||||
if (anode &&
|
if (anode)
|
||||||
trace_boot_compose_hist_cmd(anode, buf, ARRAY_SIZE(buf)) == 0) {
|
trace_boot_init_histograms(file, anode, buf, ARRAY_SIZE(buf));
|
||||||
if (trigger_process_regex(file, buf) < 0)
|
|
||||||
pr_err("Failed to apply hist trigger: %s\n", buf);
|
|
||||||
}
|
|
||||||
} else if (xbc_node_find_value(enode, "actions", NULL))
|
} else if (xbc_node_find_value(enode, "actions", NULL))
|
||||||
pr_err("Failed to apply event actions because CONFIG_HIST_TRIGGERS is not set.\n");
|
pr_err("Failed to apply event actions because CONFIG_HIST_TRIGGERS is not set.\n");
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user