)]}'
{
  "commit": "f1c7f517a5dc23bce07efa5ed55e2c074ed9d4ba",
  "tree": "187be4d66aaa35db2eb1cd77b49520868e999b67",
  "parents": [
    "281b3714e91162b66add1cfac404cf7b81e3e2f2"
  ],
  "author": {
    "name": "Steven Rostedt",
    "email": "srostedt@redhat.com",
    "time": "Fri Feb 26 17:08:16 2010 -0500"
  },
  "committer": {
    "name": "Steven Rostedt",
    "email": "rostedt@goodmis.org",
    "time": "Fri Feb 26 19:25:53 2010 -0500"
  },
  "message": "ftrace: Add function names to dangling } in function graph tracer\n\nThe function graph tracer is currently the most invasive tracer\nin the ftrace family. It can easily overflow the buffer even with\n10megs per CPU. This means that events can often be lost.\n\nOn start up, or after events are lost, if the function return is\nrecorded but the function enter was lost, all we get to see is the\nexiting \u0027}\u0027.\n\nHere is how a typical trace output starts:\n\n [tracing] cat trace\n # tracer: function_graph\n #\n # CPU  DURATION                  FUNCTION CALLS\n # |     |   |                     |   |   |   |\n  0) + 91.897 us   |                  }\n  0) ! 567.961 us  |                }\n  0)   \u003c\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d |\n  0) ! 579.083 us  |                _raw_spin_lock_irqsave();\n  0)   4.694 us    |                _raw_spin_unlock_irqrestore();\n  0) ! 594.862 us  |              }\n  0) ! 603.361 us  |            }\n  0) ! 613.574 us  |          }\n  0) ! 623.554 us  |        }\n  0)   3.653 us    |        fget_light();\n  0)               |        sock_poll() {\n\nThere are a series of \u0027}\u0027 with no matching \"func() {\". There\u0027s no information\nto what functions these ending brackets belong to.\n\nThis patch adds a stack on the per cpu structure used in outputting\nthe function graph tracer to keep track of what function was outputted.\nThen on a function exit event, it checks the depth to see if the\nfunction exit has a matching entry event. If it does, then it only\nprints the \u0027}\u0027, otherwise it adds the function name after the \u0027}\u0027.\n\nThis allows function exit events to show what function they belong to\nat trace output startup, when the entry was lost due to ring buffer\noverflow, or even after a new task is scheduled in.\n\nHere is what the above trace will look like after this patch:\n\n [tracing] cat trace\n # tracer: function_graph\n #\n # CPU  DURATION                  FUNCTION CALLS\n # |     |   |                     |   |   |   |\n  0) + 91.897 us   |                  } (irq_exit)\n  0) ! 567.961 us  |                } (smp_apic_timer_interrupt)\n  0)   \u003c\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d |\n  0) ! 579.083 us  |                _raw_spin_lock_irqsave();\n  0)   4.694 us    |                _raw_spin_unlock_irqrestore();\n  0) ! 594.862 us  |              } (add_wait_queue)\n  0) ! 603.361 us  |            } (__pollwait)\n  0) ! 613.574 us  |          } (tcp_poll)\n  0) ! 623.554 us  |        } (sock_poll)\n  0)   3.653 us    |        fget_light();\n  0)               |        sock_poll() {\n\nSigned-off-by: Steven Rostedt \u003crostedt@goodmis.org\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "112561df2a0a6681ae426485caeabd0fa03c8fa8",
      "old_mode": 33188,
      "old_path": "kernel/trace/trace_functions_graph.c",
      "new_id": "e998a824e9db5480f7e9b43bb74f2856a1f1d921",
      "new_mode": 33188,
      "new_path": "kernel/trace/trace_functions_graph.c"
    }
  ]
}
