提交 da3fd1a0 编写于 作者: I Ingo Molnar

Merge branch 'perf/urgent' of...

Merge branch 'perf/urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux-2.6 into perf/urgent
...@@ -43,8 +43,10 @@ static int __cmd_buildid_list(void) ...@@ -43,8 +43,10 @@ static int __cmd_buildid_list(void)
if (session == NULL) if (session == NULL)
return -1; return -1;
if (with_hits) if (with_hits) {
symbol_conf.full_paths = true;
perf_session__process_events(session, &build_id__mark_dso_hit_ops); perf_session__process_events(session, &build_id__mark_dso_hit_ops);
}
perf_session__fprintf_dsos_buildid(session, stdout, with_hits); perf_session__fprintf_dsos_buildid(session, stdout, with_hits);
......
...@@ -51,8 +51,7 @@ def kmem__kmalloc(event_name, context, common_cpu, ...@@ -51,8 +51,7 @@ def kmem__kmalloc(event_name, context, common_cpu,
flag_str("kmem__kmalloc", "gfp_flags", gfp_flags)), flag_str("kmem__kmalloc", "gfp_flags", gfp_flags)),
def trace_unhandled(event_name, context, common_cpu, common_secs, common_nsecs, def trace_unhandled(event_name, context, event_fields_dict):
common_pid, common_comm):
try: try:
unhandled[event_name] += 1 unhandled[event_name] += 1
except TypeError: except TypeError:
......
...@@ -965,7 +965,7 @@ static int hist_entry__parse_objdump_line(struct hist_entry *self, FILE *file, ...@@ -965,7 +965,7 @@ static int hist_entry__parse_objdump_line(struct hist_entry *self, FILE *file,
* Parse hexa addresses followed by ':' * Parse hexa addresses followed by ':'
*/ */
line_ip = strtoull(tmp, &tmp2, 16); line_ip = strtoull(tmp, &tmp2, 16);
if (*tmp2 != ':') if (*tmp2 != ':' || tmp == tmp2)
line_ip = -1; line_ip = -1;
} }
......
...@@ -208,7 +208,7 @@ static void python_process_event(int cpu, void *data, ...@@ -208,7 +208,7 @@ static void python_process_event(int cpu, void *data,
int size __unused, int size __unused,
unsigned long long nsecs, char *comm) unsigned long long nsecs, char *comm)
{ {
PyObject *handler, *retval, *context, *t, *obj; PyObject *handler, *retval, *context, *t, *obj, *dict = NULL;
static char handler_name[256]; static char handler_name[256];
struct format_field *field; struct format_field *field;
unsigned long long val; unsigned long long val;
...@@ -232,6 +232,14 @@ static void python_process_event(int cpu, void *data, ...@@ -232,6 +232,14 @@ static void python_process_event(int cpu, void *data,
sprintf(handler_name, "%s__%s", event->system, event->name); sprintf(handler_name, "%s__%s", event->system, event->name);
handler = PyDict_GetItemString(main_dict, handler_name);
if (handler && !PyCallable_Check(handler))
handler = NULL;
if (!handler) {
dict = PyDict_New();
if (!dict)
Py_FatalError("couldn't create Python dict");
}
s = nsecs / NSECS_PER_SEC; s = nsecs / NSECS_PER_SEC;
ns = nsecs - s * NSECS_PER_SEC; ns = nsecs - s * NSECS_PER_SEC;
...@@ -242,12 +250,20 @@ static void python_process_event(int cpu, void *data, ...@@ -242,12 +250,20 @@ static void python_process_event(int cpu, void *data,
PyTuple_SetItem(t, n++, PyString_FromString(handler_name)); PyTuple_SetItem(t, n++, PyString_FromString(handler_name));
PyTuple_SetItem(t, n++, PyTuple_SetItem(t, n++,
PyCObject_FromVoidPtr(scripting_context, NULL)); PyCObject_FromVoidPtr(scripting_context, NULL));
if (handler) {
PyTuple_SetItem(t, n++, PyInt_FromLong(cpu)); PyTuple_SetItem(t, n++, PyInt_FromLong(cpu));
PyTuple_SetItem(t, n++, PyInt_FromLong(s)); PyTuple_SetItem(t, n++, PyInt_FromLong(s));
PyTuple_SetItem(t, n++, PyInt_FromLong(ns)); PyTuple_SetItem(t, n++, PyInt_FromLong(ns));
PyTuple_SetItem(t, n++, PyInt_FromLong(pid)); PyTuple_SetItem(t, n++, PyInt_FromLong(pid));
PyTuple_SetItem(t, n++, PyString_FromString(comm)); PyTuple_SetItem(t, n++, PyString_FromString(comm));
} else {
PyDict_SetItemString(dict, "common_cpu", PyInt_FromLong(cpu));
PyDict_SetItemString(dict, "common_s", PyInt_FromLong(s));
PyDict_SetItemString(dict, "common_ns", PyInt_FromLong(ns));
PyDict_SetItemString(dict, "common_pid", PyInt_FromLong(pid));
PyDict_SetItemString(dict, "common_comm", PyString_FromString(comm));
}
for (field = event->format.fields; field; field = field->next) { for (field = event->format.fields; field; field = field->next) {
if (field->flags & FIELD_IS_STRING) { if (field->flags & FIELD_IS_STRING) {
int offset; int offset;
...@@ -272,27 +288,31 @@ static void python_process_event(int cpu, void *data, ...@@ -272,27 +288,31 @@ static void python_process_event(int cpu, void *data,
obj = PyLong_FromUnsignedLongLong(val); obj = PyLong_FromUnsignedLongLong(val);
} }
} }
if (handler)
PyTuple_SetItem(t, n++, obj); PyTuple_SetItem(t, n++, obj);
else
PyDict_SetItemString(dict, field->name, obj);
} }
if (!handler)
PyTuple_SetItem(t, n++, dict);
if (_PyTuple_Resize(&t, n) == -1) if (_PyTuple_Resize(&t, n) == -1)
Py_FatalError("error resizing Python tuple"); Py_FatalError("error resizing Python tuple");
handler = PyDict_GetItemString(main_dict, handler_name); if (handler) {
if (handler && PyCallable_Check(handler)) {
retval = PyObject_CallObject(handler, t); retval = PyObject_CallObject(handler, t);
if (retval == NULL) if (retval == NULL)
handler_call_die(handler_name); handler_call_die(handler_name);
} else { } else {
handler = PyDict_GetItemString(main_dict, "trace_unhandled"); handler = PyDict_GetItemString(main_dict, "trace_unhandled");
if (handler && PyCallable_Check(handler)) { if (handler && PyCallable_Check(handler)) {
if (_PyTuple_Resize(&t, N_COMMON_FIELDS) == -1)
Py_FatalError("error resizing Python tuple");
retval = PyObject_CallObject(handler, t); retval = PyObject_CallObject(handler, t);
if (retval == NULL) if (retval == NULL)
handler_call_die("trace_unhandled"); handler_call_die("trace_unhandled");
} }
Py_DECREF(dict);
} }
Py_DECREF(t); Py_DECREF(t);
...@@ -548,12 +568,10 @@ static int python_generate_script(const char *outfile) ...@@ -548,12 +568,10 @@ static int python_generate_script(const char *outfile)
} }
fprintf(ofp, "def trace_unhandled(event_name, context, " fprintf(ofp, "def trace_unhandled(event_name, context, "
"common_cpu, common_secs, common_nsecs,\n\t\t" "event_fields_dict):\n");
"common_pid, common_comm):\n");
fprintf(ofp, "\t\tprint_header(event_name, common_cpu, " fprintf(ofp, "\t\tprint ' '.join(['%%s=%%s'%%(k,str(v))"
"common_secs, common_nsecs,\n\t\tcommon_pid, " "for k,v in sorted(event_fields_dict.items())])\n\n");
"common_comm)\n\n");
fprintf(ofp, "def print_header(" fprintf(ofp, "def print_header("
"event_name, cpu, secs, nsecs, pid, comm):\n" "event_name, cpu, secs, nsecs, pid, comm):\n"
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册