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