Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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>

authored by

Masami Hiramatsu and committed by
Steven Rostedt (VMware)
17abd7c3 8993665a

+33 -10
+33 -10
kernel/trace/trace_boot.c
··· 324 324 /* 325 325 * Histogram boottime tracing syntax. 326 326 * 327 - * ftrace.[instance.INSTANCE.]event.GROUP.EVENT.hist { 327 + * ftrace.[instance.INSTANCE.]event.GROUP.EVENT.hist[.N] { 328 328 * keys = <KEY>[,...] 329 329 * values = <VAL>[,...] 330 330 * sort = <SORT-KEY>[,...] ··· 415 415 416 416 return 0; 417 417 } 418 - #else 419 - static int __init 420 - trace_boot_compose_hist_cmd(struct xbc_node *hnode, char *buf, size_t size) 418 + 419 + static void __init 420 + trace_boot_init_histograms(struct trace_event_file *file, 421 + struct xbc_node *hnode, char *buf, size_t size) 421 422 { 422 - return -EOPNOTSUPP; 423 + struct xbc_node *node; 424 + const char *p; 425 + 426 + xbc_node_for_each_subkey(hnode, node) { 427 + p = xbc_node_get_data(node); 428 + if (!isdigit(p[0])) 429 + continue; 430 + /* All digit started node should be instances. */ 431 + if (trace_boot_compose_hist_cmd(node, buf, size) == 0) { 432 + if (trigger_process_regex(file, buf) < 0) 433 + pr_err("Failed to apply hist trigger: %s\n", buf); 434 + } 435 + } 436 + 437 + if (xbc_node_find_child(hnode, "keys")) { 438 + if (trace_boot_compose_hist_cmd(hnode, buf, size) == 0) 439 + if (trigger_process_regex(file, buf) < 0) 440 + pr_err("Failed to apply hist trigger: %s\n", buf); 441 + } 442 + } 443 + #else 444 + static void __init 445 + trace_boot_init_histograms(struct trace_event_file *file, 446 + struct xbc_node *hnode, char *buf, size_t size) 447 + { 448 + /* do nothing */ 423 449 } 424 450 #endif 425 451 ··· 491 465 pr_err("Failed to apply an action: %s\n", buf); 492 466 } 493 467 anode = xbc_node_find_child(enode, "hist"); 494 - if (anode && 495 - trace_boot_compose_hist_cmd(anode, buf, ARRAY_SIZE(buf)) == 0) { 496 - if (trigger_process_regex(file, buf) < 0) 497 - pr_err("Failed to apply hist trigger: %s\n", buf); 498 - } 468 + if (anode) 469 + trace_boot_init_histograms(file, anode, buf, ARRAY_SIZE(buf)); 499 470 } else if (xbc_node_find_value(enode, "actions", NULL)) 500 471 pr_err("Failed to apply event actions because CONFIG_HIST_TRIGGERS is not set.\n"); 501 472