1 /* 2 * Copyright (C) 2011, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com> 3 * 4 * Parts came from builtin-{top,stat,record}.c, see those files for further 5 * copyright notes. 6 * 7 * Released under the GPL v2. (and only v2, not any later version) 8 */ 9 10 #include <byteswap.h> 11 #include <linux/bitops.h> 12 #include <lk/debugfs.h> 13 #include <traceevent/event-parse.h> 14 #include <linux/hw_breakpoint.h> 15 #include <linux/perf_event.h> 16 #include <sys/resource.h> 17 #include "asm/bug.h" 18 #include "evsel.h" 19 #include "evlist.h" 20 #include "util.h" 21 #include "cpumap.h" 22 #include "thread_map.h" 23 #include "target.h" 24 #include "perf_regs.h" 25 #include "debug.h" 26 27 static struct { 28 bool sample_id_all; 29 bool exclude_guest; 30 bool mmap2; 31 } perf_missing_features; 32 33 #define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y)) 34 35 int __perf_evsel__sample_size(u64 sample_type) 36 { 37 u64 mask = sample_type & PERF_SAMPLE_MASK; 38 int size = 0; 39 int i; 40 41 for (i = 0; i < 64; i++) { 42 if (mask & (1ULL << i)) 43 size++; 44 } 45 46 size *= sizeof(u64); 47 48 return size; 49 } 50 51 /** 52 * __perf_evsel__calc_id_pos - calculate id_pos. 53 * @sample_type: sample type 54 * 55 * This function returns the position of the event id (PERF_SAMPLE_ID or 56 * PERF_SAMPLE_IDENTIFIER) in a sample event i.e. in the array of struct 57 * sample_event. 58 */ 59 static int __perf_evsel__calc_id_pos(u64 sample_type) 60 { 61 int idx = 0; 62 63 if (sample_type & PERF_SAMPLE_IDENTIFIER) 64 return 0; 65 66 if (!(sample_type & PERF_SAMPLE_ID)) 67 return -1; 68 69 if (sample_type & PERF_SAMPLE_IP) 70 idx += 1; 71 72 if (sample_type & PERF_SAMPLE_TID) 73 idx += 1; 74 75 if (sample_type & PERF_SAMPLE_TIME) 76 idx += 1; 77 78 if (sample_type & PERF_SAMPLE_ADDR) 79 idx += 1; 80 81 return idx; 82 } 83 84 /** 85 * __perf_evsel__calc_is_pos - calculate is_pos. 86 * @sample_type: sample type 87 * 88 * This function returns the position (counting backwards) of the event id 89 * (PERF_SAMPLE_ID or PERF_SAMPLE_IDENTIFIER) in a non-sample event i.e. if 90 * sample_id_all is used there is an id sample appended to non-sample events. 91 */ 92 static int __perf_evsel__calc_is_pos(u64 sample_type) 93 { 94 int idx = 1; 95 96 if (sample_type & PERF_SAMPLE_IDENTIFIER) 97 return 1; 98 99 if (!(sample_type & PERF_SAMPLE_ID)) 100 return -1; 101 102 if (sample_type & PERF_SAMPLE_CPU) 103 idx += 1; 104 105 if (sample_type & PERF_SAMPLE_STREAM_ID) 106 idx += 1; 107 108 return idx; 109 } 110 111 void perf_evsel__calc_id_pos(struct perf_evsel *evsel) 112 { 113 evsel->id_pos = __perf_evsel__calc_id_pos(evsel->attr.sample_type); 114 evsel->is_pos = __perf_evsel__calc_is_pos(evsel->attr.sample_type); 115 } 116 117 void hists__init(struct hists *hists) 118 { 119 memset(hists, 0, sizeof(*hists)); 120 hists->entries_in_array[0] = hists->entries_in_array[1] = RB_ROOT; 121 hists->entries_in = &hists->entries_in_array[0]; 122 hists->entries_collapsed = RB_ROOT; 123 hists->entries = RB_ROOT; 124 pthread_mutex_init(&hists->lock, NULL); 125 } 126 127 void __perf_evsel__set_sample_bit(struct perf_evsel *evsel, 128 enum perf_event_sample_format bit) 129 { 130 if (!(evsel->attr.sample_type & bit)) { 131 evsel->attr.sample_type |= bit; 132 evsel->sample_size += sizeof(u64); 133 perf_evsel__calc_id_pos(evsel); 134 } 135 } 136 137 void __perf_evsel__reset_sample_bit(struct perf_evsel *evsel, 138 enum perf_event_sample_format bit) 139 { 140 if (evsel->attr.sample_type & bit) { 141 evsel->attr.sample_type &= ~bit; 142 evsel->sample_size -= sizeof(u64); 143 perf_evsel__calc_id_pos(evsel); 144 } 145 } 146 147 void perf_evsel__set_sample_id(struct perf_evsel *evsel, 148 bool can_sample_identifier) 149 { 150 if (can_sample_identifier) { 151 perf_evsel__reset_sample_bit(evsel, ID); 152 perf_evsel__set_sample_bit(evsel, IDENTIFIER); 153 } else { 154 perf_evsel__set_sample_bit(evsel, ID); 155 } 156 evsel->attr.read_format |= PERF_FORMAT_ID; 157 } 158 159 void perf_evsel__init(struct perf_evsel *evsel, 160 struct perf_event_attr *attr, int idx) 161 { 162 evsel->idx = idx; 163 evsel->attr = *attr; 164 evsel->leader = evsel; 165 INIT_LIST_HEAD(&evsel->node); 166 hists__init(&evsel->hists); 167 evsel->sample_size = __perf_evsel__sample_size(attr->sample_type); 168 perf_evsel__calc_id_pos(evsel); 169 } 170 171 struct perf_evsel *perf_evsel__new_idx(struct perf_event_attr *attr, int idx) 172 { 173 struct perf_evsel *evsel = zalloc(sizeof(*evsel)); 174 175 if (evsel != NULL) 176 perf_evsel__init(evsel, attr, idx); 177 178 return evsel; 179 } 180 181 struct event_format *event_format__new(const char *sys, const char *name) 182 { 183 int fd, n; 184 char *filename; 185 void *bf = NULL, *nbf; 186 size_t size = 0, alloc_size = 0; 187 struct event_format *format = NULL; 188 189 if (asprintf(&filename, "%s/%s/%s/format", tracing_events_path, sys, name) < 0) 190 goto out; 191 192 fd = open(filename, O_RDONLY); 193 if (fd < 0) 194 goto out_free_filename; 195 196 do { 197 if (size == alloc_size) { 198 alloc_size += BUFSIZ; 199 nbf = realloc(bf, alloc_size); 200 if (nbf == NULL) 201 goto out_free_bf; 202 bf = nbf; 203 } 204 205 n = read(fd, bf + size, alloc_size - size); 206 if (n < 0) 207 goto out_free_bf; 208 size += n; 209 } while (n > 0); 210 211 pevent_parse_format(&format, bf, size, sys); 212 213 out_free_bf: 214 free(bf); 215 close(fd); 216 out_free_filename: 217 free(filename); 218 out: 219 return format; 220 } 221 222 struct perf_evsel *perf_evsel__newtp_idx(const char *sys, const char *name, int idx) 223 { 224 struct perf_evsel *evsel = zalloc(sizeof(*evsel)); 225 226 if (evsel != NULL) { 227 struct perf_event_attr attr = { 228 .type = PERF_TYPE_TRACEPOINT, 229 .sample_type = (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | 230 PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD), 231 }; 232 233 if (asprintf(&evsel->name, "%s:%s", sys, name) < 0) 234 goto out_free; 235 236 evsel->tp_format = event_format__new(sys, name); 237 if (evsel->tp_format == NULL) 238 goto out_free; 239 240 event_attr_init(&attr); 241 attr.config = evsel->tp_format->id; 242 attr.sample_period = 1; 243 perf_evsel__init(evsel, &attr, idx); 244 } 245 246 return evsel; 247 248 out_free: 249 free(evsel->name); 250 free(evsel); 251 return NULL; 252 } 253 254 const char *perf_evsel__hw_names[PERF_COUNT_HW_MAX] = { 255 "cycles", 256 "instructions", 257 "cache-references", 258 "cache-misses", 259 "branches", 260 "branch-misses", 261 "bus-cycles", 262 "stalled-cycles-frontend", 263 "stalled-cycles-backend", 264 "ref-cycles", 265 }; 266 267 static const char *__perf_evsel__hw_name(u64 config) 268 { 269 if (config < PERF_COUNT_HW_MAX && perf_evsel__hw_names[config]) 270 return perf_evsel__hw_names[config]; 271 272 return "unknown-hardware"; 273 } 274 275 static int perf_evsel__add_modifiers(struct perf_evsel *evsel, char *bf, size_t size) 276 { 277 int colon = 0, r = 0; 278 struct perf_event_attr *attr = &evsel->attr; 279 bool exclude_guest_default = false; 280 281 #define MOD_PRINT(context, mod) do { \ 282 if (!attr->exclude_##context) { \ 283 if (!colon) colon = ++r; \ 284 r += scnprintf(bf + r, size - r, "%c", mod); \ 285 } } while(0) 286 287 if (attr->exclude_kernel || attr->exclude_user || attr->exclude_hv) { 288 MOD_PRINT(kernel, 'k'); 289 MOD_PRINT(user, 'u'); 290 MOD_PRINT(hv, 'h'); 291 exclude_guest_default = true; 292 } 293 294 if (attr->precise_ip) { 295 if (!colon) 296 colon = ++r; 297 r += scnprintf(bf + r, size - r, "%.*s", attr->precise_ip, "ppp"); 298 exclude_guest_default = true; 299 } 300 301 if (attr->exclude_host || attr->exclude_guest == exclude_guest_default) { 302 MOD_PRINT(host, 'H'); 303 MOD_PRINT(guest, 'G'); 304 } 305 #undef MOD_PRINT 306 if (colon) 307 bf[colon - 1] = ':'; 308 return r; 309 } 310 311 static int perf_evsel__hw_name(struct perf_evsel *evsel, char *bf, size_t size) 312 { 313 int r = scnprintf(bf, size, "%s", __perf_evsel__hw_name(evsel->attr.config)); 314 return r + perf_evsel__add_modifiers(evsel, bf + r, size - r); 315 } 316 317 const char *perf_evsel__sw_names[PERF_COUNT_SW_MAX] = { 318 "cpu-clock", 319 "task-clock", 320 "page-faults", 321 "context-switches", 322 "cpu-migrations", 323 "minor-faults", 324 "major-faults", 325 "alignment-faults", 326 "emulation-faults", 327 "dummy", 328 }; 329 330 static const char *__perf_evsel__sw_name(u64 config) 331 { 332 if (config < PERF_COUNT_SW_MAX && perf_evsel__sw_names[config]) 333 return perf_evsel__sw_names[config]; 334 return "unknown-software"; 335 } 336 337 static int perf_evsel__sw_name(struct perf_evsel *evsel, char *bf, size_t size) 338 { 339 int r = scnprintf(bf, size, "%s", __perf_evsel__sw_name(evsel->attr.config)); 340 return r + perf_evsel__add_modifiers(evsel, bf + r, size - r); 341 } 342 343 static int __perf_evsel__bp_name(char *bf, size_t size, u64 addr, u64 type) 344 { 345 int r; 346 347 r = scnprintf(bf, size, "mem:0x%" PRIx64 ":", addr); 348 349 if (type & HW_BREAKPOINT_R) 350 r += scnprintf(bf + r, size - r, "r"); 351 352 if (type & HW_BREAKPOINT_W) 353 r += scnprintf(bf + r, size - r, "w"); 354 355 if (type & HW_BREAKPOINT_X) 356 r += scnprintf(bf + r, size - r, "x"); 357 358 return r; 359 } 360 361 static int perf_evsel__bp_name(struct perf_evsel *evsel, char *bf, size_t size) 362 { 363 struct perf_event_attr *attr = &evsel->attr; 364 int r = __perf_evsel__bp_name(bf, size, attr->bp_addr, attr->bp_type); 365 return r + perf_evsel__add_modifiers(evsel, bf + r, size - r); 366 } 367 368 const char *perf_evsel__hw_cache[PERF_COUNT_HW_CACHE_MAX] 369 [PERF_EVSEL__MAX_ALIASES] = { 370 { "L1-dcache", "l1-d", "l1d", "L1-data", }, 371 { "L1-icache", "l1-i", "l1i", "L1-instruction", }, 372 { "LLC", "L2", }, 373 { "dTLB", "d-tlb", "Data-TLB", }, 374 { "iTLB", "i-tlb", "Instruction-TLB", }, 375 { "branch", "branches", "bpu", "btb", "bpc", }, 376 { "node", }, 377 }; 378 379 const char *perf_evsel__hw_cache_op[PERF_COUNT_HW_CACHE_OP_MAX] 380 [PERF_EVSEL__MAX_ALIASES] = { 381 { "load", "loads", "read", }, 382 { "store", "stores", "write", }, 383 { "prefetch", "prefetches", "speculative-read", "speculative-load", }, 384 }; 385 386 const char *perf_evsel__hw_cache_result[PERF_COUNT_HW_CACHE_RESULT_MAX] 387 [PERF_EVSEL__MAX_ALIASES] = { 388 { "refs", "Reference", "ops", "access", }, 389 { "misses", "miss", }, 390 }; 391 392 #define C(x) PERF_COUNT_HW_CACHE_##x 393 #define CACHE_READ (1 << C(OP_READ)) 394 #define CACHE_WRITE (1 << C(OP_WRITE)) 395 #define CACHE_PREFETCH (1 << C(OP_PREFETCH)) 396 #define COP(x) (1 << x) 397 398 /* 399 * cache operartion stat 400 * L1I : Read and prefetch only 401 * ITLB and BPU : Read-only 402 */ 403 static unsigned long perf_evsel__hw_cache_stat[C(MAX)] = { 404 [C(L1D)] = (CACHE_READ | CACHE_WRITE | CACHE_PREFETCH), 405 [C(L1I)] = (CACHE_READ | CACHE_PREFETCH), 406 [C(LL)] = (CACHE_READ | CACHE_WRITE | CACHE_PREFETCH), 407 [C(DTLB)] = (CACHE_READ | CACHE_WRITE | CACHE_PREFETCH), 408 [C(ITLB)] = (CACHE_READ), 409 [C(BPU)] = (CACHE_READ), 410 [C(NODE)] = (CACHE_READ | CACHE_WRITE | CACHE_PREFETCH), 411 }; 412 413 bool perf_evsel__is_cache_op_valid(u8 type, u8 op) 414 { 415 if (perf_evsel__hw_cache_stat[type] & COP(op)) 416 return true; /* valid */ 417 else 418 return false; /* invalid */ 419 } 420 421 int __perf_evsel__hw_cache_type_op_res_name(u8 type, u8 op, u8 result, 422 char *bf, size_t size) 423 { 424 if (result) { 425 return scnprintf(bf, size, "%s-%s-%s", perf_evsel__hw_cache[type][0], 426 perf_evsel__hw_cache_op[op][0], 427 perf_evsel__hw_cache_result[result][0]); 428 } 429 430 return scnprintf(bf, size, "%s-%s", perf_evsel__hw_cache[type][0], 431 perf_evsel__hw_cache_op[op][1]); 432 } 433 434 static int __perf_evsel__hw_cache_name(u64 config, char *bf, size_t size) 435 { 436 u8 op, result, type = (config >> 0) & 0xff; 437 const char *err = "unknown-ext-hardware-cache-type"; 438 439 if (type > PERF_COUNT_HW_CACHE_MAX) 440 goto out_err; 441 442 op = (config >> 8) & 0xff; 443 err = "unknown-ext-hardware-cache-op"; 444 if (op > PERF_COUNT_HW_CACHE_OP_MAX) 445 goto out_err; 446 447 result = (config >> 16) & 0xff; 448 err = "unknown-ext-hardware-cache-result"; 449 if (result > PERF_COUNT_HW_CACHE_RESULT_MAX) 450 goto out_err; 451 452 err = "invalid-cache"; 453 if (!perf_evsel__is_cache_op_valid(type, op)) 454 goto out_err; 455 456 return __perf_evsel__hw_cache_type_op_res_name(type, op, result, bf, size); 457 out_err: 458 return scnprintf(bf, size, "%s", err); 459 } 460 461 static int perf_evsel__hw_cache_name(struct perf_evsel *evsel, char *bf, size_t size) 462 { 463 int ret = __perf_evsel__hw_cache_name(evsel->attr.config, bf, size); 464 return ret + perf_evsel__add_modifiers(evsel, bf + ret, size - ret); 465 } 466 467 static int perf_evsel__raw_name(struct perf_evsel *evsel, char *bf, size_t size) 468 { 469 int ret = scnprintf(bf, size, "raw 0x%" PRIx64, evsel->attr.config); 470 return ret + perf_evsel__add_modifiers(evsel, bf + ret, size - ret); 471 } 472 473 const char *perf_evsel__name(struct perf_evsel *evsel) 474 { 475 char bf[128]; 476 477 if (evsel->name) 478 return evsel->name; 479 480 switch (evsel->attr.type) { 481 case PERF_TYPE_RAW: 482 perf_evsel__raw_name(evsel, bf, sizeof(bf)); 483 break; 484 485 case PERF_TYPE_HARDWARE: 486 perf_evsel__hw_name(evsel, bf, sizeof(bf)); 487 break; 488 489 case PERF_TYPE_HW_CACHE: 490 perf_evsel__hw_cache_name(evsel, bf, sizeof(bf)); 491 break; 492 493 case PERF_TYPE_SOFTWARE: 494 perf_evsel__sw_name(evsel, bf, sizeof(bf)); 495 break; 496 497 case PERF_TYPE_TRACEPOINT: 498 scnprintf(bf, sizeof(bf), "%s", "unknown tracepoint"); 499 break; 500 501 case PERF_TYPE_BREAKPOINT: 502 perf_evsel__bp_name(evsel, bf, sizeof(bf)); 503 break; 504 505 default: 506 scnprintf(bf, sizeof(bf), "unknown attr type: %d", 507 evsel->attr.type); 508 break; 509 } 510 511 evsel->name = strdup(bf); 512 513 return evsel->name ?: "unknown"; 514 } 515 516 const char *perf_evsel__group_name(struct perf_evsel *evsel) 517 { 518 return evsel->group_name ?: "anon group"; 519 } 520 521 int perf_evsel__group_desc(struct perf_evsel *evsel, char *buf, size_t size) 522 { 523 int ret; 524 struct perf_evsel *pos; 525 const char *group_name = perf_evsel__group_name(evsel); 526 527 ret = scnprintf(buf, size, "%s", group_name); 528 529 ret += scnprintf(buf + ret, size - ret, " { %s", 530 perf_evsel__name(evsel)); 531 532 for_each_group_member(pos, evsel) 533 ret += scnprintf(buf + ret, size - ret, ", %s", 534 perf_evsel__name(pos)); 535 536 ret += scnprintf(buf + ret, size - ret, " }"); 537 538 return ret; 539 } 540 541 /* 542 * The enable_on_exec/disabled value strategy: 543 * 544 * 1) For any type of traced program: 545 * - all independent events and group leaders are disabled 546 * - all group members are enabled 547 * 548 * Group members are ruled by group leaders. They need to 549 * be enabled, because the group scheduling relies on that. 550 * 551 * 2) For traced programs executed by perf: 552 * - all independent events and group leaders have 553 * enable_on_exec set 554 * - we don't specifically enable or disable any event during 555 * the record command 556 * 557 * Independent events and group leaders are initially disabled 558 * and get enabled by exec. Group members are ruled by group 559 * leaders as stated in 1). 560 * 561 * 3) For traced programs attached by perf (pid/tid): 562 * - we specifically enable or disable all events during 563 * the record command 564 * 565 * When attaching events to already running traced we 566 * enable/disable events specifically, as there's no 567 * initial traced exec call. 568 */ 569 void perf_evsel__config(struct perf_evsel *evsel, 570 struct perf_record_opts *opts) 571 { 572 struct perf_evsel *leader = evsel->leader; 573 struct perf_event_attr *attr = &evsel->attr; 574 int track = !evsel->idx; /* only the first counter needs these */ 575 576 attr->sample_id_all = perf_missing_features.sample_id_all ? 0 : 1; 577 attr->inherit = !opts->no_inherit; 578 579 perf_evsel__set_sample_bit(evsel, IP); 580 perf_evsel__set_sample_bit(evsel, TID); 581 582 if (evsel->sample_read) { 583 perf_evsel__set_sample_bit(evsel, READ); 584 585 /* 586 * We need ID even in case of single event, because 587 * PERF_SAMPLE_READ process ID specific data. 588 */ 589 perf_evsel__set_sample_id(evsel, false); 590 591 /* 592 * Apply group format only if we belong to group 593 * with more than one members. 594 */ 595 if (leader->nr_members > 1) { 596 attr->read_format |= PERF_FORMAT_GROUP; 597 attr->inherit = 0; 598 } 599 } 600 601 /* 602 * We default some events to a 1 default interval. But keep 603 * it a weak assumption overridable by the user. 604 */ 605 if (!attr->sample_period || (opts->user_freq != UINT_MAX && 606 opts->user_interval != ULLONG_MAX)) { 607 if (opts->freq) { 608 perf_evsel__set_sample_bit(evsel, PERIOD); 609 attr->freq = 1; 610 attr->sample_freq = opts->freq; 611 } else { 612 attr->sample_period = opts->default_interval; 613 } 614 } 615 616 /* 617 * Disable sampling for all group members other 618 * than leader in case leader 'leads' the sampling. 619 */ 620 if ((leader != evsel) && leader->sample_read) { 621 attr->sample_freq = 0; 622 attr->sample_period = 0; 623 } 624 625 if (opts->no_samples) 626 attr->sample_freq = 0; 627 628 if (opts->inherit_stat) 629 attr->inherit_stat = 1; 630 631 if (opts->sample_address) { 632 perf_evsel__set_sample_bit(evsel, ADDR); 633 attr->mmap_data = track; 634 } 635 636 if (opts->call_graph) { 637 perf_evsel__set_sample_bit(evsel, CALLCHAIN); 638 639 if (opts->call_graph == CALLCHAIN_DWARF) { 640 perf_evsel__set_sample_bit(evsel, REGS_USER); 641 perf_evsel__set_sample_bit(evsel, STACK_USER); 642 attr->sample_regs_user = PERF_REGS_MASK; 643 attr->sample_stack_user = opts->stack_dump_size; 644 attr->exclude_callchain_user = 1; 645 } 646 } 647 648 if (target__has_cpu(&opts->target) || opts->target.force_per_cpu) 649 perf_evsel__set_sample_bit(evsel, CPU); 650 651 if (opts->period) 652 perf_evsel__set_sample_bit(evsel, PERIOD); 653 654 if (!perf_missing_features.sample_id_all && 655 (opts->sample_time || !opts->no_inherit || 656 target__has_cpu(&opts->target) || opts->target.force_per_cpu)) 657 perf_evsel__set_sample_bit(evsel, TIME); 658 659 if (opts->raw_samples) { 660 perf_evsel__set_sample_bit(evsel, TIME); 661 perf_evsel__set_sample_bit(evsel, RAW); 662 perf_evsel__set_sample_bit(evsel, CPU); 663 } 664 665 if (opts->sample_address) 666 perf_evsel__set_sample_bit(evsel, DATA_SRC); 667 668 if (opts->no_delay) { 669 attr->watermark = 0; 670 attr->wakeup_events = 1; 671 } 672 if (opts->branch_stack) { 673 perf_evsel__set_sample_bit(evsel, BRANCH_STACK); 674 attr->branch_sample_type = opts->branch_stack; 675 } 676 677 if (opts->sample_weight) 678 perf_evsel__set_sample_bit(evsel, WEIGHT); 679 680 attr->mmap = track; 681 attr->comm = track; 682 683 if (opts->sample_transaction) 684 perf_evsel__set_sample_bit(evsel, TRANSACTION); 685 686 /* 687 * XXX see the function comment above 688 * 689 * Disabling only independent events or group leaders, 690 * keeping group members enabled. 691 */ 692 if (perf_evsel__is_group_leader(evsel)) 693 attr->disabled = 1; 694 695 /* 696 * Setting enable_on_exec for independent events and 697 * group leaders for traced executed by perf. 698 */ 699 if (target__none(&opts->target) && perf_evsel__is_group_leader(evsel)) 700 attr->enable_on_exec = 1; 701 } 702 703 int perf_evsel__alloc_fd(struct perf_evsel *evsel, int ncpus, int nthreads) 704 { 705 int cpu, thread; 706 evsel->fd = xyarray__new(ncpus, nthreads, sizeof(int)); 707 708 if (evsel->fd) { 709 for (cpu = 0; cpu < ncpus; cpu++) { 710 for (thread = 0; thread < nthreads; thread++) { 711 FD(evsel, cpu, thread) = -1; 712 } 713 } 714 } 715 716 return evsel->fd != NULL ? 0 : -ENOMEM; 717 } 718 719 static int perf_evsel__run_ioctl(struct perf_evsel *evsel, int ncpus, int nthreads, 720 int ioc, void *arg) 721 { 722 int cpu, thread; 723 724 for (cpu = 0; cpu < ncpus; cpu++) { 725 for (thread = 0; thread < nthreads; thread++) { 726 int fd = FD(evsel, cpu, thread), 727 err = ioctl(fd, ioc, arg); 728 729 if (err) 730 return err; 731 } 732 } 733 734 return 0; 735 } 736 737 int perf_evsel__set_filter(struct perf_evsel *evsel, int ncpus, int nthreads, 738 const char *filter) 739 { 740 return perf_evsel__run_ioctl(evsel, ncpus, nthreads, 741 PERF_EVENT_IOC_SET_FILTER, 742 (void *)filter); 743 } 744 745 int perf_evsel__enable(struct perf_evsel *evsel, int ncpus, int nthreads) 746 { 747 return perf_evsel__run_ioctl(evsel, ncpus, nthreads, 748 PERF_EVENT_IOC_ENABLE, 749 0); 750 } 751 752 int perf_evsel__alloc_id(struct perf_evsel *evsel, int ncpus, int nthreads) 753 { 754 evsel->sample_id = xyarray__new(ncpus, nthreads, sizeof(struct perf_sample_id)); 755 if (evsel->sample_id == NULL) 756 return -ENOMEM; 757 758 evsel->id = zalloc(ncpus * nthreads * sizeof(u64)); 759 if (evsel->id == NULL) { 760 xyarray__delete(evsel->sample_id); 761 evsel->sample_id = NULL; 762 return -ENOMEM; 763 } 764 765 return 0; 766 } 767 768 void perf_evsel__reset_counts(struct perf_evsel *evsel, int ncpus) 769 { 770 memset(evsel->counts, 0, (sizeof(*evsel->counts) + 771 (ncpus * sizeof(struct perf_counts_values)))); 772 } 773 774 int perf_evsel__alloc_counts(struct perf_evsel *evsel, int ncpus) 775 { 776 evsel->counts = zalloc((sizeof(*evsel->counts) + 777 (ncpus * sizeof(struct perf_counts_values)))); 778 return evsel->counts != NULL ? 0 : -ENOMEM; 779 } 780 781 void perf_evsel__free_fd(struct perf_evsel *evsel) 782 { 783 xyarray__delete(evsel->fd); 784 evsel->fd = NULL; 785 } 786 787 void perf_evsel__free_id(struct perf_evsel *evsel) 788 { 789 xyarray__delete(evsel->sample_id); 790 evsel->sample_id = NULL; 791 free(evsel->id); 792 evsel->id = NULL; 793 } 794 795 void perf_evsel__close_fd(struct perf_evsel *evsel, int ncpus, int nthreads) 796 { 797 int cpu, thread; 798 799 for (cpu = 0; cpu < ncpus; cpu++) 800 for (thread = 0; thread < nthreads; ++thread) { 801 close(FD(evsel, cpu, thread)); 802 FD(evsel, cpu, thread) = -1; 803 } 804 } 805 806 void perf_evsel__free_counts(struct perf_evsel *evsel) 807 { 808 free(evsel->counts); 809 } 810 811 void perf_evsel__exit(struct perf_evsel *evsel) 812 { 813 assert(list_empty(&evsel->node)); 814 perf_evsel__free_fd(evsel); 815 perf_evsel__free_id(evsel); 816 } 817 818 void perf_evsel__delete(struct perf_evsel *evsel) 819 { 820 perf_evsel__exit(evsel); 821 close_cgroup(evsel->cgrp); 822 free(evsel->group_name); 823 if (evsel->tp_format) 824 pevent_free_format(evsel->tp_format); 825 free(evsel->name); 826 free(evsel); 827 } 828 829 static inline void compute_deltas(struct perf_evsel *evsel, 830 int cpu, 831 struct perf_counts_values *count) 832 { 833 struct perf_counts_values tmp; 834 835 if (!evsel->prev_raw_counts) 836 return; 837 838 if (cpu == -1) { 839 tmp = evsel->prev_raw_counts->aggr; 840 evsel->prev_raw_counts->aggr = *count; 841 } else { 842 tmp = evsel->prev_raw_counts->cpu[cpu]; 843 evsel->prev_raw_counts->cpu[cpu] = *count; 844 } 845 846 count->val = count->val - tmp.val; 847 count->ena = count->ena - tmp.ena; 848 count->run = count->run - tmp.run; 849 } 850 851 int __perf_evsel__read_on_cpu(struct perf_evsel *evsel, 852 int cpu, int thread, bool scale) 853 { 854 struct perf_counts_values count; 855 size_t nv = scale ? 3 : 1; 856 857 if (FD(evsel, cpu, thread) < 0) 858 return -EINVAL; 859 860 if (evsel->counts == NULL && perf_evsel__alloc_counts(evsel, cpu + 1) < 0) 861 return -ENOMEM; 862 863 if (readn(FD(evsel, cpu, thread), &count, nv * sizeof(u64)) < 0) 864 return -errno; 865 866 compute_deltas(evsel, cpu, &count); 867 868 if (scale) { 869 if (count.run == 0) 870 count.val = 0; 871 else if (count.run < count.ena) 872 count.val = (u64)((double)count.val * count.ena / count.run + 0.5); 873 } else 874 count.ena = count.run = 0; 875 876 evsel->counts->cpu[cpu] = count; 877 return 0; 878 } 879 880 int __perf_evsel__read(struct perf_evsel *evsel, 881 int ncpus, int nthreads, bool scale) 882 { 883 size_t nv = scale ? 3 : 1; 884 int cpu, thread; 885 struct perf_counts_values *aggr = &evsel->counts->aggr, count; 886 887 aggr->val = aggr->ena = aggr->run = 0; 888 889 for (cpu = 0; cpu < ncpus; cpu++) { 890 for (thread = 0; thread < nthreads; thread++) { 891 if (FD(evsel, cpu, thread) < 0) 892 continue; 893 894 if (readn(FD(evsel, cpu, thread), 895 &count, nv * sizeof(u64)) < 0) 896 return -errno; 897 898 aggr->val += count.val; 899 if (scale) { 900 aggr->ena += count.ena; 901 aggr->run += count.run; 902 } 903 } 904 } 905 906 compute_deltas(evsel, -1, aggr); 907 908 evsel->counts->scaled = 0; 909 if (scale) { 910 if (aggr->run == 0) { 911 evsel->counts->scaled = -1; 912 aggr->val = 0; 913 return 0; 914 } 915 916 if (aggr->run < aggr->ena) { 917 evsel->counts->scaled = 1; 918 aggr->val = (u64)((double)aggr->val * aggr->ena / aggr->run + 0.5); 919 } 920 } else 921 aggr->ena = aggr->run = 0; 922 923 return 0; 924 } 925 926 static int get_group_fd(struct perf_evsel *evsel, int cpu, int thread) 927 { 928 struct perf_evsel *leader = evsel->leader; 929 int fd; 930 931 if (perf_evsel__is_group_leader(evsel)) 932 return -1; 933 934 /* 935 * Leader must be already processed/open, 936 * if not it's a bug. 937 */ 938 BUG_ON(!leader->fd); 939 940 fd = FD(leader, cpu, thread); 941 BUG_ON(fd == -1); 942 943 return fd; 944 } 945 946 #define __PRINT_ATTR(fmt, cast, field) \ 947 fprintf(fp, " %-19s "fmt"\n", #field, cast attr->field) 948 949 #define PRINT_ATTR_U32(field) __PRINT_ATTR("%u" , , field) 950 #define PRINT_ATTR_X32(field) __PRINT_ATTR("%#x", , field) 951 #define PRINT_ATTR_U64(field) __PRINT_ATTR("%" PRIu64, (uint64_t), field) 952 #define PRINT_ATTR_X64(field) __PRINT_ATTR("%#"PRIx64, (uint64_t), field) 953 954 #define PRINT_ATTR2N(name1, field1, name2, field2) \ 955 fprintf(fp, " %-19s %u %-19s %u\n", \ 956 name1, attr->field1, name2, attr->field2) 957 958 #define PRINT_ATTR2(field1, field2) \ 959 PRINT_ATTR2N(#field1, field1, #field2, field2) 960 961 static size_t perf_event_attr__fprintf(struct perf_event_attr *attr, FILE *fp) 962 { 963 size_t ret = 0; 964 965 ret += fprintf(fp, "%.60s\n", graph_dotted_line); 966 ret += fprintf(fp, "perf_event_attr:\n"); 967 968 ret += PRINT_ATTR_U32(type); 969 ret += PRINT_ATTR_U32(size); 970 ret += PRINT_ATTR_X64(config); 971 ret += PRINT_ATTR_U64(sample_period); 972 ret += PRINT_ATTR_U64(sample_freq); 973 ret += PRINT_ATTR_X64(sample_type); 974 ret += PRINT_ATTR_X64(read_format); 975 976 ret += PRINT_ATTR2(disabled, inherit); 977 ret += PRINT_ATTR2(pinned, exclusive); 978 ret += PRINT_ATTR2(exclude_user, exclude_kernel); 979 ret += PRINT_ATTR2(exclude_hv, exclude_idle); 980 ret += PRINT_ATTR2(mmap, comm); 981 ret += PRINT_ATTR2(freq, inherit_stat); 982 ret += PRINT_ATTR2(enable_on_exec, task); 983 ret += PRINT_ATTR2(watermark, precise_ip); 984 ret += PRINT_ATTR2(mmap_data, sample_id_all); 985 ret += PRINT_ATTR2(exclude_host, exclude_guest); 986 ret += PRINT_ATTR2N("excl.callchain_kern", exclude_callchain_kernel, 987 "excl.callchain_user", exclude_callchain_user); 988 ret += PRINT_ATTR_U32(mmap2); 989 990 ret += PRINT_ATTR_U32(wakeup_events); 991 ret += PRINT_ATTR_U32(wakeup_watermark); 992 ret += PRINT_ATTR_X32(bp_type); 993 ret += PRINT_ATTR_X64(bp_addr); 994 ret += PRINT_ATTR_X64(config1); 995 ret += PRINT_ATTR_U64(bp_len); 996 ret += PRINT_ATTR_X64(config2); 997 ret += PRINT_ATTR_X64(branch_sample_type); 998 ret += PRINT_ATTR_X64(sample_regs_user); 999 ret += PRINT_ATTR_U32(sample_stack_user); 1000 1001 ret += fprintf(fp, "%.60s\n", graph_dotted_line); 1002 1003 return ret; 1004 } 1005 1006 static int __perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus, 1007 struct thread_map *threads) 1008 { 1009 int cpu, thread; 1010 unsigned long flags = 0; 1011 int pid = -1, err; 1012 enum { NO_CHANGE, SET_TO_MAX, INCREASED_MAX } set_rlimit = NO_CHANGE; 1013 1014 if (evsel->fd == NULL && 1015 perf_evsel__alloc_fd(evsel, cpus->nr, threads->nr) < 0) 1016 return -ENOMEM; 1017 1018 if (evsel->cgrp) { 1019 flags = PERF_FLAG_PID_CGROUP; 1020 pid = evsel->cgrp->fd; 1021 } 1022 1023 fallback_missing_features: 1024 if (perf_missing_features.mmap2) 1025 evsel->attr.mmap2 = 0; 1026 if (perf_missing_features.exclude_guest) 1027 evsel->attr.exclude_guest = evsel->attr.exclude_host = 0; 1028 retry_sample_id: 1029 if (perf_missing_features.sample_id_all) 1030 evsel->attr.sample_id_all = 0; 1031 1032 if (verbose >= 2) 1033 perf_event_attr__fprintf(&evsel->attr, stderr); 1034 1035 for (cpu = 0; cpu < cpus->nr; cpu++) { 1036 1037 for (thread = 0; thread < threads->nr; thread++) { 1038 int group_fd; 1039 1040 if (!evsel->cgrp) 1041 pid = threads->map[thread]; 1042 1043 group_fd = get_group_fd(evsel, cpu, thread); 1044 retry_open: 1045 pr_debug2("perf_event_open: pid %d cpu %d group_fd %d flags %#lx\n", 1046 pid, cpus->map[cpu], group_fd, flags); 1047 1048 FD(evsel, cpu, thread) = sys_perf_event_open(&evsel->attr, 1049 pid, 1050 cpus->map[cpu], 1051 group_fd, flags); 1052 if (FD(evsel, cpu, thread) < 0) { 1053 err = -errno; 1054 pr_debug2("perf_event_open failed, error %d\n", 1055 err); 1056 goto try_fallback; 1057 } 1058 set_rlimit = NO_CHANGE; 1059 } 1060 } 1061 1062 return 0; 1063 1064 try_fallback: 1065 /* 1066 * perf stat needs between 5 and 22 fds per CPU. When we run out 1067 * of them try to increase the limits. 1068 */ 1069 if (err == -EMFILE && set_rlimit < INCREASED_MAX) { 1070 struct rlimit l; 1071 int old_errno = errno; 1072 1073 if (getrlimit(RLIMIT_NOFILE, &l) == 0) { 1074 if (set_rlimit == NO_CHANGE) 1075 l.rlim_cur = l.rlim_max; 1076 else { 1077 l.rlim_cur = l.rlim_max + 1000; 1078 l.rlim_max = l.rlim_cur; 1079 } 1080 if (setrlimit(RLIMIT_NOFILE, &l) == 0) { 1081 set_rlimit++; 1082 errno = old_errno; 1083 goto retry_open; 1084 } 1085 } 1086 errno = old_errno; 1087 } 1088 1089 if (err != -EINVAL || cpu > 0 || thread > 0) 1090 goto out_close; 1091 1092 if (!perf_missing_features.mmap2 && evsel->attr.mmap2) { 1093 perf_missing_features.mmap2 = true; 1094 goto fallback_missing_features; 1095 } else if (!perf_missing_features.exclude_guest && 1096 (evsel->attr.exclude_guest || evsel->attr.exclude_host)) { 1097 perf_missing_features.exclude_guest = true; 1098 goto fallback_missing_features; 1099 } else if (!perf_missing_features.sample_id_all) { 1100 perf_missing_features.sample_id_all = true; 1101 goto retry_sample_id; 1102 } 1103 1104 out_close: 1105 do { 1106 while (--thread >= 0) { 1107 close(FD(evsel, cpu, thread)); 1108 FD(evsel, cpu, thread) = -1; 1109 } 1110 thread = threads->nr; 1111 } while (--cpu >= 0); 1112 return err; 1113 } 1114 1115 void perf_evsel__close(struct perf_evsel *evsel, int ncpus, int nthreads) 1116 { 1117 if (evsel->fd == NULL) 1118 return; 1119 1120 perf_evsel__close_fd(evsel, ncpus, nthreads); 1121 perf_evsel__free_fd(evsel); 1122 evsel->fd = NULL; 1123 } 1124 1125 static struct { 1126 struct cpu_map map; 1127 int cpus[1]; 1128 } empty_cpu_map = { 1129 .map.nr = 1, 1130 .cpus = { -1, }, 1131 }; 1132 1133 static struct { 1134 struct thread_map map; 1135 int threads[1]; 1136 } empty_thread_map = { 1137 .map.nr = 1, 1138 .threads = { -1, }, 1139 }; 1140 1141 int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus, 1142 struct thread_map *threads) 1143 { 1144 if (cpus == NULL) { 1145 /* Work around old compiler warnings about strict aliasing */ 1146 cpus = &empty_cpu_map.map; 1147 } 1148 1149 if (threads == NULL) 1150 threads = &empty_thread_map.map; 1151 1152 return __perf_evsel__open(evsel, cpus, threads); 1153 } 1154 1155 int perf_evsel__open_per_cpu(struct perf_evsel *evsel, 1156 struct cpu_map *cpus) 1157 { 1158 return __perf_evsel__open(evsel, cpus, &empty_thread_map.map); 1159 } 1160 1161 int perf_evsel__open_per_thread(struct perf_evsel *evsel, 1162 struct thread_map *threads) 1163 { 1164 return __perf_evsel__open(evsel, &empty_cpu_map.map, threads); 1165 } 1166 1167 static int perf_evsel__parse_id_sample(const struct perf_evsel *evsel, 1168 const union perf_event *event, 1169 struct perf_sample *sample) 1170 { 1171 u64 type = evsel->attr.sample_type; 1172 const u64 *array = event->sample.array; 1173 bool swapped = evsel->needs_swap; 1174 union u64_swap u; 1175 1176 array += ((event->header.size - 1177 sizeof(event->header)) / sizeof(u64)) - 1; 1178 1179 if (type & PERF_SAMPLE_IDENTIFIER) { 1180 sample->id = *array; 1181 array--; 1182 } 1183 1184 if (type & PERF_SAMPLE_CPU) { 1185 u.val64 = *array; 1186 if (swapped) { 1187 /* undo swap of u64, then swap on individual u32s */ 1188 u.val64 = bswap_64(u.val64); 1189 u.val32[0] = bswap_32(u.val32[0]); 1190 } 1191 1192 sample->cpu = u.val32[0]; 1193 array--; 1194 } 1195 1196 if (type & PERF_SAMPLE_STREAM_ID) { 1197 sample->stream_id = *array; 1198 array--; 1199 } 1200 1201 if (type & PERF_SAMPLE_ID) { 1202 sample->id = *array; 1203 array--; 1204 } 1205 1206 if (type & PERF_SAMPLE_TIME) { 1207 sample->time = *array; 1208 array--; 1209 } 1210 1211 if (type & PERF_SAMPLE_TID) { 1212 u.val64 = *array; 1213 if (swapped) { 1214 /* undo swap of u64, then swap on individual u32s */ 1215 u.val64 = bswap_64(u.val64); 1216 u.val32[0] = bswap_32(u.val32[0]); 1217 u.val32[1] = bswap_32(u.val32[1]); 1218 } 1219 1220 sample->pid = u.val32[0]; 1221 sample->tid = u.val32[1]; 1222 array--; 1223 } 1224 1225 return 0; 1226 } 1227 1228 static inline bool overflow(const void *endp, u16 max_size, const void *offset, 1229 u64 size) 1230 { 1231 return size > max_size || offset + size > endp; 1232 } 1233 1234 #define OVERFLOW_CHECK(offset, size, max_size) \ 1235 do { \ 1236 if (overflow(endp, (max_size), (offset), (size))) \ 1237 return -EFAULT; \ 1238 } while (0) 1239 1240 #define OVERFLOW_CHECK_u64(offset) \ 1241 OVERFLOW_CHECK(offset, sizeof(u64), sizeof(u64)) 1242 1243 int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event, 1244 struct perf_sample *data) 1245 { 1246 u64 type = evsel->attr.sample_type; 1247 bool swapped = evsel->needs_swap; 1248 const u64 *array; 1249 u16 max_size = event->header.size; 1250 const void *endp = (void *)event + max_size; 1251 u64 sz; 1252 1253 /* 1254 * used for cross-endian analysis. See git commit 65014ab3 1255 * for why this goofiness is needed. 1256 */ 1257 union u64_swap u; 1258 1259 memset(data, 0, sizeof(*data)); 1260 data->cpu = data->pid = data->tid = -1; 1261 data->stream_id = data->id = data->time = -1ULL; 1262 data->period = 1; 1263 data->weight = 0; 1264 1265 if (event->header.type != PERF_RECORD_SAMPLE) { 1266 if (!evsel->attr.sample_id_all) 1267 return 0; 1268 return perf_evsel__parse_id_sample(evsel, event, data); 1269 } 1270 1271 array = event->sample.array; 1272 1273 /* 1274 * The evsel's sample_size is based on PERF_SAMPLE_MASK which includes 1275 * up to PERF_SAMPLE_PERIOD. After that overflow() must be used to 1276 * check the format does not go past the end of the event. 1277 */ 1278 if (evsel->sample_size + sizeof(event->header) > event->header.size) 1279 return -EFAULT; 1280 1281 data->id = -1ULL; 1282 if (type & PERF_SAMPLE_IDENTIFIER) { 1283 data->id = *array; 1284 array++; 1285 } 1286 1287 if (type & PERF_SAMPLE_IP) { 1288 data->ip = *array; 1289 array++; 1290 } 1291 1292 if (type & PERF_SAMPLE_TID) { 1293 u.val64 = *array; 1294 if (swapped) { 1295 /* undo swap of u64, then swap on individual u32s */ 1296 u.val64 = bswap_64(u.val64); 1297 u.val32[0] = bswap_32(u.val32[0]); 1298 u.val32[1] = bswap_32(u.val32[1]); 1299 } 1300 1301 data->pid = u.val32[0]; 1302 data->tid = u.val32[1]; 1303 array++; 1304 } 1305 1306 if (type & PERF_SAMPLE_TIME) { 1307 data->time = *array; 1308 array++; 1309 } 1310 1311 data->addr = 0; 1312 if (type & PERF_SAMPLE_ADDR) { 1313 data->addr = *array; 1314 array++; 1315 } 1316 1317 if (type & PERF_SAMPLE_ID) { 1318 data->id = *array; 1319 array++; 1320 } 1321 1322 if (type & PERF_SAMPLE_STREAM_ID) { 1323 data->stream_id = *array; 1324 array++; 1325 } 1326 1327 if (type & PERF_SAMPLE_CPU) { 1328 1329 u.val64 = *array; 1330 if (swapped) { 1331 /* undo swap of u64, then swap on individual u32s */ 1332 u.val64 = bswap_64(u.val64); 1333 u.val32[0] = bswap_32(u.val32[0]); 1334 } 1335 1336 data->cpu = u.val32[0]; 1337 array++; 1338 } 1339 1340 if (type & PERF_SAMPLE_PERIOD) { 1341 data->period = *array; 1342 array++; 1343 } 1344 1345 if (type & PERF_SAMPLE_READ) { 1346 u64 read_format = evsel->attr.read_format; 1347 1348 OVERFLOW_CHECK_u64(array); 1349 if (read_format & PERF_FORMAT_GROUP) 1350 data->read.group.nr = *array; 1351 else 1352 data->read.one.value = *array; 1353 1354 array++; 1355 1356 if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED) { 1357 OVERFLOW_CHECK_u64(array); 1358 data->read.time_enabled = *array; 1359 array++; 1360 } 1361 1362 if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING) { 1363 OVERFLOW_CHECK_u64(array); 1364 data->read.time_running = *array; 1365 array++; 1366 } 1367 1368 /* PERF_FORMAT_ID is forced for PERF_SAMPLE_READ */ 1369 if (read_format & PERF_FORMAT_GROUP) { 1370 const u64 max_group_nr = UINT64_MAX / 1371 sizeof(struct sample_read_value); 1372 1373 if (data->read.group.nr > max_group_nr) 1374 return -EFAULT; 1375 sz = data->read.group.nr * 1376 sizeof(struct sample_read_value); 1377 OVERFLOW_CHECK(array, sz, max_size); 1378 data->read.group.values = 1379 (struct sample_read_value *)array; 1380 array = (void *)array + sz; 1381 } else { 1382 OVERFLOW_CHECK_u64(array); 1383 data->read.one.id = *array; 1384 array++; 1385 } 1386 } 1387 1388 if (type & PERF_SAMPLE_CALLCHAIN) { 1389 const u64 max_callchain_nr = UINT64_MAX / sizeof(u64); 1390 1391 OVERFLOW_CHECK_u64(array); 1392 data->callchain = (struct ip_callchain *)array++; 1393 if (data->callchain->nr > max_callchain_nr) 1394 return -EFAULT; 1395 sz = data->callchain->nr * sizeof(u64); 1396 OVERFLOW_CHECK(array, sz, max_size); 1397 array = (void *)array + sz; 1398 } 1399 1400 if (type & PERF_SAMPLE_RAW) { 1401 OVERFLOW_CHECK_u64(array); 1402 u.val64 = *array; 1403 if (WARN_ONCE(swapped, 1404 "Endianness of raw data not corrected!\n")) { 1405 /* undo swap of u64, then swap on individual u32s */ 1406 u.val64 = bswap_64(u.val64); 1407 u.val32[0] = bswap_32(u.val32[0]); 1408 u.val32[1] = bswap_32(u.val32[1]); 1409 } 1410 data->raw_size = u.val32[0]; 1411 array = (void *)array + sizeof(u32); 1412 1413 OVERFLOW_CHECK(array, data->raw_size, max_size); 1414 data->raw_data = (void *)array; 1415 array = (void *)array + data->raw_size; 1416 } 1417 1418 if (type & PERF_SAMPLE_BRANCH_STACK) { 1419 const u64 max_branch_nr = UINT64_MAX / 1420 sizeof(struct branch_entry); 1421 1422 OVERFLOW_CHECK_u64(array); 1423 data->branch_stack = (struct branch_stack *)array++; 1424 1425 if (data->branch_stack->nr > max_branch_nr) 1426 return -EFAULT; 1427 sz = data->branch_stack->nr * sizeof(struct branch_entry); 1428 OVERFLOW_CHECK(array, sz, max_size); 1429 array = (void *)array + sz; 1430 } 1431 1432 if (type & PERF_SAMPLE_REGS_USER) { 1433 OVERFLOW_CHECK_u64(array); 1434 data->user_regs.abi = *array; 1435 array++; 1436 1437 if (data->user_regs.abi) { 1438 u64 regs_user = evsel->attr.sample_regs_user; 1439 1440 sz = hweight_long(regs_user) * sizeof(u64); 1441 OVERFLOW_CHECK(array, sz, max_size); 1442 data->user_regs.regs = (u64 *)array; 1443 array = (void *)array + sz; 1444 } 1445 } 1446 1447 if (type & PERF_SAMPLE_STACK_USER) { 1448 OVERFLOW_CHECK_u64(array); 1449 sz = *array++; 1450 1451 data->user_stack.offset = ((char *)(array - 1) 1452 - (char *) event); 1453 1454 if (!sz) { 1455 data->user_stack.size = 0; 1456 } else { 1457 OVERFLOW_CHECK(array, sz, max_size); 1458 data->user_stack.data = (char *)array; 1459 array = (void *)array + sz; 1460 OVERFLOW_CHECK_u64(array); 1461 data->user_stack.size = *array++; 1462 if (WARN_ONCE(data->user_stack.size > sz, 1463 "user stack dump failure\n")) 1464 return -EFAULT; 1465 } 1466 } 1467 1468 data->weight = 0; 1469 if (type & PERF_SAMPLE_WEIGHT) { 1470 OVERFLOW_CHECK_u64(array); 1471 data->weight = *array; 1472 array++; 1473 } 1474 1475 data->data_src = PERF_MEM_DATA_SRC_NONE; 1476 if (type & PERF_SAMPLE_DATA_SRC) { 1477 OVERFLOW_CHECK_u64(array); 1478 data->data_src = *array; 1479 array++; 1480 } 1481 1482 data->transaction = 0; 1483 if (type & PERF_SAMPLE_TRANSACTION) { 1484 OVERFLOW_CHECK_u64(array); 1485 data->transaction = *array; 1486 array++; 1487 } 1488 1489 return 0; 1490 } 1491 1492 size_t perf_event__sample_event_size(const struct perf_sample *sample, u64 type, 1493 u64 sample_regs_user, u64 read_format) 1494 { 1495 size_t sz, result = sizeof(struct sample_event); 1496 1497 if (type & PERF_SAMPLE_IDENTIFIER) 1498 result += sizeof(u64); 1499 1500 if (type & PERF_SAMPLE_IP) 1501 result += sizeof(u64); 1502 1503 if (type & PERF_SAMPLE_TID) 1504 result += sizeof(u64); 1505 1506 if (type & PERF_SAMPLE_TIME) 1507 result += sizeof(u64); 1508 1509 if (type & PERF_SAMPLE_ADDR) 1510 result += sizeof(u64); 1511 1512 if (type & PERF_SAMPLE_ID) 1513 result += sizeof(u64); 1514 1515 if (type & PERF_SAMPLE_STREAM_ID) 1516 result += sizeof(u64); 1517 1518 if (type & PERF_SAMPLE_CPU) 1519 result += sizeof(u64); 1520 1521 if (type & PERF_SAMPLE_PERIOD) 1522 result += sizeof(u64); 1523 1524 if (type & PERF_SAMPLE_READ) { 1525 result += sizeof(u64); 1526 if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED) 1527 result += sizeof(u64); 1528 if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING) 1529 result += sizeof(u64); 1530 /* PERF_FORMAT_ID is forced for PERF_SAMPLE_READ */ 1531 if (read_format & PERF_FORMAT_GROUP) { 1532 sz = sample->read.group.nr * 1533 sizeof(struct sample_read_value); 1534 result += sz; 1535 } else { 1536 result += sizeof(u64); 1537 } 1538 } 1539 1540 if (type & PERF_SAMPLE_CALLCHAIN) { 1541 sz = (sample->callchain->nr + 1) * sizeof(u64); 1542 result += sz; 1543 } 1544 1545 if (type & PERF_SAMPLE_RAW) { 1546 result += sizeof(u32); 1547 result += sample->raw_size; 1548 } 1549 1550 if (type & PERF_SAMPLE_BRANCH_STACK) { 1551 sz = sample->branch_stack->nr * sizeof(struct branch_entry); 1552 sz += sizeof(u64); 1553 result += sz; 1554 } 1555 1556 if (type & PERF_SAMPLE_REGS_USER) { 1557 if (sample->user_regs.abi) { 1558 result += sizeof(u64); 1559 sz = hweight_long(sample_regs_user) * sizeof(u64); 1560 result += sz; 1561 } else { 1562 result += sizeof(u64); 1563 } 1564 } 1565 1566 if (type & PERF_SAMPLE_STACK_USER) { 1567 sz = sample->user_stack.size; 1568 result += sizeof(u64); 1569 if (sz) { 1570 result += sz; 1571 result += sizeof(u64); 1572 } 1573 } 1574 1575 if (type & PERF_SAMPLE_WEIGHT) 1576 result += sizeof(u64); 1577 1578 if (type & PERF_SAMPLE_DATA_SRC) 1579 result += sizeof(u64); 1580 1581 if (type & PERF_SAMPLE_TRANSACTION) 1582 result += sizeof(u64); 1583 1584 return result; 1585 } 1586 1587 int perf_event__synthesize_sample(union perf_event *event, u64 type, 1588 u64 sample_regs_user, u64 read_format, 1589 const struct perf_sample *sample, 1590 bool swapped) 1591 { 1592 u64 *array; 1593 size_t sz; 1594 /* 1595 * used for cross-endian analysis. See git commit 65014ab3 1596 * for why this goofiness is needed. 1597 */ 1598 union u64_swap u; 1599 1600 array = event->sample.array; 1601 1602 if (type & PERF_SAMPLE_IDENTIFIER) { 1603 *array = sample->id; 1604 array++; 1605 } 1606 1607 if (type & PERF_SAMPLE_IP) { 1608 *array = sample->ip; 1609 array++; 1610 } 1611 1612 if (type & PERF_SAMPLE_TID) { 1613 u.val32[0] = sample->pid; 1614 u.val32[1] = sample->tid; 1615 if (swapped) { 1616 /* 1617 * Inverse of what is done in perf_evsel__parse_sample 1618 */ 1619 u.val32[0] = bswap_32(u.val32[0]); 1620 u.val32[1] = bswap_32(u.val32[1]); 1621 u.val64 = bswap_64(u.val64); 1622 } 1623 1624 *array = u.val64; 1625 array++; 1626 } 1627 1628 if (type & PERF_SAMPLE_TIME) { 1629 *array = sample->time; 1630 array++; 1631 } 1632 1633 if (type & PERF_SAMPLE_ADDR) { 1634 *array = sample->addr; 1635 array++; 1636 } 1637 1638 if (type & PERF_SAMPLE_ID) { 1639 *array = sample->id; 1640 array++; 1641 } 1642 1643 if (type & PERF_SAMPLE_STREAM_ID) { 1644 *array = sample->stream_id; 1645 array++; 1646 } 1647 1648 if (type & PERF_SAMPLE_CPU) { 1649 u.val32[0] = sample->cpu; 1650 if (swapped) { 1651 /* 1652 * Inverse of what is done in perf_evsel__parse_sample 1653 */ 1654 u.val32[0] = bswap_32(u.val32[0]); 1655 u.val64 = bswap_64(u.val64); 1656 } 1657 *array = u.val64; 1658 array++; 1659 } 1660 1661 if (type & PERF_SAMPLE_PERIOD) { 1662 *array = sample->period; 1663 array++; 1664 } 1665 1666 if (type & PERF_SAMPLE_READ) { 1667 if (read_format & PERF_FORMAT_GROUP) 1668 *array = sample->read.group.nr; 1669 else 1670 *array = sample->read.one.value; 1671 array++; 1672 1673 if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED) { 1674 *array = sample->read.time_enabled; 1675 array++; 1676 } 1677 1678 if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING) { 1679 *array = sample->read.time_running; 1680 array++; 1681 } 1682 1683 /* PERF_FORMAT_ID is forced for PERF_SAMPLE_READ */ 1684 if (read_format & PERF_FORMAT_GROUP) { 1685 sz = sample->read.group.nr * 1686 sizeof(struct sample_read_value); 1687 memcpy(array, sample->read.group.values, sz); 1688 array = (void *)array + sz; 1689 } else { 1690 *array = sample->read.one.id; 1691 array++; 1692 } 1693 } 1694 1695 if (type & PERF_SAMPLE_CALLCHAIN) { 1696 sz = (sample->callchain->nr + 1) * sizeof(u64); 1697 memcpy(array, sample->callchain, sz); 1698 array = (void *)array + sz; 1699 } 1700 1701 if (type & PERF_SAMPLE_RAW) { 1702 u.val32[0] = sample->raw_size; 1703 if (WARN_ONCE(swapped, 1704 "Endianness of raw data not corrected!\n")) { 1705 /* 1706 * Inverse of what is done in perf_evsel__parse_sample 1707 */ 1708 u.val32[0] = bswap_32(u.val32[0]); 1709 u.val32[1] = bswap_32(u.val32[1]); 1710 u.val64 = bswap_64(u.val64); 1711 } 1712 *array = u.val64; 1713 array = (void *)array + sizeof(u32); 1714 1715 memcpy(array, sample->raw_data, sample->raw_size); 1716 array = (void *)array + sample->raw_size; 1717 } 1718 1719 if (type & PERF_SAMPLE_BRANCH_STACK) { 1720 sz = sample->branch_stack->nr * sizeof(struct branch_entry); 1721 sz += sizeof(u64); 1722 memcpy(array, sample->branch_stack, sz); 1723 array = (void *)array + sz; 1724 } 1725 1726 if (type & PERF_SAMPLE_REGS_USER) { 1727 if (sample->user_regs.abi) { 1728 *array++ = sample->user_regs.abi; 1729 sz = hweight_long(sample_regs_user) * sizeof(u64); 1730 memcpy(array, sample->user_regs.regs, sz); 1731 array = (void *)array + sz; 1732 } else { 1733 *array++ = 0; 1734 } 1735 } 1736 1737 if (type & PERF_SAMPLE_STACK_USER) { 1738 sz = sample->user_stack.size; 1739 *array++ = sz; 1740 if (sz) { 1741 memcpy(array, sample->user_stack.data, sz); 1742 array = (void *)array + sz; 1743 *array++ = sz; 1744 } 1745 } 1746 1747 if (type & PERF_SAMPLE_WEIGHT) { 1748 *array = sample->weight; 1749 array++; 1750 } 1751 1752 if (type & PERF_SAMPLE_DATA_SRC) { 1753 *array = sample->data_src; 1754 array++; 1755 } 1756 1757 if (type & PERF_SAMPLE_TRANSACTION) { 1758 *array = sample->transaction; 1759 array++; 1760 } 1761 1762 return 0; 1763 } 1764 1765 struct format_field *perf_evsel__field(struct perf_evsel *evsel, const char *name) 1766 { 1767 return pevent_find_field(evsel->tp_format, name); 1768 } 1769 1770 void *perf_evsel__rawptr(struct perf_evsel *evsel, struct perf_sample *sample, 1771 const char *name) 1772 { 1773 struct format_field *field = perf_evsel__field(evsel, name); 1774 int offset; 1775 1776 if (!field) 1777 return NULL; 1778 1779 offset = field->offset; 1780 1781 if (field->flags & FIELD_IS_DYNAMIC) { 1782 offset = *(int *)(sample->raw_data + field->offset); 1783 offset &= 0xffff; 1784 } 1785 1786 return sample->raw_data + offset; 1787 } 1788 1789 u64 perf_evsel__intval(struct perf_evsel *evsel, struct perf_sample *sample, 1790 const char *name) 1791 { 1792 struct format_field *field = perf_evsel__field(evsel, name); 1793 void *ptr; 1794 u64 value; 1795 1796 if (!field) 1797 return 0; 1798 1799 ptr = sample->raw_data + field->offset; 1800 1801 switch (field->size) { 1802 case 1: 1803 return *(u8 *)ptr; 1804 case 2: 1805 value = *(u16 *)ptr; 1806 break; 1807 case 4: 1808 value = *(u32 *)ptr; 1809 break; 1810 case 8: 1811 value = *(u64 *)ptr; 1812 break; 1813 default: 1814 return 0; 1815 } 1816 1817 if (!evsel->needs_swap) 1818 return value; 1819 1820 switch (field->size) { 1821 case 2: 1822 return bswap_16(value); 1823 case 4: 1824 return bswap_32(value); 1825 case 8: 1826 return bswap_64(value); 1827 default: 1828 return 0; 1829 } 1830 1831 return 0; 1832 } 1833 1834 static int comma_fprintf(FILE *fp, bool *first, const char *fmt, ...) 1835 { 1836 va_list args; 1837 int ret = 0; 1838 1839 if (!*first) { 1840 ret += fprintf(fp, ","); 1841 } else { 1842 ret += fprintf(fp, ":"); 1843 *first = false; 1844 } 1845 1846 va_start(args, fmt); 1847 ret += vfprintf(fp, fmt, args); 1848 va_end(args); 1849 return ret; 1850 } 1851 1852 static int __if_fprintf(FILE *fp, bool *first, const char *field, u64 value) 1853 { 1854 if (value == 0) 1855 return 0; 1856 1857 return comma_fprintf(fp, first, " %s: %" PRIu64, field, value); 1858 } 1859 1860 #define if_print(field) printed += __if_fprintf(fp, &first, #field, evsel->attr.field) 1861 1862 struct bit_names { 1863 int bit; 1864 const char *name; 1865 }; 1866 1867 static int bits__fprintf(FILE *fp, const char *field, u64 value, 1868 struct bit_names *bits, bool *first) 1869 { 1870 int i = 0, printed = comma_fprintf(fp, first, " %s: ", field); 1871 bool first_bit = true; 1872 1873 do { 1874 if (value & bits[i].bit) { 1875 printed += fprintf(fp, "%s%s", first_bit ? "" : "|", bits[i].name); 1876 first_bit = false; 1877 } 1878 } while (bits[++i].name != NULL); 1879 1880 return printed; 1881 } 1882 1883 static int sample_type__fprintf(FILE *fp, bool *first, u64 value) 1884 { 1885 #define bit_name(n) { PERF_SAMPLE_##n, #n } 1886 struct bit_names bits[] = { 1887 bit_name(IP), bit_name(TID), bit_name(TIME), bit_name(ADDR), 1888 bit_name(READ), bit_name(CALLCHAIN), bit_name(ID), bit_name(CPU), 1889 bit_name(PERIOD), bit_name(STREAM_ID), bit_name(RAW), 1890 bit_name(BRANCH_STACK), bit_name(REGS_USER), bit_name(STACK_USER), 1891 bit_name(IDENTIFIER), 1892 { .name = NULL, } 1893 }; 1894 #undef bit_name 1895 return bits__fprintf(fp, "sample_type", value, bits, first); 1896 } 1897 1898 static int read_format__fprintf(FILE *fp, bool *first, u64 value) 1899 { 1900 #define bit_name(n) { PERF_FORMAT_##n, #n } 1901 struct bit_names bits[] = { 1902 bit_name(TOTAL_TIME_ENABLED), bit_name(TOTAL_TIME_RUNNING), 1903 bit_name(ID), bit_name(GROUP), 1904 { .name = NULL, } 1905 }; 1906 #undef bit_name 1907 return bits__fprintf(fp, "read_format", value, bits, first); 1908 } 1909 1910 int perf_evsel__fprintf(struct perf_evsel *evsel, 1911 struct perf_attr_details *details, FILE *fp) 1912 { 1913 bool first = true; 1914 int printed = 0; 1915 1916 if (details->event_group) { 1917 struct perf_evsel *pos; 1918 1919 if (!perf_evsel__is_group_leader(evsel)) 1920 return 0; 1921 1922 if (evsel->nr_members > 1) 1923 printed += fprintf(fp, "%s{", evsel->group_name ?: ""); 1924 1925 printed += fprintf(fp, "%s", perf_evsel__name(evsel)); 1926 for_each_group_member(pos, evsel) 1927 printed += fprintf(fp, ",%s", perf_evsel__name(pos)); 1928 1929 if (evsel->nr_members > 1) 1930 printed += fprintf(fp, "}"); 1931 goto out; 1932 } 1933 1934 printed += fprintf(fp, "%s", perf_evsel__name(evsel)); 1935 1936 if (details->verbose || details->freq) { 1937 printed += comma_fprintf(fp, &first, " sample_freq=%" PRIu64, 1938 (u64)evsel->attr.sample_freq); 1939 } 1940 1941 if (details->verbose) { 1942 if_print(type); 1943 if_print(config); 1944 if_print(config1); 1945 if_print(config2); 1946 if_print(size); 1947 printed += sample_type__fprintf(fp, &first, evsel->attr.sample_type); 1948 if (evsel->attr.read_format) 1949 printed += read_format__fprintf(fp, &first, evsel->attr.read_format); 1950 if_print(disabled); 1951 if_print(inherit); 1952 if_print(pinned); 1953 if_print(exclusive); 1954 if_print(exclude_user); 1955 if_print(exclude_kernel); 1956 if_print(exclude_hv); 1957 if_print(exclude_idle); 1958 if_print(mmap); 1959 if_print(mmap2); 1960 if_print(comm); 1961 if_print(freq); 1962 if_print(inherit_stat); 1963 if_print(enable_on_exec); 1964 if_print(task); 1965 if_print(watermark); 1966 if_print(precise_ip); 1967 if_print(mmap_data); 1968 if_print(sample_id_all); 1969 if_print(exclude_host); 1970 if_print(exclude_guest); 1971 if_print(__reserved_1); 1972 if_print(wakeup_events); 1973 if_print(bp_type); 1974 if_print(branch_sample_type); 1975 } 1976 out: 1977 fputc('\n', fp); 1978 return ++printed; 1979 } 1980 1981 bool perf_evsel__fallback(struct perf_evsel *evsel, int err, 1982 char *msg, size_t msgsize) 1983 { 1984 if ((err == ENOENT || err == ENXIO || err == ENODEV) && 1985 evsel->attr.type == PERF_TYPE_HARDWARE && 1986 evsel->attr.config == PERF_COUNT_HW_CPU_CYCLES) { 1987 /* 1988 * If it's cycles then fall back to hrtimer based 1989 * cpu-clock-tick sw counter, which is always available even if 1990 * no PMU support. 1991 * 1992 * PPC returns ENXIO until 2.6.37 (behavior changed with commit 1993 * b0a873e). 1994 */ 1995 scnprintf(msg, msgsize, "%s", 1996 "The cycles event is not supported, trying to fall back to cpu-clock-ticks"); 1997 1998 evsel->attr.type = PERF_TYPE_SOFTWARE; 1999 evsel->attr.config = PERF_COUNT_SW_CPU_CLOCK; 2000 2001 free(evsel->name); 2002 evsel->name = NULL; 2003 return true; 2004 } 2005 2006 return false; 2007 } 2008 2009 int perf_evsel__open_strerror(struct perf_evsel *evsel, struct target *target, 2010 int err, char *msg, size_t size) 2011 { 2012 switch (err) { 2013 case EPERM: 2014 case EACCES: 2015 return scnprintf(msg, size, 2016 "You may not have permission to collect %sstats.\n" 2017 "Consider tweaking /proc/sys/kernel/perf_event_paranoid:\n" 2018 " -1 - Not paranoid at all\n" 2019 " 0 - Disallow raw tracepoint access for unpriv\n" 2020 " 1 - Disallow cpu events for unpriv\n" 2021 " 2 - Disallow kernel profiling for unpriv", 2022 target->system_wide ? "system-wide " : ""); 2023 case ENOENT: 2024 return scnprintf(msg, size, "The %s event is not supported.", 2025 perf_evsel__name(evsel)); 2026 case EMFILE: 2027 return scnprintf(msg, size, "%s", 2028 "Too many events are opened.\n" 2029 "Try again after reducing the number of events."); 2030 case ENODEV: 2031 if (target->cpu_list) 2032 return scnprintf(msg, size, "%s", 2033 "No such device - did you specify an out-of-range profile CPU?\n"); 2034 break; 2035 case EOPNOTSUPP: 2036 if (evsel->attr.precise_ip) 2037 return scnprintf(msg, size, "%s", 2038 "\'precise\' request may not be supported. Try removing 'p' modifier."); 2039 #if defined(__i386__) || defined(__x86_64__) 2040 if (evsel->attr.type == PERF_TYPE_HARDWARE) 2041 return scnprintf(msg, size, "%s", 2042 "No hardware sampling interrupt available.\n" 2043 "No APIC? If so then you can boot the kernel with the \"lapic\" boot parameter to force-enable it."); 2044 #endif 2045 break; 2046 default: 2047 break; 2048 } 2049 2050 return scnprintf(msg, size, 2051 "The sys_perf_event_open() syscall returned with %d (%s) for event (%s). \n" 2052 "/bin/dmesg may provide additional information.\n" 2053 "No CONFIG_PERF_EVENTS=y kernel support configured?\n", 2054 err, strerror(err), perf_evsel__name(evsel)); 2055 } 2056