1 /* 2 * trace-event-python. Feed trace events to an embedded Python interpreter. 3 * 4 * Copyright (C) 2010 Tom Zanussi <tzanussi@gmail.com> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 * 20 */ 21 22 #include <Python.h> 23 24 #include <stdio.h> 25 #include <stdlib.h> 26 #include <string.h> 27 #include <stdbool.h> 28 #include <errno.h> 29 #include <linux/bitmap.h> 30 31 #include "../../perf.h" 32 #include "../debug.h" 33 #include "../callchain.h" 34 #include "../evsel.h" 35 #include "../util.h" 36 #include "../event.h" 37 #include "../thread.h" 38 #include "../comm.h" 39 #include "../machine.h" 40 #include "../db-export.h" 41 #include "../thread-stack.h" 42 #include "../trace-event.h" 43 #include "../machine.h" 44 #include "thread_map.h" 45 #include "cpumap.h" 46 #include "stat.h" 47 48 PyMODINIT_FUNC initperf_trace_context(void); 49 50 #define TRACE_EVENT_TYPE_MAX \ 51 ((1 << (sizeof(unsigned short) * 8)) - 1) 52 53 static DECLARE_BITMAP(events_defined, TRACE_EVENT_TYPE_MAX); 54 55 #define MAX_FIELDS 64 56 #define N_COMMON_FIELDS 7 57 58 extern struct scripting_context *scripting_context; 59 60 static char *cur_field_name; 61 static int zero_flag_atom; 62 63 static PyObject *main_module, *main_dict; 64 65 struct tables { 66 struct db_export dbe; 67 PyObject *evsel_handler; 68 PyObject *machine_handler; 69 PyObject *thread_handler; 70 PyObject *comm_handler; 71 PyObject *comm_thread_handler; 72 PyObject *dso_handler; 73 PyObject *symbol_handler; 74 PyObject *branch_type_handler; 75 PyObject *sample_handler; 76 PyObject *call_path_handler; 77 PyObject *call_return_handler; 78 bool db_export_mode; 79 }; 80 81 static struct tables tables_global; 82 83 static void handler_call_die(const char *handler_name) NORETURN; 84 static void handler_call_die(const char *handler_name) 85 { 86 PyErr_Print(); 87 Py_FatalError("problem in Python trace event handler"); 88 // Py_FatalError does not return 89 // but we have to make the compiler happy 90 abort(); 91 } 92 93 /* 94 * Insert val into into the dictionary and decrement the reference counter. 95 * This is necessary for dictionaries since PyDict_SetItemString() does not 96 * steal a reference, as opposed to PyTuple_SetItem(). 97 */ 98 static void pydict_set_item_string_decref(PyObject *dict, const char *key, PyObject *val) 99 { 100 PyDict_SetItemString(dict, key, val); 101 Py_DECREF(val); 102 } 103 104 static PyObject *get_handler(const char *handler_name) 105 { 106 PyObject *handler; 107 108 handler = PyDict_GetItemString(main_dict, handler_name); 109 if (handler && !PyCallable_Check(handler)) 110 return NULL; 111 return handler; 112 } 113 114 static void call_object(PyObject *handler, PyObject *args, const char *die_msg) 115 { 116 PyObject *retval; 117 118 retval = PyObject_CallObject(handler, args); 119 if (retval == NULL) 120 handler_call_die(die_msg); 121 Py_DECREF(retval); 122 } 123 124 static void try_call_object(const char *handler_name, PyObject *args) 125 { 126 PyObject *handler; 127 128 handler = get_handler(handler_name); 129 if (handler) 130 call_object(handler, args, handler_name); 131 } 132 133 static void define_value(enum print_arg_type field_type, 134 const char *ev_name, 135 const char *field_name, 136 const char *field_value, 137 const char *field_str) 138 { 139 const char *handler_name = "define_flag_value"; 140 PyObject *t; 141 unsigned long long value; 142 unsigned n = 0; 143 144 if (field_type == PRINT_SYMBOL) 145 handler_name = "define_symbolic_value"; 146 147 t = PyTuple_New(4); 148 if (!t) 149 Py_FatalError("couldn't create Python tuple"); 150 151 value = eval_flag(field_value); 152 153 PyTuple_SetItem(t, n++, PyString_FromString(ev_name)); 154 PyTuple_SetItem(t, n++, PyString_FromString(field_name)); 155 PyTuple_SetItem(t, n++, PyInt_FromLong(value)); 156 PyTuple_SetItem(t, n++, PyString_FromString(field_str)); 157 158 try_call_object(handler_name, t); 159 160 Py_DECREF(t); 161 } 162 163 static void define_values(enum print_arg_type field_type, 164 struct print_flag_sym *field, 165 const char *ev_name, 166 const char *field_name) 167 { 168 define_value(field_type, ev_name, field_name, field->value, 169 field->str); 170 171 if (field->next) 172 define_values(field_type, field->next, ev_name, field_name); 173 } 174 175 static void define_field(enum print_arg_type field_type, 176 const char *ev_name, 177 const char *field_name, 178 const char *delim) 179 { 180 const char *handler_name = "define_flag_field"; 181 PyObject *t; 182 unsigned n = 0; 183 184 if (field_type == PRINT_SYMBOL) 185 handler_name = "define_symbolic_field"; 186 187 if (field_type == PRINT_FLAGS) 188 t = PyTuple_New(3); 189 else 190 t = PyTuple_New(2); 191 if (!t) 192 Py_FatalError("couldn't create Python tuple"); 193 194 PyTuple_SetItem(t, n++, PyString_FromString(ev_name)); 195 PyTuple_SetItem(t, n++, PyString_FromString(field_name)); 196 if (field_type == PRINT_FLAGS) 197 PyTuple_SetItem(t, n++, PyString_FromString(delim)); 198 199 try_call_object(handler_name, t); 200 201 Py_DECREF(t); 202 } 203 204 static void define_event_symbols(struct event_format *event, 205 const char *ev_name, 206 struct print_arg *args) 207 { 208 if (args == NULL) 209 return; 210 211 switch (args->type) { 212 case PRINT_NULL: 213 break; 214 case PRINT_ATOM: 215 define_value(PRINT_FLAGS, ev_name, cur_field_name, "0", 216 args->atom.atom); 217 zero_flag_atom = 0; 218 break; 219 case PRINT_FIELD: 220 free(cur_field_name); 221 cur_field_name = strdup(args->field.name); 222 break; 223 case PRINT_FLAGS: 224 define_event_symbols(event, ev_name, args->flags.field); 225 define_field(PRINT_FLAGS, ev_name, cur_field_name, 226 args->flags.delim); 227 define_values(PRINT_FLAGS, args->flags.flags, ev_name, 228 cur_field_name); 229 break; 230 case PRINT_SYMBOL: 231 define_event_symbols(event, ev_name, args->symbol.field); 232 define_field(PRINT_SYMBOL, ev_name, cur_field_name, NULL); 233 define_values(PRINT_SYMBOL, args->symbol.symbols, ev_name, 234 cur_field_name); 235 break; 236 case PRINT_HEX: 237 define_event_symbols(event, ev_name, args->hex.field); 238 define_event_symbols(event, ev_name, args->hex.size); 239 break; 240 case PRINT_INT_ARRAY: 241 define_event_symbols(event, ev_name, args->int_array.field); 242 define_event_symbols(event, ev_name, args->int_array.count); 243 define_event_symbols(event, ev_name, args->int_array.el_size); 244 break; 245 case PRINT_STRING: 246 break; 247 case PRINT_TYPE: 248 define_event_symbols(event, ev_name, args->typecast.item); 249 break; 250 case PRINT_OP: 251 if (strcmp(args->op.op, ":") == 0) 252 zero_flag_atom = 1; 253 define_event_symbols(event, ev_name, args->op.left); 254 define_event_symbols(event, ev_name, args->op.right); 255 break; 256 default: 257 /* gcc warns for these? */ 258 case PRINT_BSTRING: 259 case PRINT_DYNAMIC_ARRAY: 260 case PRINT_DYNAMIC_ARRAY_LEN: 261 case PRINT_FUNC: 262 case PRINT_BITMASK: 263 /* we should warn... */ 264 return; 265 } 266 267 if (args->next) 268 define_event_symbols(event, ev_name, args->next); 269 } 270 271 static PyObject *get_field_numeric_entry(struct event_format *event, 272 struct format_field *field, void *data) 273 { 274 bool is_array = field->flags & FIELD_IS_ARRAY; 275 PyObject *obj, *list = NULL; 276 unsigned long long val; 277 unsigned int item_size, n_items, i; 278 279 if (is_array) { 280 list = PyList_New(field->arraylen); 281 item_size = field->size / field->arraylen; 282 n_items = field->arraylen; 283 } else { 284 item_size = field->size; 285 n_items = 1; 286 } 287 288 for (i = 0; i < n_items; i++) { 289 290 val = read_size(event, data + field->offset + i * item_size, 291 item_size); 292 if (field->flags & FIELD_IS_SIGNED) { 293 if ((long long)val >= LONG_MIN && 294 (long long)val <= LONG_MAX) 295 obj = PyInt_FromLong(val); 296 else 297 obj = PyLong_FromLongLong(val); 298 } else { 299 if (val <= LONG_MAX) 300 obj = PyInt_FromLong(val); 301 else 302 obj = PyLong_FromUnsignedLongLong(val); 303 } 304 if (is_array) 305 PyList_SET_ITEM(list, i, obj); 306 } 307 if (is_array) 308 obj = list; 309 return obj; 310 } 311 312 313 static PyObject *python_process_callchain(struct perf_sample *sample, 314 struct perf_evsel *evsel, 315 struct addr_location *al) 316 { 317 PyObject *pylist; 318 319 pylist = PyList_New(0); 320 if (!pylist) 321 Py_FatalError("couldn't create Python list"); 322 323 if (!symbol_conf.use_callchain || !sample->callchain) 324 goto exit; 325 326 if (thread__resolve_callchain(al->thread, evsel, 327 sample, NULL, NULL, 328 scripting_max_stack) != 0) { 329 pr_err("Failed to resolve callchain. Skipping\n"); 330 goto exit; 331 } 332 callchain_cursor_commit(&callchain_cursor); 333 334 335 while (1) { 336 PyObject *pyelem; 337 struct callchain_cursor_node *node; 338 node = callchain_cursor_current(&callchain_cursor); 339 if (!node) 340 break; 341 342 pyelem = PyDict_New(); 343 if (!pyelem) 344 Py_FatalError("couldn't create Python dictionary"); 345 346 347 pydict_set_item_string_decref(pyelem, "ip", 348 PyLong_FromUnsignedLongLong(node->ip)); 349 350 if (node->sym) { 351 PyObject *pysym = PyDict_New(); 352 if (!pysym) 353 Py_FatalError("couldn't create Python dictionary"); 354 pydict_set_item_string_decref(pysym, "start", 355 PyLong_FromUnsignedLongLong(node->sym->start)); 356 pydict_set_item_string_decref(pysym, "end", 357 PyLong_FromUnsignedLongLong(node->sym->end)); 358 pydict_set_item_string_decref(pysym, "binding", 359 PyInt_FromLong(node->sym->binding)); 360 pydict_set_item_string_decref(pysym, "name", 361 PyString_FromStringAndSize(node->sym->name, 362 node->sym->namelen)); 363 pydict_set_item_string_decref(pyelem, "sym", pysym); 364 } 365 366 if (node->map) { 367 struct map *map = node->map; 368 const char *dsoname = "[unknown]"; 369 if (map && map->dso && (map->dso->name || map->dso->long_name)) { 370 if (symbol_conf.show_kernel_path && map->dso->long_name) 371 dsoname = map->dso->long_name; 372 else if (map->dso->name) 373 dsoname = map->dso->name; 374 } 375 pydict_set_item_string_decref(pyelem, "dso", 376 PyString_FromString(dsoname)); 377 } 378 379 callchain_cursor_advance(&callchain_cursor); 380 PyList_Append(pylist, pyelem); 381 Py_DECREF(pyelem); 382 } 383 384 exit: 385 return pylist; 386 } 387 388 389 static void python_process_tracepoint(struct perf_sample *sample, 390 struct perf_evsel *evsel, 391 struct addr_location *al) 392 { 393 struct event_format *event = evsel->tp_format; 394 PyObject *handler, *context, *t, *obj, *callchain; 395 PyObject *dict = NULL; 396 static char handler_name[256]; 397 struct format_field *field; 398 unsigned long s, ns; 399 unsigned n = 0; 400 int pid; 401 int cpu = sample->cpu; 402 void *data = sample->raw_data; 403 unsigned long long nsecs = sample->time; 404 const char *comm = thread__comm_str(al->thread); 405 406 t = PyTuple_New(MAX_FIELDS); 407 if (!t) 408 Py_FatalError("couldn't create Python tuple"); 409 410 if (!event) 411 die("ug! no event found for type %d", (int)evsel->attr.config); 412 413 pid = raw_field_value(event, "common_pid", data); 414 415 sprintf(handler_name, "%s__%s", event->system, event->name); 416 417 if (!test_and_set_bit(event->id, events_defined)) 418 define_event_symbols(event, handler_name, event->print_fmt.args); 419 420 handler = get_handler(handler_name); 421 if (!handler) { 422 dict = PyDict_New(); 423 if (!dict) 424 Py_FatalError("couldn't create Python dict"); 425 } 426 s = nsecs / NSECS_PER_SEC; 427 ns = nsecs - s * NSECS_PER_SEC; 428 429 scripting_context->event_data = data; 430 scripting_context->pevent = evsel->tp_format->pevent; 431 432 context = PyCObject_FromVoidPtr(scripting_context, NULL); 433 434 PyTuple_SetItem(t, n++, PyString_FromString(handler_name)); 435 PyTuple_SetItem(t, n++, context); 436 437 /* ip unwinding */ 438 callchain = python_process_callchain(sample, evsel, al); 439 440 if (handler) { 441 PyTuple_SetItem(t, n++, PyInt_FromLong(cpu)); 442 PyTuple_SetItem(t, n++, PyInt_FromLong(s)); 443 PyTuple_SetItem(t, n++, PyInt_FromLong(ns)); 444 PyTuple_SetItem(t, n++, PyInt_FromLong(pid)); 445 PyTuple_SetItem(t, n++, PyString_FromString(comm)); 446 PyTuple_SetItem(t, n++, callchain); 447 } else { 448 pydict_set_item_string_decref(dict, "common_cpu", PyInt_FromLong(cpu)); 449 pydict_set_item_string_decref(dict, "common_s", PyInt_FromLong(s)); 450 pydict_set_item_string_decref(dict, "common_ns", PyInt_FromLong(ns)); 451 pydict_set_item_string_decref(dict, "common_pid", PyInt_FromLong(pid)); 452 pydict_set_item_string_decref(dict, "common_comm", PyString_FromString(comm)); 453 pydict_set_item_string_decref(dict, "common_callchain", callchain); 454 } 455 for (field = event->format.fields; field; field = field->next) { 456 if (field->flags & FIELD_IS_STRING) { 457 int offset; 458 if (field->flags & FIELD_IS_DYNAMIC) { 459 offset = *(int *)(data + field->offset); 460 offset &= 0xffff; 461 } else 462 offset = field->offset; 463 obj = PyString_FromString((char *)data + offset); 464 } else { /* FIELD_IS_NUMERIC */ 465 obj = get_field_numeric_entry(event, field, data); 466 } 467 if (handler) 468 PyTuple_SetItem(t, n++, obj); 469 else 470 pydict_set_item_string_decref(dict, field->name, obj); 471 472 } 473 474 if (!handler) 475 PyTuple_SetItem(t, n++, dict); 476 477 if (_PyTuple_Resize(&t, n) == -1) 478 Py_FatalError("error resizing Python tuple"); 479 480 if (handler) { 481 call_object(handler, t, handler_name); 482 } else { 483 try_call_object("trace_unhandled", t); 484 Py_DECREF(dict); 485 } 486 487 Py_DECREF(t); 488 } 489 490 static PyObject *tuple_new(unsigned int sz) 491 { 492 PyObject *t; 493 494 t = PyTuple_New(sz); 495 if (!t) 496 Py_FatalError("couldn't create Python tuple"); 497 return t; 498 } 499 500 static int tuple_set_u64(PyObject *t, unsigned int pos, u64 val) 501 { 502 #if BITS_PER_LONG == 64 503 return PyTuple_SetItem(t, pos, PyInt_FromLong(val)); 504 #endif 505 #if BITS_PER_LONG == 32 506 return PyTuple_SetItem(t, pos, PyLong_FromLongLong(val)); 507 #endif 508 } 509 510 static int tuple_set_s32(PyObject *t, unsigned int pos, s32 val) 511 { 512 return PyTuple_SetItem(t, pos, PyInt_FromLong(val)); 513 } 514 515 static int tuple_set_string(PyObject *t, unsigned int pos, const char *s) 516 { 517 return PyTuple_SetItem(t, pos, PyString_FromString(s)); 518 } 519 520 static int python_export_evsel(struct db_export *dbe, struct perf_evsel *evsel) 521 { 522 struct tables *tables = container_of(dbe, struct tables, dbe); 523 PyObject *t; 524 525 t = tuple_new(2); 526 527 tuple_set_u64(t, 0, evsel->db_id); 528 tuple_set_string(t, 1, perf_evsel__name(evsel)); 529 530 call_object(tables->evsel_handler, t, "evsel_table"); 531 532 Py_DECREF(t); 533 534 return 0; 535 } 536 537 static int python_export_machine(struct db_export *dbe, 538 struct machine *machine) 539 { 540 struct tables *tables = container_of(dbe, struct tables, dbe); 541 PyObject *t; 542 543 t = tuple_new(3); 544 545 tuple_set_u64(t, 0, machine->db_id); 546 tuple_set_s32(t, 1, machine->pid); 547 tuple_set_string(t, 2, machine->root_dir ? machine->root_dir : ""); 548 549 call_object(tables->machine_handler, t, "machine_table"); 550 551 Py_DECREF(t); 552 553 return 0; 554 } 555 556 static int python_export_thread(struct db_export *dbe, struct thread *thread, 557 u64 main_thread_db_id, struct machine *machine) 558 { 559 struct tables *tables = container_of(dbe, struct tables, dbe); 560 PyObject *t; 561 562 t = tuple_new(5); 563 564 tuple_set_u64(t, 0, thread->db_id); 565 tuple_set_u64(t, 1, machine->db_id); 566 tuple_set_u64(t, 2, main_thread_db_id); 567 tuple_set_s32(t, 3, thread->pid_); 568 tuple_set_s32(t, 4, thread->tid); 569 570 call_object(tables->thread_handler, t, "thread_table"); 571 572 Py_DECREF(t); 573 574 return 0; 575 } 576 577 static int python_export_comm(struct db_export *dbe, struct comm *comm) 578 { 579 struct tables *tables = container_of(dbe, struct tables, dbe); 580 PyObject *t; 581 582 t = tuple_new(2); 583 584 tuple_set_u64(t, 0, comm->db_id); 585 tuple_set_string(t, 1, comm__str(comm)); 586 587 call_object(tables->comm_handler, t, "comm_table"); 588 589 Py_DECREF(t); 590 591 return 0; 592 } 593 594 static int python_export_comm_thread(struct db_export *dbe, u64 db_id, 595 struct comm *comm, struct thread *thread) 596 { 597 struct tables *tables = container_of(dbe, struct tables, dbe); 598 PyObject *t; 599 600 t = tuple_new(3); 601 602 tuple_set_u64(t, 0, db_id); 603 tuple_set_u64(t, 1, comm->db_id); 604 tuple_set_u64(t, 2, thread->db_id); 605 606 call_object(tables->comm_thread_handler, t, "comm_thread_table"); 607 608 Py_DECREF(t); 609 610 return 0; 611 } 612 613 static int python_export_dso(struct db_export *dbe, struct dso *dso, 614 struct machine *machine) 615 { 616 struct tables *tables = container_of(dbe, struct tables, dbe); 617 char sbuild_id[BUILD_ID_SIZE * 2 + 1]; 618 PyObject *t; 619 620 build_id__sprintf(dso->build_id, sizeof(dso->build_id), sbuild_id); 621 622 t = tuple_new(5); 623 624 tuple_set_u64(t, 0, dso->db_id); 625 tuple_set_u64(t, 1, machine->db_id); 626 tuple_set_string(t, 2, dso->short_name); 627 tuple_set_string(t, 3, dso->long_name); 628 tuple_set_string(t, 4, sbuild_id); 629 630 call_object(tables->dso_handler, t, "dso_table"); 631 632 Py_DECREF(t); 633 634 return 0; 635 } 636 637 static int python_export_symbol(struct db_export *dbe, struct symbol *sym, 638 struct dso *dso) 639 { 640 struct tables *tables = container_of(dbe, struct tables, dbe); 641 u64 *sym_db_id = symbol__priv(sym); 642 PyObject *t; 643 644 t = tuple_new(6); 645 646 tuple_set_u64(t, 0, *sym_db_id); 647 tuple_set_u64(t, 1, dso->db_id); 648 tuple_set_u64(t, 2, sym->start); 649 tuple_set_u64(t, 3, sym->end); 650 tuple_set_s32(t, 4, sym->binding); 651 tuple_set_string(t, 5, sym->name); 652 653 call_object(tables->symbol_handler, t, "symbol_table"); 654 655 Py_DECREF(t); 656 657 return 0; 658 } 659 660 static int python_export_branch_type(struct db_export *dbe, u32 branch_type, 661 const char *name) 662 { 663 struct tables *tables = container_of(dbe, struct tables, dbe); 664 PyObject *t; 665 666 t = tuple_new(2); 667 668 tuple_set_s32(t, 0, branch_type); 669 tuple_set_string(t, 1, name); 670 671 call_object(tables->branch_type_handler, t, "branch_type_table"); 672 673 Py_DECREF(t); 674 675 return 0; 676 } 677 678 static int python_export_sample(struct db_export *dbe, 679 struct export_sample *es) 680 { 681 struct tables *tables = container_of(dbe, struct tables, dbe); 682 PyObject *t; 683 684 t = tuple_new(21); 685 686 tuple_set_u64(t, 0, es->db_id); 687 tuple_set_u64(t, 1, es->evsel->db_id); 688 tuple_set_u64(t, 2, es->al->machine->db_id); 689 tuple_set_u64(t, 3, es->al->thread->db_id); 690 tuple_set_u64(t, 4, es->comm_db_id); 691 tuple_set_u64(t, 5, es->dso_db_id); 692 tuple_set_u64(t, 6, es->sym_db_id); 693 tuple_set_u64(t, 7, es->offset); 694 tuple_set_u64(t, 8, es->sample->ip); 695 tuple_set_u64(t, 9, es->sample->time); 696 tuple_set_s32(t, 10, es->sample->cpu); 697 tuple_set_u64(t, 11, es->addr_dso_db_id); 698 tuple_set_u64(t, 12, es->addr_sym_db_id); 699 tuple_set_u64(t, 13, es->addr_offset); 700 tuple_set_u64(t, 14, es->sample->addr); 701 tuple_set_u64(t, 15, es->sample->period); 702 tuple_set_u64(t, 16, es->sample->weight); 703 tuple_set_u64(t, 17, es->sample->transaction); 704 tuple_set_u64(t, 18, es->sample->data_src); 705 tuple_set_s32(t, 19, es->sample->flags & PERF_BRANCH_MASK); 706 tuple_set_s32(t, 20, !!(es->sample->flags & PERF_IP_FLAG_IN_TX)); 707 708 call_object(tables->sample_handler, t, "sample_table"); 709 710 Py_DECREF(t); 711 712 return 0; 713 } 714 715 static int python_export_call_path(struct db_export *dbe, struct call_path *cp) 716 { 717 struct tables *tables = container_of(dbe, struct tables, dbe); 718 PyObject *t; 719 u64 parent_db_id, sym_db_id; 720 721 parent_db_id = cp->parent ? cp->parent->db_id : 0; 722 sym_db_id = cp->sym ? *(u64 *)symbol__priv(cp->sym) : 0; 723 724 t = tuple_new(4); 725 726 tuple_set_u64(t, 0, cp->db_id); 727 tuple_set_u64(t, 1, parent_db_id); 728 tuple_set_u64(t, 2, sym_db_id); 729 tuple_set_u64(t, 3, cp->ip); 730 731 call_object(tables->call_path_handler, t, "call_path_table"); 732 733 Py_DECREF(t); 734 735 return 0; 736 } 737 738 static int python_export_call_return(struct db_export *dbe, 739 struct call_return *cr) 740 { 741 struct tables *tables = container_of(dbe, struct tables, dbe); 742 u64 comm_db_id = cr->comm ? cr->comm->db_id : 0; 743 PyObject *t; 744 745 t = tuple_new(11); 746 747 tuple_set_u64(t, 0, cr->db_id); 748 tuple_set_u64(t, 1, cr->thread->db_id); 749 tuple_set_u64(t, 2, comm_db_id); 750 tuple_set_u64(t, 3, cr->cp->db_id); 751 tuple_set_u64(t, 4, cr->call_time); 752 tuple_set_u64(t, 5, cr->return_time); 753 tuple_set_u64(t, 6, cr->branch_count); 754 tuple_set_u64(t, 7, cr->call_ref); 755 tuple_set_u64(t, 8, cr->return_ref); 756 tuple_set_u64(t, 9, cr->cp->parent->db_id); 757 tuple_set_s32(t, 10, cr->flags); 758 759 call_object(tables->call_return_handler, t, "call_return_table"); 760 761 Py_DECREF(t); 762 763 return 0; 764 } 765 766 static int python_process_call_return(struct call_return *cr, void *data) 767 { 768 struct db_export *dbe = data; 769 770 return db_export__call_return(dbe, cr); 771 } 772 773 static void python_process_general_event(struct perf_sample *sample, 774 struct perf_evsel *evsel, 775 struct addr_location *al) 776 { 777 PyObject *handler, *t, *dict, *callchain, *dict_sample; 778 static char handler_name[64]; 779 unsigned n = 0; 780 781 /* 782 * Use the MAX_FIELDS to make the function expandable, though 783 * currently there is only one item for the tuple. 784 */ 785 t = PyTuple_New(MAX_FIELDS); 786 if (!t) 787 Py_FatalError("couldn't create Python tuple"); 788 789 dict = PyDict_New(); 790 if (!dict) 791 Py_FatalError("couldn't create Python dictionary"); 792 793 dict_sample = PyDict_New(); 794 if (!dict_sample) 795 Py_FatalError("couldn't create Python dictionary"); 796 797 snprintf(handler_name, sizeof(handler_name), "%s", "process_event"); 798 799 handler = get_handler(handler_name); 800 if (!handler) 801 goto exit; 802 803 pydict_set_item_string_decref(dict, "ev_name", PyString_FromString(perf_evsel__name(evsel))); 804 pydict_set_item_string_decref(dict, "attr", PyString_FromStringAndSize( 805 (const char *)&evsel->attr, sizeof(evsel->attr))); 806 807 pydict_set_item_string_decref(dict_sample, "pid", 808 PyInt_FromLong(sample->pid)); 809 pydict_set_item_string_decref(dict_sample, "tid", 810 PyInt_FromLong(sample->tid)); 811 pydict_set_item_string_decref(dict_sample, "cpu", 812 PyInt_FromLong(sample->cpu)); 813 pydict_set_item_string_decref(dict_sample, "ip", 814 PyLong_FromUnsignedLongLong(sample->ip)); 815 pydict_set_item_string_decref(dict_sample, "time", 816 PyLong_FromUnsignedLongLong(sample->time)); 817 pydict_set_item_string_decref(dict_sample, "period", 818 PyLong_FromUnsignedLongLong(sample->period)); 819 pydict_set_item_string_decref(dict, "sample", dict_sample); 820 821 pydict_set_item_string_decref(dict, "raw_buf", PyString_FromStringAndSize( 822 (const char *)sample->raw_data, sample->raw_size)); 823 pydict_set_item_string_decref(dict, "comm", 824 PyString_FromString(thread__comm_str(al->thread))); 825 if (al->map) { 826 pydict_set_item_string_decref(dict, "dso", 827 PyString_FromString(al->map->dso->name)); 828 } 829 if (al->sym) { 830 pydict_set_item_string_decref(dict, "symbol", 831 PyString_FromString(al->sym->name)); 832 } 833 834 /* ip unwinding */ 835 callchain = python_process_callchain(sample, evsel, al); 836 pydict_set_item_string_decref(dict, "callchain", callchain); 837 838 PyTuple_SetItem(t, n++, dict); 839 if (_PyTuple_Resize(&t, n) == -1) 840 Py_FatalError("error resizing Python tuple"); 841 842 call_object(handler, t, handler_name); 843 exit: 844 Py_DECREF(dict); 845 Py_DECREF(t); 846 } 847 848 static void python_process_event(union perf_event *event, 849 struct perf_sample *sample, 850 struct perf_evsel *evsel, 851 struct addr_location *al) 852 { 853 struct tables *tables = &tables_global; 854 855 switch (evsel->attr.type) { 856 case PERF_TYPE_TRACEPOINT: 857 python_process_tracepoint(sample, evsel, al); 858 break; 859 /* Reserve for future process_hw/sw/raw APIs */ 860 default: 861 if (tables->db_export_mode) 862 db_export__sample(&tables->dbe, event, sample, evsel, al); 863 else 864 python_process_general_event(sample, evsel, al); 865 } 866 } 867 868 static void get_handler_name(char *str, size_t size, 869 struct perf_evsel *evsel) 870 { 871 char *p = str; 872 873 scnprintf(str, size, "stat__%s", perf_evsel__name(evsel)); 874 875 while ((p = strchr(p, ':'))) { 876 *p = '_'; 877 p++; 878 } 879 } 880 881 static void 882 process_stat(struct perf_evsel *counter, int cpu, int thread, u64 tstamp, 883 struct perf_counts_values *count) 884 { 885 PyObject *handler, *t; 886 static char handler_name[256]; 887 int n = 0; 888 889 t = PyTuple_New(MAX_FIELDS); 890 if (!t) 891 Py_FatalError("couldn't create Python tuple"); 892 893 get_handler_name(handler_name, sizeof(handler_name), 894 counter); 895 896 handler = get_handler(handler_name); 897 if (!handler) { 898 pr_debug("can't find python handler %s\n", handler_name); 899 return; 900 } 901 902 PyTuple_SetItem(t, n++, PyInt_FromLong(cpu)); 903 PyTuple_SetItem(t, n++, PyInt_FromLong(thread)); 904 905 tuple_set_u64(t, n++, tstamp); 906 tuple_set_u64(t, n++, count->val); 907 tuple_set_u64(t, n++, count->ena); 908 tuple_set_u64(t, n++, count->run); 909 910 if (_PyTuple_Resize(&t, n) == -1) 911 Py_FatalError("error resizing Python tuple"); 912 913 call_object(handler, t, handler_name); 914 915 Py_DECREF(t); 916 } 917 918 static void python_process_stat(struct perf_stat_config *config, 919 struct perf_evsel *counter, u64 tstamp) 920 { 921 struct thread_map *threads = counter->threads; 922 struct cpu_map *cpus = counter->cpus; 923 int cpu, thread; 924 925 if (config->aggr_mode == AGGR_GLOBAL) { 926 process_stat(counter, -1, -1, tstamp, 927 &counter->counts->aggr); 928 return; 929 } 930 931 for (thread = 0; thread < threads->nr; thread++) { 932 for (cpu = 0; cpu < cpus->nr; cpu++) { 933 process_stat(counter, cpus->map[cpu], 934 thread_map__pid(threads, thread), tstamp, 935 perf_counts(counter->counts, cpu, thread)); 936 } 937 } 938 } 939 940 static void python_process_stat_interval(u64 tstamp) 941 { 942 PyObject *handler, *t; 943 static const char handler_name[] = "stat__interval"; 944 int n = 0; 945 946 t = PyTuple_New(MAX_FIELDS); 947 if (!t) 948 Py_FatalError("couldn't create Python tuple"); 949 950 handler = get_handler(handler_name); 951 if (!handler) { 952 pr_debug("can't find python handler %s\n", handler_name); 953 return; 954 } 955 956 tuple_set_u64(t, n++, tstamp); 957 958 if (_PyTuple_Resize(&t, n) == -1) 959 Py_FatalError("error resizing Python tuple"); 960 961 call_object(handler, t, handler_name); 962 963 Py_DECREF(t); 964 } 965 966 static int run_start_sub(void) 967 { 968 main_module = PyImport_AddModule("__main__"); 969 if (main_module == NULL) 970 return -1; 971 Py_INCREF(main_module); 972 973 main_dict = PyModule_GetDict(main_module); 974 if (main_dict == NULL) 975 goto error; 976 Py_INCREF(main_dict); 977 978 try_call_object("trace_begin", NULL); 979 980 return 0; 981 982 error: 983 Py_XDECREF(main_dict); 984 Py_XDECREF(main_module); 985 return -1; 986 } 987 988 #define SET_TABLE_HANDLER_(name, handler_name, table_name) do { \ 989 tables->handler_name = get_handler(#table_name); \ 990 if (tables->handler_name) \ 991 tables->dbe.export_ ## name = python_export_ ## name; \ 992 } while (0) 993 994 #define SET_TABLE_HANDLER(name) \ 995 SET_TABLE_HANDLER_(name, name ## _handler, name ## _table) 996 997 static void set_table_handlers(struct tables *tables) 998 { 999 const char *perf_db_export_mode = "perf_db_export_mode"; 1000 const char *perf_db_export_calls = "perf_db_export_calls"; 1001 PyObject *db_export_mode, *db_export_calls; 1002 bool export_calls = false; 1003 int ret; 1004 1005 memset(tables, 0, sizeof(struct tables)); 1006 if (db_export__init(&tables->dbe)) 1007 Py_FatalError("failed to initialize export"); 1008 1009 db_export_mode = PyDict_GetItemString(main_dict, perf_db_export_mode); 1010 if (!db_export_mode) 1011 return; 1012 1013 ret = PyObject_IsTrue(db_export_mode); 1014 if (ret == -1) 1015 handler_call_die(perf_db_export_mode); 1016 if (!ret) 1017 return; 1018 1019 tables->dbe.crp = NULL; 1020 db_export_calls = PyDict_GetItemString(main_dict, perf_db_export_calls); 1021 if (db_export_calls) { 1022 ret = PyObject_IsTrue(db_export_calls); 1023 if (ret == -1) 1024 handler_call_die(perf_db_export_calls); 1025 export_calls = !!ret; 1026 } 1027 1028 if (export_calls) { 1029 tables->dbe.crp = 1030 call_return_processor__new(python_process_call_return, 1031 &tables->dbe); 1032 if (!tables->dbe.crp) 1033 Py_FatalError("failed to create calls processor"); 1034 } 1035 1036 tables->db_export_mode = true; 1037 /* 1038 * Reserve per symbol space for symbol->db_id via symbol__priv() 1039 */ 1040 symbol_conf.priv_size = sizeof(u64); 1041 1042 SET_TABLE_HANDLER(evsel); 1043 SET_TABLE_HANDLER(machine); 1044 SET_TABLE_HANDLER(thread); 1045 SET_TABLE_HANDLER(comm); 1046 SET_TABLE_HANDLER(comm_thread); 1047 SET_TABLE_HANDLER(dso); 1048 SET_TABLE_HANDLER(symbol); 1049 SET_TABLE_HANDLER(branch_type); 1050 SET_TABLE_HANDLER(sample); 1051 SET_TABLE_HANDLER(call_path); 1052 SET_TABLE_HANDLER(call_return); 1053 } 1054 1055 /* 1056 * Start trace script 1057 */ 1058 static int python_start_script(const char *script, int argc, const char **argv) 1059 { 1060 struct tables *tables = &tables_global; 1061 const char **command_line; 1062 char buf[PATH_MAX]; 1063 int i, err = 0; 1064 FILE *fp; 1065 1066 command_line = malloc((argc + 1) * sizeof(const char *)); 1067 command_line[0] = script; 1068 for (i = 1; i < argc + 1; i++) 1069 command_line[i] = argv[i - 1]; 1070 1071 Py_Initialize(); 1072 1073 initperf_trace_context(); 1074 1075 PySys_SetArgv(argc + 1, (char **)command_line); 1076 1077 fp = fopen(script, "r"); 1078 if (!fp) { 1079 sprintf(buf, "Can't open python script \"%s\"", script); 1080 perror(buf); 1081 err = -1; 1082 goto error; 1083 } 1084 1085 err = PyRun_SimpleFile(fp, script); 1086 if (err) { 1087 fprintf(stderr, "Error running python script %s\n", script); 1088 goto error; 1089 } 1090 1091 err = run_start_sub(); 1092 if (err) { 1093 fprintf(stderr, "Error starting python script %s\n", script); 1094 goto error; 1095 } 1096 1097 set_table_handlers(tables); 1098 1099 if (tables->db_export_mode) { 1100 err = db_export__branch_types(&tables->dbe); 1101 if (err) 1102 goto error; 1103 } 1104 1105 free(command_line); 1106 1107 return err; 1108 error: 1109 Py_Finalize(); 1110 free(command_line); 1111 1112 return err; 1113 } 1114 1115 static int python_flush_script(void) 1116 { 1117 struct tables *tables = &tables_global; 1118 1119 return db_export__flush(&tables->dbe); 1120 } 1121 1122 /* 1123 * Stop trace script 1124 */ 1125 static int python_stop_script(void) 1126 { 1127 struct tables *tables = &tables_global; 1128 1129 try_call_object("trace_end", NULL); 1130 1131 db_export__exit(&tables->dbe); 1132 1133 Py_XDECREF(main_dict); 1134 Py_XDECREF(main_module); 1135 Py_Finalize(); 1136 1137 return 0; 1138 } 1139 1140 static int python_generate_script(struct pevent *pevent, const char *outfile) 1141 { 1142 struct event_format *event = NULL; 1143 struct format_field *f; 1144 char fname[PATH_MAX]; 1145 int not_first, count; 1146 FILE *ofp; 1147 1148 sprintf(fname, "%s.py", outfile); 1149 ofp = fopen(fname, "w"); 1150 if (ofp == NULL) { 1151 fprintf(stderr, "couldn't open %s\n", fname); 1152 return -1; 1153 } 1154 fprintf(ofp, "# perf script event handlers, " 1155 "generated by perf script -g python\n"); 1156 1157 fprintf(ofp, "# Licensed under the terms of the GNU GPL" 1158 " License version 2\n\n"); 1159 1160 fprintf(ofp, "# The common_* event handler fields are the most useful " 1161 "fields common to\n"); 1162 1163 fprintf(ofp, "# all events. They don't necessarily correspond to " 1164 "the 'common_*' fields\n"); 1165 1166 fprintf(ofp, "# in the format files. Those fields not available as " 1167 "handler params can\n"); 1168 1169 fprintf(ofp, "# be retrieved using Python functions of the form " 1170 "common_*(context).\n"); 1171 1172 fprintf(ofp, "# See the perf-trace-python Documentation for the list " 1173 "of available functions.\n\n"); 1174 1175 fprintf(ofp, "import os\n"); 1176 fprintf(ofp, "import sys\n\n"); 1177 1178 fprintf(ofp, "sys.path.append(os.environ['PERF_EXEC_PATH'] + \\\n"); 1179 fprintf(ofp, "\t'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')\n"); 1180 fprintf(ofp, "\nfrom perf_trace_context import *\n"); 1181 fprintf(ofp, "from Core import *\n\n\n"); 1182 1183 fprintf(ofp, "def trace_begin():\n"); 1184 fprintf(ofp, "\tprint \"in trace_begin\"\n\n"); 1185 1186 fprintf(ofp, "def trace_end():\n"); 1187 fprintf(ofp, "\tprint \"in trace_end\"\n\n"); 1188 1189 while ((event = trace_find_next_event(pevent, event))) { 1190 fprintf(ofp, "def %s__%s(", event->system, event->name); 1191 fprintf(ofp, "event_name, "); 1192 fprintf(ofp, "context, "); 1193 fprintf(ofp, "common_cpu,\n"); 1194 fprintf(ofp, "\tcommon_secs, "); 1195 fprintf(ofp, "common_nsecs, "); 1196 fprintf(ofp, "common_pid, "); 1197 fprintf(ofp, "common_comm,\n\t"); 1198 fprintf(ofp, "common_callchain, "); 1199 1200 not_first = 0; 1201 count = 0; 1202 1203 for (f = event->format.fields; f; f = f->next) { 1204 if (not_first++) 1205 fprintf(ofp, ", "); 1206 if (++count % 5 == 0) 1207 fprintf(ofp, "\n\t"); 1208 1209 fprintf(ofp, "%s", f->name); 1210 } 1211 fprintf(ofp, "):\n"); 1212 1213 fprintf(ofp, "\t\tprint_header(event_name, common_cpu, " 1214 "common_secs, common_nsecs,\n\t\t\t" 1215 "common_pid, common_comm)\n\n"); 1216 1217 fprintf(ofp, "\t\tprint \""); 1218 1219 not_first = 0; 1220 count = 0; 1221 1222 for (f = event->format.fields; f; f = f->next) { 1223 if (not_first++) 1224 fprintf(ofp, ", "); 1225 if (count && count % 3 == 0) { 1226 fprintf(ofp, "\" \\\n\t\t\""); 1227 } 1228 count++; 1229 1230 fprintf(ofp, "%s=", f->name); 1231 if (f->flags & FIELD_IS_STRING || 1232 f->flags & FIELD_IS_FLAG || 1233 f->flags & FIELD_IS_ARRAY || 1234 f->flags & FIELD_IS_SYMBOLIC) 1235 fprintf(ofp, "%%s"); 1236 else if (f->flags & FIELD_IS_SIGNED) 1237 fprintf(ofp, "%%d"); 1238 else 1239 fprintf(ofp, "%%u"); 1240 } 1241 1242 fprintf(ofp, "\" %% \\\n\t\t("); 1243 1244 not_first = 0; 1245 count = 0; 1246 1247 for (f = event->format.fields; f; f = f->next) { 1248 if (not_first++) 1249 fprintf(ofp, ", "); 1250 1251 if (++count % 5 == 0) 1252 fprintf(ofp, "\n\t\t"); 1253 1254 if (f->flags & FIELD_IS_FLAG) { 1255 if ((count - 1) % 5 != 0) { 1256 fprintf(ofp, "\n\t\t"); 1257 count = 4; 1258 } 1259 fprintf(ofp, "flag_str(\""); 1260 fprintf(ofp, "%s__%s\", ", event->system, 1261 event->name); 1262 fprintf(ofp, "\"%s\", %s)", f->name, 1263 f->name); 1264 } else if (f->flags & FIELD_IS_SYMBOLIC) { 1265 if ((count - 1) % 5 != 0) { 1266 fprintf(ofp, "\n\t\t"); 1267 count = 4; 1268 } 1269 fprintf(ofp, "symbol_str(\""); 1270 fprintf(ofp, "%s__%s\", ", event->system, 1271 event->name); 1272 fprintf(ofp, "\"%s\", %s)", f->name, 1273 f->name); 1274 } else 1275 fprintf(ofp, "%s", f->name); 1276 } 1277 1278 fprintf(ofp, ")\n\n"); 1279 1280 fprintf(ofp, "\t\tfor node in common_callchain:"); 1281 fprintf(ofp, "\n\t\t\tif 'sym' in node:"); 1282 fprintf(ofp, "\n\t\t\t\tprint \"\\t[%%x] %%s\" %% (node['ip'], node['sym']['name'])"); 1283 fprintf(ofp, "\n\t\t\telse:"); 1284 fprintf(ofp, "\n\t\t\t\tprint \"\t[%%x]\" %% (node['ip'])\n\n"); 1285 fprintf(ofp, "\t\tprint \"\\n\"\n\n"); 1286 1287 } 1288 1289 fprintf(ofp, "def trace_unhandled(event_name, context, " 1290 "event_fields_dict):\n"); 1291 1292 fprintf(ofp, "\t\tprint ' '.join(['%%s=%%s'%%(k,str(v))" 1293 "for k,v in sorted(event_fields_dict.items())])\n\n"); 1294 1295 fprintf(ofp, "def print_header(" 1296 "event_name, cpu, secs, nsecs, pid, comm):\n" 1297 "\tprint \"%%-20s %%5u %%05u.%%09u %%8u %%-20s \" %% \\\n\t" 1298 "(event_name, cpu, secs, nsecs, pid, comm),\n"); 1299 1300 fclose(ofp); 1301 1302 fprintf(stderr, "generated Python script: %s\n", fname); 1303 1304 return 0; 1305 } 1306 1307 struct scripting_ops python_scripting_ops = { 1308 .name = "Python", 1309 .start_script = python_start_script, 1310 .flush_script = python_flush_script, 1311 .stop_script = python_stop_script, 1312 .process_event = python_process_event, 1313 .process_stat = python_process_stat, 1314 .process_stat_interval = python_process_stat_interval, 1315 .generate_script = python_generate_script, 1316 }; 1317