Merge tag 'for-linus' of git://github.com/openrisc/linux
[linux-2.6-microblaze.git] / kernel / trace / trace_boot.c
index a82f03f..94ef2d0 100644 (file)
@@ -225,14 +225,37 @@ static void __init
 trace_boot_init_events(struct trace_array *tr, struct xbc_node *node)
 {
        struct xbc_node *gnode, *enode;
+       bool enable, enable_all = false;
+       const char *data;
 
        node = xbc_node_find_child(node, "event");
        if (!node)
                return;
        /* per-event key starts with "event.GROUP.EVENT" */
-       xbc_node_for_each_child(node, gnode)
-               xbc_node_for_each_child(gnode, enode)
+       xbc_node_for_each_child(node, gnode) {
+               data = xbc_node_get_data(gnode);
+               if (!strcmp(data, "enable")) {
+                       enable_all = true;
+                       continue;
+               }
+               enable = false;
+               xbc_node_for_each_child(gnode, enode) {
+                       data = xbc_node_get_data(enode);
+                       if (!strcmp(data, "enable")) {
+                               enable = true;
+                               continue;
+                       }
                        trace_boot_init_one_event(tr, gnode, enode);
+               }
+               /* Event enablement must be done after event settings */
+               if (enable) {
+                       data = xbc_node_get_data(gnode);
+                       trace_array_set_clr_event(tr, data, NULL, true);
+               }
+       }
+       /* Ditto */
+       if (enable_all)
+               trace_array_set_clr_event(tr, NULL, NULL, true);
 }
 #else
 #define trace_boot_enable_events(tr, node) do {} while (0)