]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
tracing/boot: Add instance node support
authorMasami Hiramatsu <mhiramat@kernel.org>
Fri, 10 Jan 2020 16:07:04 +0000 (01:07 +0900)
committerSteven Rostedt (VMware) <rostedt@goodmis.org>
Mon, 13 Jan 2020 18:19:42 +0000 (13:19 -0500)
Add instance node support to boot-time tracing. User can set
some options and event nodes under instance node.

 - ftrace.instance.INSTANCE[...]
   Add new INSTANCE instance. Some options and event nodes
   are acceptable for instance node.

Link: http://lkml.kernel.org/r/157867242413.17873.9814204526141500278.stgit@devnote2
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
kernel/trace/trace_boot.c

index 3054921b0877eb30bfa5fc65cd0d44364b2b3a5c..f5db30d25b0b37b3ab29414e5c1c79137ed95564 100644 (file)
@@ -20,7 +20,7 @@ extern ssize_t tracing_resize_ring_buffer(struct trace_array *tr,
                                          unsigned long size, int cpu_id);
 
 static void __init
-trace_boot_set_ftrace_options(struct trace_array *tr, struct xbc_node *node)
+trace_boot_set_instance_options(struct trace_array *tr, struct xbc_node *node)
 {
        struct xbc_node *anode;
        const char *p;
@@ -242,6 +242,40 @@ trace_boot_enable_tracer(struct trace_array *tr, struct xbc_node *node)
        }
 }
 
+static void __init
+trace_boot_init_one_instance(struct trace_array *tr, struct xbc_node *node)
+{
+       trace_boot_set_instance_options(tr, node);
+       trace_boot_init_events(tr, node);
+       trace_boot_enable_events(tr, node);
+       trace_boot_enable_tracer(tr, node);
+}
+
+static void __init
+trace_boot_init_instances(struct xbc_node *node)
+{
+       struct xbc_node *inode;
+       struct trace_array *tr;
+       const char *p;
+
+       node = xbc_node_find_child(node, "instance");
+       if (!node)
+               return;
+
+       xbc_node_for_each_child(node, inode) {
+               p = xbc_node_get_data(inode);
+               if (!p || *p == '\0')
+                       continue;
+
+               tr = trace_array_get_by_name(p);
+               if (IS_ERR(tr)) {
+                       pr_err("Failed to get trace instance %s\n", p);
+                       continue;
+               }
+               trace_boot_init_one_instance(tr, inode);
+       }
+}
+
 static int __init trace_boot_init(void)
 {
        struct xbc_node *trace_node;
@@ -255,10 +289,9 @@ static int __init trace_boot_init(void)
        if (!tr)
                return 0;
 
-       trace_boot_set_ftrace_options(tr, trace_node);
-       trace_boot_init_events(tr, trace_node);
-       trace_boot_enable_events(tr, trace_node);
-       trace_boot_enable_tracer(tr, trace_node);
+       /* Global trace array is also one instance */
+       trace_boot_init_one_instance(tr, trace_node);
+       trace_boot_init_instances(trace_node);
 
        return 0;
 }