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 "asm/bug.h" 13 #include <lk/debugfs.h> 14 #include "event-parse.h" 15 #include "evsel.h" 16 #include "evlist.h" 17 #include "util.h" 18 #include "cpumap.h" 19 #include "thread_map.h" 20 #include "target.h" 21 #include <linux/hw_breakpoint.h> 22 #include <linux/perf_event.h> 23 #include "perf_regs.h" 24 25 static struct { 26 bool sample_id_all; 27 bool exclude_guest; 28 } perf_missing_features; 29 30 #define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y)) 31 32 static int __perf_evsel__sample_size(u64 sample_type) 33 { 34 u64 mask = sample_type & PERF_SAMPLE_MASK; 35 int size = 0; 36 int i; 37 38 for (i = 0; i < 64; i++) { 39 if (mask & (1ULL << i)) 40 size++; 41 } 42 43 size *= sizeof(u64); 44 45 return size; 46 } 47 48 void hists__init(struct hists *hists) 49 { 50 memset(hists, 0, sizeof(*hists)); 51 hists->entries_in_array[0] = hists->entries_in_array[1] = RB_ROOT; 52 hists->entries_in = &hists->entries_in_array[0]; 53 hists->entries_collapsed = RB_ROOT; 54 hists->entries = RB_ROOT; 55 pthread_mutex_init(&hists->lock, NULL); 56 } 57 58 void __perf_evsel__set_sample_bit(struct perf_evsel *evsel, 59 enum perf_event_sample_format bit) 60 { 61 if (!(evsel->attr.sample_type & bit)) { 62 evsel->attr.sample_type |= bit; 63 evsel->sample_size += sizeof(u64); 64 } 65 } 66 67 void __perf_evsel__reset_sample_bit(struct perf_evsel *evsel, 68 enum perf_event_sample_format bit) 69 { 70 if (evsel->attr.sample_type & bit) { 71 evsel->attr.sample_type &= ~bit; 72 evsel->sample_size -= sizeof(u64); 73 } 74 } 75 76 void perf_evsel__set_sample_id(struct perf_evsel *evsel) 77 { 78 perf_evsel__set_sample_bit(evsel, ID); 79 evsel->attr.read_format |= PERF_FORMAT_ID; 80 } 81 82 void perf_evsel__init(struct perf_evsel *evsel, 83 struct perf_event_attr *attr, int idx) 84 { 85 evsel->idx = idx; 86 evsel->attr = *attr; 87 evsel->leader = evsel; 88 INIT_LIST_HEAD(&evsel->node); 89 hists__init(&evsel->hists); 90 evsel->sample_size = __perf_evsel__sample_size(attr->sample_type); 91 } 92 93 struct perf_evsel *perf_evsel__new(struct perf_event_attr *attr, int idx) 94 { 95 struct perf_evsel *evsel = zalloc(sizeof(*evsel)); 96 97 if (evsel != NULL) 98 perf_evsel__init(evsel, attr, idx); 99 100 return evsel; 101 } 102 103 struct event_format *event_format__new(const char *sys, const char *name) 104 { 105 int fd, n; 106 char *filename; 107 void *bf = NULL, *nbf; 108 size_t size = 0, alloc_size = 0; 109 struct event_format *format = NULL; 110 111 if (asprintf(&filename, "%s/%s/%s/format", tracing_events_path, sys, name) < 0) 112 goto out; 113 114 fd = open(filename, O_RDONLY); 115 if (fd < 0) 116 goto out_free_filename; 117 118 do { 119 if (size == alloc_size) { 120 alloc_size += BUFSIZ; 121 nbf = realloc(bf, alloc_size); 122 if (nbf == NULL) 123 goto out_free_bf; 124 bf = nbf; 125 } 126 127 n = read(fd, bf + size, alloc_size - size); 128 if (n < 0) 129 goto out_free_bf; 130 size += n; 131 } while (n > 0); 132 133 pevent_parse_format(&format, bf, size, sys); 134 135 out_free_bf: 136 free(bf); 137 close(fd); 138 out_free_filename: 139 free(filename); 140 out: 141 return format; 142 } 143 144 struct perf_evsel *perf_evsel__newtp(const char *sys, const char *name, int idx) 145 { 146 struct perf_evsel *evsel = zalloc(sizeof(*evsel)); 147 148 if (evsel != NULL) { 149 struct perf_event_attr attr = { 150 .type = PERF_TYPE_TRACEPOINT, 151 .sample_type = (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | 152 PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD), 153 }; 154 155 if (asprintf(&evsel->name, "%s:%s", sys, name) < 0) 156 goto out_free; 157 158 evsel->tp_format = event_format__new(sys, name); 159 if (evsel->tp_format == NULL) 160 goto out_free; 161 162 event_attr_init(&attr); 163 attr.config = evsel->tp_format->id; 164 attr.sample_period = 1; 165 perf_evsel__init(evsel, &attr, idx); 166 } 167 168 return evsel; 169 170 out_free: 171 free(evsel->name); 172 free(evsel); 173 return NULL; 174 } 175 176 const char *perf_evsel__hw_names[PERF_COUNT_HW_MAX] = { 177 "cycles", 178 "instructions", 179 "cache-references", 180 "cache-misses", 181 "branches", 182 "branch-misses", 183 "bus-cycles", 184 "stalled-cycles-frontend", 185 "stalled-cycles-backend", 186 "ref-cycles", 187 }; 188 189 static const char *__perf_evsel__hw_name(u64 config) 190 { 191 if (config < PERF_COUNT_HW_MAX && perf_evsel__hw_names[config]) 192 return perf_evsel__hw_names[config]; 193 194 return "unknown-hardware"; 195 } 196 197 static int perf_evsel__add_modifiers(struct perf_evsel *evsel, char *bf, size_t size) 198 { 199 int colon = 0, r = 0; 200 struct perf_event_attr *attr = &evsel->attr; 201 bool exclude_guest_default = false; 202 203 #define MOD_PRINT(context, mod) do { \ 204 if (!attr->exclude_##context) { \ 205 if (!colon) colon = ++r; \ 206 r += scnprintf(bf + r, size - r, "%c", mod); \ 207 } } while(0) 208 209 if (attr->exclude_kernel || attr->exclude_user || attr->exclude_hv) { 210 MOD_PRINT(kernel, 'k'); 211 MOD_PRINT(user, 'u'); 212 MOD_PRINT(hv, 'h'); 213 exclude_guest_default = true; 214 } 215 216 if (attr->precise_ip) { 217 if (!colon) 218 colon = ++r; 219 r += scnprintf(bf + r, size - r, "%.*s", attr->precise_ip, "ppp"); 220 exclude_guest_default = true; 221 } 222 223 if (attr->exclude_host || attr->exclude_guest == exclude_guest_default) { 224 MOD_PRINT(host, 'H'); 225 MOD_PRINT(guest, 'G'); 226 } 227 #undef MOD_PRINT 228 if (colon) 229 bf[colon - 1] = ':'; 230 return r; 231 } 232 233 static int perf_evsel__hw_name(struct perf_evsel *evsel, char *bf, size_t size) 234 { 235 int r = scnprintf(bf, size, "%s", __perf_evsel__hw_name(evsel->attr.config)); 236 return r + perf_evsel__add_modifiers(evsel, bf + r, size - r); 237 } 238 239 const char *perf_evsel__sw_names[PERF_COUNT_SW_MAX] = { 240 "cpu-clock", 241 "task-clock", 242 "page-faults", 243 "context-switches", 244 "cpu-migrations", 245 "minor-faults", 246 "major-faults", 247 "alignment-faults", 248 "emulation-faults", 249 }; 250 251 static const char *__perf_evsel__sw_name(u64 config) 252 { 253 if (config < PERF_COUNT_SW_MAX && perf_evsel__sw_names[config]) 254 return perf_evsel__sw_names[config]; 255 return "unknown-software"; 256 } 257 258 static int perf_evsel__sw_name(struct perf_evsel *evsel, char *bf, size_t size) 259 { 260 int r = scnprintf(bf, size, "%s", __perf_evsel__sw_name(evsel->attr.config)); 261 return r + perf_evsel__add_modifiers(evsel, bf + r, size - r); 262 } 263 264 static int __perf_evsel__bp_name(char *bf, size_t size, u64 addr, u64 type) 265 { 266 int r; 267 268 r = scnprintf(bf, size, "mem:0x%" PRIx64 ":", addr); 269 270 if (type & HW_BREAKPOINT_R) 271 r += scnprintf(bf + r, size - r, "r"); 272 273 if (type & HW_BREAKPOINT_W) 274 r += scnprintf(bf + r, size - r, "w"); 275 276 if (type & HW_BREAKPOINT_X) 277 r += scnprintf(bf + r, size - r, "x"); 278 279 return r; 280 } 281 282 static int perf_evsel__bp_name(struct perf_evsel *evsel, char *bf, size_t size) 283 { 284 struct perf_event_attr *attr = &evsel->attr; 285 int r = __perf_evsel__bp_name(bf, size, attr->bp_addr, attr->bp_type); 286 return r + perf_evsel__add_modifiers(evsel, bf + r, size - r); 287 } 288 289 const char *perf_evsel__hw_cache[PERF_COUNT_HW_CACHE_MAX] 290 [PERF_EVSEL__MAX_ALIASES] = { 291 { "L1-dcache", "l1-d", "l1d", "L1-data", }, 292 { "L1-icache", "l1-i", "l1i", "L1-instruction", }, 293 { "LLC", "L2", }, 294 { "dTLB", "d-tlb", "Data-TLB", }, 295 { "iTLB", "i-tlb", "Instruction-TLB", }, 296 { "branch", "branches", "bpu", "btb", "bpc", }, 297 { "node", }, 298 }; 299 300 const char *perf_evsel__hw_cache_op[PERF_COUNT_HW_CACHE_OP_MAX] 301 [PERF_EVSEL__MAX_ALIASES] = { 302 { "load", "loads", "read", }, 303 { "store", "stores", "write", }, 304 { "prefetch", "prefetches", "speculative-read", "speculative-load", }, 305 }; 306 307 const char *perf_evsel__hw_cache_result[PERF_COUNT_HW_CACHE_RESULT_MAX] 308 [PERF_EVSEL__MAX_ALIASES] = { 309 { "refs", "Reference", "ops", "access", }, 310 { "misses", "miss", }, 311 }; 312 313 #define C(x) PERF_COUNT_HW_CACHE_##x 314 #define CACHE_READ (1 << C(OP_READ)) 315 #define CACHE_WRITE (1 << C(OP_WRITE)) 316 #define CACHE_PREFETCH (1 << C(OP_PREFETCH)) 317 #define COP(x) (1 << x) 318 319 /* 320 * cache operartion stat 321 * L1I : Read and prefetch only 322 * ITLB and BPU : Read-only 323 */ 324 static unsigned long perf_evsel__hw_cache_stat[C(MAX)] = { 325 [C(L1D)] = (CACHE_READ | CACHE_WRITE | CACHE_PREFETCH), 326 [C(L1I)] = (CACHE_READ | CACHE_PREFETCH), 327 [C(LL)] = (CACHE_READ | CACHE_WRITE | CACHE_PREFETCH), 328 [C(DTLB)] = (CACHE_READ | CACHE_WRITE | CACHE_PREFETCH), 329 [C(ITLB)] = (CACHE_READ), 330 [C(BPU)] = (CACHE_READ), 331 [C(NODE)] = (CACHE_READ | CACHE_WRITE | CACHE_PREFETCH), 332 }; 333 334 bool perf_evsel__is_cache_op_valid(u8 type, u8 op) 335 { 336 if (perf_evsel__hw_cache_stat[type] & COP(op)) 337 return true; /* valid */ 338 else 339 return false; /* invalid */ 340 } 341 342 int __perf_evsel__hw_cache_type_op_res_name(u8 type, u8 op, u8 result, 343 char *bf, size_t size) 344 { 345 if (result) { 346 return scnprintf(bf, size, "%s-%s-%s", perf_evsel__hw_cache[type][0], 347 perf_evsel__hw_cache_op[op][0], 348 perf_evsel__hw_cache_result[result][0]); 349 } 350 351 return scnprintf(bf, size, "%s-%s", perf_evsel__hw_cache[type][0], 352 perf_evsel__hw_cache_op[op][1]); 353 } 354 355 static int __perf_evsel__hw_cache_name(u64 config, char *bf, size_t size) 356 { 357 u8 op, result, type = (config >> 0) & 0xff; 358 const char *err = "unknown-ext-hardware-cache-type"; 359 360 if (type > PERF_COUNT_HW_CACHE_MAX) 361 goto out_err; 362 363 op = (config >> 8) & 0xff; 364 err = "unknown-ext-hardware-cache-op"; 365 if (op > PERF_COUNT_HW_CACHE_OP_MAX) 366 goto out_err; 367 368 result = (config >> 16) & 0xff; 369 err = "unknown-ext-hardware-cache-result"; 370 if (result > PERF_COUNT_HW_CACHE_RESULT_MAX) 371 goto out_err; 372 373 err = "invalid-cache"; 374 if (!perf_evsel__is_cache_op_valid(type, op)) 375 goto out_err; 376 377 return __perf_evsel__hw_cache_type_op_res_name(type, op, result, bf, size); 378 out_err: 379 return scnprintf(bf, size, "%s", err); 380 } 381 382 static int perf_evsel__hw_cache_name(struct perf_evsel *evsel, char *bf, size_t size) 383 { 384 int ret = __perf_evsel__hw_cache_name(evsel->attr.config, bf, size); 385 return ret + perf_evsel__add_modifiers(evsel, bf + ret, size - ret); 386 } 387 388 static int perf_evsel__raw_name(struct perf_evsel *evsel, char *bf, size_t size) 389 { 390 int ret = scnprintf(bf, size, "raw 0x%" PRIx64, evsel->attr.config); 391 return ret + perf_evsel__add_modifiers(evsel, bf + ret, size - ret); 392 } 393 394 const char *perf_evsel__name(struct perf_evsel *evsel) 395 { 396 char bf[128]; 397 398 if (evsel->name) 399 return evsel->name; 400 401 switch (evsel->attr.type) { 402 case PERF_TYPE_RAW: 403 perf_evsel__raw_name(evsel, bf, sizeof(bf)); 404 break; 405 406 case PERF_TYPE_HARDWARE: 407 perf_evsel__hw_name(evsel, bf, sizeof(bf)); 408 break; 409 410 case PERF_TYPE_HW_CACHE: 411 perf_evsel__hw_cache_name(evsel, bf, sizeof(bf)); 412 break; 413 414 case PERF_TYPE_SOFTWARE: 415 perf_evsel__sw_name(evsel, bf, sizeof(bf)); 416 break; 417 418 case PERF_TYPE_TRACEPOINT: 419 scnprintf(bf, sizeof(bf), "%s", "unknown tracepoint"); 420 break; 421 422 case PERF_TYPE_BREAKPOINT: 423 perf_evsel__bp_name(evsel, bf, sizeof(bf)); 424 break; 425 426 default: 427 scnprintf(bf, sizeof(bf), "unknown attr type: %d", 428 evsel->attr.type); 429 break; 430 } 431 432 evsel->name = strdup(bf); 433 434 return evsel->name ?: "unknown"; 435 } 436 437 const char *perf_evsel__group_name(struct perf_evsel *evsel) 438 { 439 return evsel->group_name ?: "anon group"; 440 } 441 442 int perf_evsel__group_desc(struct perf_evsel *evsel, char *buf, size_t size) 443 { 444 int ret; 445 struct perf_evsel *pos; 446 const char *group_name = perf_evsel__group_name(evsel); 447 448 ret = scnprintf(buf, size, "%s", group_name); 449 450 ret += scnprintf(buf + ret, size - ret, " { %s", 451 perf_evsel__name(evsel)); 452 453 for_each_group_member(pos, evsel) 454 ret += scnprintf(buf + ret, size - ret, ", %s", 455 perf_evsel__name(pos)); 456 457 ret += scnprintf(buf + ret, size - ret, " }"); 458 459 return ret; 460 } 461 462 /* 463 * The enable_on_exec/disabled value strategy: 464 * 465 * 1) For any type of traced program: 466 * - all independent events and group leaders are disabled 467 * - all group members are enabled 468 * 469 * Group members are ruled by group leaders. They need to 470 * be enabled, because the group scheduling relies on that. 471 * 472 * 2) For traced programs executed by perf: 473 * - all independent events and group leaders have 474 * enable_on_exec set 475 * - we don't specifically enable or disable any event during 476 * the record command 477 * 478 * Independent events and group leaders are initially disabled 479 * and get enabled by exec. Group members are ruled by group 480 * leaders as stated in 1). 481 * 482 * 3) For traced programs attached by perf (pid/tid): 483 * - we specifically enable or disable all events during 484 * the record command 485 * 486 * When attaching events to already running traced we 487 * enable/disable events specifically, as there's no 488 * initial traced exec call. 489 */ 490 void perf_evsel__config(struct perf_evsel *evsel, 491 struct perf_record_opts *opts) 492 { 493 struct perf_event_attr *attr = &evsel->attr; 494 int track = !evsel->idx; /* only the first counter needs these */ 495 496 attr->sample_id_all = perf_missing_features.sample_id_all ? 0 : 1; 497 attr->inherit = !opts->no_inherit; 498 499 perf_evsel__set_sample_bit(evsel, IP); 500 perf_evsel__set_sample_bit(evsel, TID); 501 502 /* 503 * We default some events to a 1 default interval. But keep 504 * it a weak assumption overridable by the user. 505 */ 506 if (!attr->sample_period || (opts->user_freq != UINT_MAX && 507 opts->user_interval != ULLONG_MAX)) { 508 if (opts->freq) { 509 perf_evsel__set_sample_bit(evsel, PERIOD); 510 attr->freq = 1; 511 attr->sample_freq = opts->freq; 512 } else { 513 attr->sample_period = opts->default_interval; 514 } 515 } 516 517 if (opts->no_samples) 518 attr->sample_freq = 0; 519 520 if (opts->inherit_stat) 521 attr->inherit_stat = 1; 522 523 if (opts->sample_address) { 524 perf_evsel__set_sample_bit(evsel, ADDR); 525 attr->mmap_data = track; 526 } 527 528 if (opts->call_graph) { 529 perf_evsel__set_sample_bit(evsel, CALLCHAIN); 530 531 if (opts->call_graph == CALLCHAIN_DWARF) { 532 perf_evsel__set_sample_bit(evsel, REGS_USER); 533 perf_evsel__set_sample_bit(evsel, STACK_USER); 534 attr->sample_regs_user = PERF_REGS_MASK; 535 attr->sample_stack_user = opts->stack_dump_size; 536 attr->exclude_callchain_user = 1; 537 } 538 } 539 540 if (perf_target__has_cpu(&opts->target)) 541 perf_evsel__set_sample_bit(evsel, CPU); 542 543 if (opts->period) 544 perf_evsel__set_sample_bit(evsel, PERIOD); 545 546 if (!perf_missing_features.sample_id_all && 547 (opts->sample_time || !opts->no_inherit || 548 perf_target__has_cpu(&opts->target))) 549 perf_evsel__set_sample_bit(evsel, TIME); 550 551 if (opts->raw_samples) { 552 perf_evsel__set_sample_bit(evsel, TIME); 553 perf_evsel__set_sample_bit(evsel, RAW); 554 perf_evsel__set_sample_bit(evsel, CPU); 555 } 556 557 if (opts->sample_address) 558 attr->sample_type |= PERF_SAMPLE_DATA_SRC; 559 560 if (opts->no_delay) { 561 attr->watermark = 0; 562 attr->wakeup_events = 1; 563 } 564 if (opts->branch_stack) { 565 perf_evsel__set_sample_bit(evsel, BRANCH_STACK); 566 attr->branch_sample_type = opts->branch_stack; 567 } 568 569 if (opts->sample_weight) 570 attr->sample_type |= PERF_SAMPLE_WEIGHT; 571 572 attr->mmap = track; 573 attr->comm = track; 574 575 /* 576 * XXX see the function comment above 577 * 578 * Disabling only independent events or group leaders, 579 * keeping group members enabled. 580 */ 581 if (perf_evsel__is_group_leader(evsel)) 582 attr->disabled = 1; 583 584 /* 585 * Setting enable_on_exec for independent events and 586 * group leaders for traced executed by perf. 587 */ 588 if (perf_target__none(&opts->target) && perf_evsel__is_group_leader(evsel)) 589 attr->enable_on_exec = 1; 590 } 591 592 int perf_evsel__alloc_fd(struct perf_evsel *evsel, int ncpus, int nthreads) 593 { 594 int cpu, thread; 595 evsel->fd = xyarray__new(ncpus, nthreads, sizeof(int)); 596 597 if (evsel->fd) { 598 for (cpu = 0; cpu < ncpus; cpu++) { 599 for (thread = 0; thread < nthreads; thread++) { 600 FD(evsel, cpu, thread) = -1; 601 } 602 } 603 } 604 605 return evsel->fd != NULL ? 0 : -ENOMEM; 606 } 607 608 int perf_evsel__set_filter(struct perf_evsel *evsel, int ncpus, int nthreads, 609 const char *filter) 610 { 611 int cpu, thread; 612 613 for (cpu = 0; cpu < ncpus; cpu++) { 614 for (thread = 0; thread < nthreads; thread++) { 615 int fd = FD(evsel, cpu, thread), 616 err = ioctl(fd, PERF_EVENT_IOC_SET_FILTER, filter); 617 618 if (err) 619 return err; 620 } 621 } 622 623 return 0; 624 } 625 626 int perf_evsel__alloc_id(struct perf_evsel *evsel, int ncpus, int nthreads) 627 { 628 evsel->sample_id = xyarray__new(ncpus, nthreads, sizeof(struct perf_sample_id)); 629 if (evsel->sample_id == NULL) 630 return -ENOMEM; 631 632 evsel->id = zalloc(ncpus * nthreads * sizeof(u64)); 633 if (evsel->id == NULL) { 634 xyarray__delete(evsel->sample_id); 635 evsel->sample_id = NULL; 636 return -ENOMEM; 637 } 638 639 return 0; 640 } 641 642 void perf_evsel__reset_counts(struct perf_evsel *evsel, int ncpus) 643 { 644 memset(evsel->counts, 0, (sizeof(*evsel->counts) + 645 (ncpus * sizeof(struct perf_counts_values)))); 646 } 647 648 int perf_evsel__alloc_counts(struct perf_evsel *evsel, int ncpus) 649 { 650 evsel->counts = zalloc((sizeof(*evsel->counts) + 651 (ncpus * sizeof(struct perf_counts_values)))); 652 return evsel->counts != NULL ? 0 : -ENOMEM; 653 } 654 655 void perf_evsel__free_fd(struct perf_evsel *evsel) 656 { 657 xyarray__delete(evsel->fd); 658 evsel->fd = NULL; 659 } 660 661 void perf_evsel__free_id(struct perf_evsel *evsel) 662 { 663 xyarray__delete(evsel->sample_id); 664 evsel->sample_id = NULL; 665 free(evsel->id); 666 evsel->id = NULL; 667 } 668 669 void perf_evsel__close_fd(struct perf_evsel *evsel, int ncpus, int nthreads) 670 { 671 int cpu, thread; 672 673 for (cpu = 0; cpu < ncpus; cpu++) 674 for (thread = 0; thread < nthreads; ++thread) { 675 close(FD(evsel, cpu, thread)); 676 FD(evsel, cpu, thread) = -1; 677 } 678 } 679 680 void perf_evsel__free_counts(struct perf_evsel *evsel) 681 { 682 free(evsel->counts); 683 } 684 685 void perf_evsel__exit(struct perf_evsel *evsel) 686 { 687 assert(list_empty(&evsel->node)); 688 perf_evsel__free_fd(evsel); 689 perf_evsel__free_id(evsel); 690 } 691 692 void perf_evsel__delete(struct perf_evsel *evsel) 693 { 694 perf_evsel__exit(evsel); 695 close_cgroup(evsel->cgrp); 696 free(evsel->group_name); 697 if (evsel->tp_format) 698 pevent_free_format(evsel->tp_format); 699 free(evsel->name); 700 free(evsel); 701 } 702 703 static inline void compute_deltas(struct perf_evsel *evsel, 704 int cpu, 705 struct perf_counts_values *count) 706 { 707 struct perf_counts_values tmp; 708 709 if (!evsel->prev_raw_counts) 710 return; 711 712 if (cpu == -1) { 713 tmp = evsel->prev_raw_counts->aggr; 714 evsel->prev_raw_counts->aggr = *count; 715 } else { 716 tmp = evsel->prev_raw_counts->cpu[cpu]; 717 evsel->prev_raw_counts->cpu[cpu] = *count; 718 } 719 720 count->val = count->val - tmp.val; 721 count->ena = count->ena - tmp.ena; 722 count->run = count->run - tmp.run; 723 } 724 725 int __perf_evsel__read_on_cpu(struct perf_evsel *evsel, 726 int cpu, int thread, bool scale) 727 { 728 struct perf_counts_values count; 729 size_t nv = scale ? 3 : 1; 730 731 if (FD(evsel, cpu, thread) < 0) 732 return -EINVAL; 733 734 if (evsel->counts == NULL && perf_evsel__alloc_counts(evsel, cpu + 1) < 0) 735 return -ENOMEM; 736 737 if (readn(FD(evsel, cpu, thread), &count, nv * sizeof(u64)) < 0) 738 return -errno; 739 740 compute_deltas(evsel, cpu, &count); 741 742 if (scale) { 743 if (count.run == 0) 744 count.val = 0; 745 else if (count.run < count.ena) 746 count.val = (u64)((double)count.val * count.ena / count.run + 0.5); 747 } else 748 count.ena = count.run = 0; 749 750 evsel->counts->cpu[cpu] = count; 751 return 0; 752 } 753 754 int __perf_evsel__read(struct perf_evsel *evsel, 755 int ncpus, int nthreads, bool scale) 756 { 757 size_t nv = scale ? 3 : 1; 758 int cpu, thread; 759 struct perf_counts_values *aggr = &evsel->counts->aggr, count; 760 761 aggr->val = aggr->ena = aggr->run = 0; 762 763 for (cpu = 0; cpu < ncpus; cpu++) { 764 for (thread = 0; thread < nthreads; thread++) { 765 if (FD(evsel, cpu, thread) < 0) 766 continue; 767 768 if (readn(FD(evsel, cpu, thread), 769 &count, nv * sizeof(u64)) < 0) 770 return -errno; 771 772 aggr->val += count.val; 773 if (scale) { 774 aggr->ena += count.ena; 775 aggr->run += count.run; 776 } 777 } 778 } 779 780 compute_deltas(evsel, -1, aggr); 781 782 evsel->counts->scaled = 0; 783 if (scale) { 784 if (aggr->run == 0) { 785 evsel->counts->scaled = -1; 786 aggr->val = 0; 787 return 0; 788 } 789 790 if (aggr->run < aggr->ena) { 791 evsel->counts->scaled = 1; 792 aggr->val = (u64)((double)aggr->val * aggr->ena / aggr->run + 0.5); 793 } 794 } else 795 aggr->ena = aggr->run = 0; 796 797 return 0; 798 } 799 800 static int get_group_fd(struct perf_evsel *evsel, int cpu, int thread) 801 { 802 struct perf_evsel *leader = evsel->leader; 803 int fd; 804 805 if (perf_evsel__is_group_leader(evsel)) 806 return -1; 807 808 /* 809 * Leader must be already processed/open, 810 * if not it's a bug. 811 */ 812 BUG_ON(!leader->fd); 813 814 fd = FD(leader, cpu, thread); 815 BUG_ON(fd == -1); 816 817 return fd; 818 } 819 820 static int __perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus, 821 struct thread_map *threads) 822 { 823 int cpu, thread; 824 unsigned long flags = 0; 825 int pid = -1, err; 826 827 if (evsel->fd == NULL && 828 perf_evsel__alloc_fd(evsel, cpus->nr, threads->nr) < 0) 829 return -ENOMEM; 830 831 if (evsel->cgrp) { 832 flags = PERF_FLAG_PID_CGROUP; 833 pid = evsel->cgrp->fd; 834 } 835 836 fallback_missing_features: 837 if (perf_missing_features.exclude_guest) 838 evsel->attr.exclude_guest = evsel->attr.exclude_host = 0; 839 retry_sample_id: 840 if (perf_missing_features.sample_id_all) 841 evsel->attr.sample_id_all = 0; 842 843 for (cpu = 0; cpu < cpus->nr; cpu++) { 844 845 for (thread = 0; thread < threads->nr; thread++) { 846 int group_fd; 847 848 if (!evsel->cgrp) 849 pid = threads->map[thread]; 850 851 group_fd = get_group_fd(evsel, cpu, thread); 852 853 FD(evsel, cpu, thread) = sys_perf_event_open(&evsel->attr, 854 pid, 855 cpus->map[cpu], 856 group_fd, flags); 857 if (FD(evsel, cpu, thread) < 0) { 858 err = -errno; 859 goto try_fallback; 860 } 861 } 862 } 863 864 return 0; 865 866 try_fallback: 867 if (err != -EINVAL || cpu > 0 || thread > 0) 868 goto out_close; 869 870 if (!perf_missing_features.exclude_guest && 871 (evsel->attr.exclude_guest || evsel->attr.exclude_host)) { 872 perf_missing_features.exclude_guest = true; 873 goto fallback_missing_features; 874 } else if (!perf_missing_features.sample_id_all) { 875 perf_missing_features.sample_id_all = true; 876 goto retry_sample_id; 877 } 878 879 out_close: 880 do { 881 while (--thread >= 0) { 882 close(FD(evsel, cpu, thread)); 883 FD(evsel, cpu, thread) = -1; 884 } 885 thread = threads->nr; 886 } while (--cpu >= 0); 887 return err; 888 } 889 890 void perf_evsel__close(struct perf_evsel *evsel, int ncpus, int nthreads) 891 { 892 if (evsel->fd == NULL) 893 return; 894 895 perf_evsel__close_fd(evsel, ncpus, nthreads); 896 perf_evsel__free_fd(evsel); 897 evsel->fd = NULL; 898 } 899 900 static struct { 901 struct cpu_map map; 902 int cpus[1]; 903 } empty_cpu_map = { 904 .map.nr = 1, 905 .cpus = { -1, }, 906 }; 907 908 static struct { 909 struct thread_map map; 910 int threads[1]; 911 } empty_thread_map = { 912 .map.nr = 1, 913 .threads = { -1, }, 914 }; 915 916 int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus, 917 struct thread_map *threads) 918 { 919 if (cpus == NULL) { 920 /* Work around old compiler warnings about strict aliasing */ 921 cpus = &empty_cpu_map.map; 922 } 923 924 if (threads == NULL) 925 threads = &empty_thread_map.map; 926 927 return __perf_evsel__open(evsel, cpus, threads); 928 } 929 930 int perf_evsel__open_per_cpu(struct perf_evsel *evsel, 931 struct cpu_map *cpus) 932 { 933 return __perf_evsel__open(evsel, cpus, &empty_thread_map.map); 934 } 935 936 int perf_evsel__open_per_thread(struct perf_evsel *evsel, 937 struct thread_map *threads) 938 { 939 return __perf_evsel__open(evsel, &empty_cpu_map.map, threads); 940 } 941 942 static int perf_evsel__parse_id_sample(const struct perf_evsel *evsel, 943 const union perf_event *event, 944 struct perf_sample *sample) 945 { 946 u64 type = evsel->attr.sample_type; 947 const u64 *array = event->sample.array; 948 bool swapped = evsel->needs_swap; 949 union u64_swap u; 950 951 array += ((event->header.size - 952 sizeof(event->header)) / sizeof(u64)) - 1; 953 954 if (type & PERF_SAMPLE_CPU) { 955 u.val64 = *array; 956 if (swapped) { 957 /* undo swap of u64, then swap on individual u32s */ 958 u.val64 = bswap_64(u.val64); 959 u.val32[0] = bswap_32(u.val32[0]); 960 } 961 962 sample->cpu = u.val32[0]; 963 array--; 964 } 965 966 if (type & PERF_SAMPLE_STREAM_ID) { 967 sample->stream_id = *array; 968 array--; 969 } 970 971 if (type & PERF_SAMPLE_ID) { 972 sample->id = *array; 973 array--; 974 } 975 976 if (type & PERF_SAMPLE_TIME) { 977 sample->time = *array; 978 array--; 979 } 980 981 if (type & PERF_SAMPLE_TID) { 982 u.val64 = *array; 983 if (swapped) { 984 /* undo swap of u64, then swap on individual u32s */ 985 u.val64 = bswap_64(u.val64); 986 u.val32[0] = bswap_32(u.val32[0]); 987 u.val32[1] = bswap_32(u.val32[1]); 988 } 989 990 sample->pid = u.val32[0]; 991 sample->tid = u.val32[1]; 992 } 993 994 return 0; 995 } 996 997 static bool sample_overlap(const union perf_event *event, 998 const void *offset, u64 size) 999 { 1000 const void *base = event; 1001 1002 if (offset + size > base + event->header.size) 1003 return true; 1004 1005 return false; 1006 } 1007 1008 int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event, 1009 struct perf_sample *data) 1010 { 1011 u64 type = evsel->attr.sample_type; 1012 u64 regs_user = evsel->attr.sample_regs_user; 1013 bool swapped = evsel->needs_swap; 1014 const u64 *array; 1015 1016 /* 1017 * used for cross-endian analysis. See git commit 65014ab3 1018 * for why this goofiness is needed. 1019 */ 1020 union u64_swap u; 1021 1022 memset(data, 0, sizeof(*data)); 1023 data->cpu = data->pid = data->tid = -1; 1024 data->stream_id = data->id = data->time = -1ULL; 1025 data->period = 1; 1026 data->weight = 0; 1027 1028 if (event->header.type != PERF_RECORD_SAMPLE) { 1029 if (!evsel->attr.sample_id_all) 1030 return 0; 1031 return perf_evsel__parse_id_sample(evsel, event, data); 1032 } 1033 1034 array = event->sample.array; 1035 1036 if (evsel->sample_size + sizeof(event->header) > event->header.size) 1037 return -EFAULT; 1038 1039 if (type & PERF_SAMPLE_IP) { 1040 data->ip = event->ip.ip; 1041 array++; 1042 } 1043 1044 if (type & PERF_SAMPLE_TID) { 1045 u.val64 = *array; 1046 if (swapped) { 1047 /* undo swap of u64, then swap on individual u32s */ 1048 u.val64 = bswap_64(u.val64); 1049 u.val32[0] = bswap_32(u.val32[0]); 1050 u.val32[1] = bswap_32(u.val32[1]); 1051 } 1052 1053 data->pid = u.val32[0]; 1054 data->tid = u.val32[1]; 1055 array++; 1056 } 1057 1058 if (type & PERF_SAMPLE_TIME) { 1059 data->time = *array; 1060 array++; 1061 } 1062 1063 data->addr = 0; 1064 if (type & PERF_SAMPLE_ADDR) { 1065 data->addr = *array; 1066 array++; 1067 } 1068 1069 data->id = -1ULL; 1070 if (type & PERF_SAMPLE_ID) { 1071 data->id = *array; 1072 array++; 1073 } 1074 1075 if (type & PERF_SAMPLE_STREAM_ID) { 1076 data->stream_id = *array; 1077 array++; 1078 } 1079 1080 if (type & PERF_SAMPLE_CPU) { 1081 1082 u.val64 = *array; 1083 if (swapped) { 1084 /* undo swap of u64, then swap on individual u32s */ 1085 u.val64 = bswap_64(u.val64); 1086 u.val32[0] = bswap_32(u.val32[0]); 1087 } 1088 1089 data->cpu = u.val32[0]; 1090 array++; 1091 } 1092 1093 if (type & PERF_SAMPLE_PERIOD) { 1094 data->period = *array; 1095 array++; 1096 } 1097 1098 if (type & PERF_SAMPLE_READ) { 1099 fprintf(stderr, "PERF_SAMPLE_READ is unsupported for now\n"); 1100 return -1; 1101 } 1102 1103 if (type & PERF_SAMPLE_CALLCHAIN) { 1104 if (sample_overlap(event, array, sizeof(data->callchain->nr))) 1105 return -EFAULT; 1106 1107 data->callchain = (struct ip_callchain *)array; 1108 1109 if (sample_overlap(event, array, data->callchain->nr)) 1110 return -EFAULT; 1111 1112 array += 1 + data->callchain->nr; 1113 } 1114 1115 if (type & PERF_SAMPLE_RAW) { 1116 const u64 *pdata; 1117 1118 u.val64 = *array; 1119 if (WARN_ONCE(swapped, 1120 "Endianness of raw data not corrected!\n")) { 1121 /* undo swap of u64, then swap on individual u32s */ 1122 u.val64 = bswap_64(u.val64); 1123 u.val32[0] = bswap_32(u.val32[0]); 1124 u.val32[1] = bswap_32(u.val32[1]); 1125 } 1126 1127 if (sample_overlap(event, array, sizeof(u32))) 1128 return -EFAULT; 1129 1130 data->raw_size = u.val32[0]; 1131 pdata = (void *) array + sizeof(u32); 1132 1133 if (sample_overlap(event, pdata, data->raw_size)) 1134 return -EFAULT; 1135 1136 data->raw_data = (void *) pdata; 1137 1138 array = (void *)array + data->raw_size + sizeof(u32); 1139 } 1140 1141 if (type & PERF_SAMPLE_BRANCH_STACK) { 1142 u64 sz; 1143 1144 data->branch_stack = (struct branch_stack *)array; 1145 array++; /* nr */ 1146 1147 sz = data->branch_stack->nr * sizeof(struct branch_entry); 1148 sz /= sizeof(u64); 1149 array += sz; 1150 } 1151 1152 if (type & PERF_SAMPLE_REGS_USER) { 1153 /* First u64 tells us if we have any regs in sample. */ 1154 u64 avail = *array++; 1155 1156 if (avail) { 1157 data->user_regs.regs = (u64 *)array; 1158 array += hweight_long(regs_user); 1159 } 1160 } 1161 1162 if (type & PERF_SAMPLE_STACK_USER) { 1163 u64 size = *array++; 1164 1165 data->user_stack.offset = ((char *)(array - 1) 1166 - (char *) event); 1167 1168 if (!size) { 1169 data->user_stack.size = 0; 1170 } else { 1171 data->user_stack.data = (char *)array; 1172 array += size / sizeof(*array); 1173 data->user_stack.size = *array++; 1174 } 1175 } 1176 1177 data->weight = 0; 1178 if (type & PERF_SAMPLE_WEIGHT) { 1179 data->weight = *array; 1180 array++; 1181 } 1182 1183 data->data_src = PERF_MEM_DATA_SRC_NONE; 1184 if (type & PERF_SAMPLE_DATA_SRC) { 1185 data->data_src = *array; 1186 array++; 1187 } 1188 1189 return 0; 1190 } 1191 1192 int perf_event__synthesize_sample(union perf_event *event, u64 type, 1193 const struct perf_sample *sample, 1194 bool swapped) 1195 { 1196 u64 *array; 1197 1198 /* 1199 * used for cross-endian analysis. See git commit 65014ab3 1200 * for why this goofiness is needed. 1201 */ 1202 union u64_swap u; 1203 1204 array = event->sample.array; 1205 1206 if (type & PERF_SAMPLE_IP) { 1207 event->ip.ip = sample->ip; 1208 array++; 1209 } 1210 1211 if (type & PERF_SAMPLE_TID) { 1212 u.val32[0] = sample->pid; 1213 u.val32[1] = sample->tid; 1214 if (swapped) { 1215 /* 1216 * Inverse of what is done in perf_evsel__parse_sample 1217 */ 1218 u.val32[0] = bswap_32(u.val32[0]); 1219 u.val32[1] = bswap_32(u.val32[1]); 1220 u.val64 = bswap_64(u.val64); 1221 } 1222 1223 *array = u.val64; 1224 array++; 1225 } 1226 1227 if (type & PERF_SAMPLE_TIME) { 1228 *array = sample->time; 1229 array++; 1230 } 1231 1232 if (type & PERF_SAMPLE_ADDR) { 1233 *array = sample->addr; 1234 array++; 1235 } 1236 1237 if (type & PERF_SAMPLE_ID) { 1238 *array = sample->id; 1239 array++; 1240 } 1241 1242 if (type & PERF_SAMPLE_STREAM_ID) { 1243 *array = sample->stream_id; 1244 array++; 1245 } 1246 1247 if (type & PERF_SAMPLE_CPU) { 1248 u.val32[0] = sample->cpu; 1249 if (swapped) { 1250 /* 1251 * Inverse of what is done in perf_evsel__parse_sample 1252 */ 1253 u.val32[0] = bswap_32(u.val32[0]); 1254 u.val64 = bswap_64(u.val64); 1255 } 1256 *array = u.val64; 1257 array++; 1258 } 1259 1260 if (type & PERF_SAMPLE_PERIOD) { 1261 *array = sample->period; 1262 array++; 1263 } 1264 1265 return 0; 1266 } 1267 1268 struct format_field *perf_evsel__field(struct perf_evsel *evsel, const char *name) 1269 { 1270 return pevent_find_field(evsel->tp_format, name); 1271 } 1272 1273 void *perf_evsel__rawptr(struct perf_evsel *evsel, struct perf_sample *sample, 1274 const char *name) 1275 { 1276 struct format_field *field = perf_evsel__field(evsel, name); 1277 int offset; 1278 1279 if (!field) 1280 return NULL; 1281 1282 offset = field->offset; 1283 1284 if (field->flags & FIELD_IS_DYNAMIC) { 1285 offset = *(int *)(sample->raw_data + field->offset); 1286 offset &= 0xffff; 1287 } 1288 1289 return sample->raw_data + offset; 1290 } 1291 1292 u64 perf_evsel__intval(struct perf_evsel *evsel, struct perf_sample *sample, 1293 const char *name) 1294 { 1295 struct format_field *field = perf_evsel__field(evsel, name); 1296 void *ptr; 1297 u64 value; 1298 1299 if (!field) 1300 return 0; 1301 1302 ptr = sample->raw_data + field->offset; 1303 1304 switch (field->size) { 1305 case 1: 1306 return *(u8 *)ptr; 1307 case 2: 1308 value = *(u16 *)ptr; 1309 break; 1310 case 4: 1311 value = *(u32 *)ptr; 1312 break; 1313 case 8: 1314 value = *(u64 *)ptr; 1315 break; 1316 default: 1317 return 0; 1318 } 1319 1320 if (!evsel->needs_swap) 1321 return value; 1322 1323 switch (field->size) { 1324 case 2: 1325 return bswap_16(value); 1326 case 4: 1327 return bswap_32(value); 1328 case 8: 1329 return bswap_64(value); 1330 default: 1331 return 0; 1332 } 1333 1334 return 0; 1335 } 1336 1337 static int comma_fprintf(FILE *fp, bool *first, const char *fmt, ...) 1338 { 1339 va_list args; 1340 int ret = 0; 1341 1342 if (!*first) { 1343 ret += fprintf(fp, ","); 1344 } else { 1345 ret += fprintf(fp, ":"); 1346 *first = false; 1347 } 1348 1349 va_start(args, fmt); 1350 ret += vfprintf(fp, fmt, args); 1351 va_end(args); 1352 return ret; 1353 } 1354 1355 static int __if_fprintf(FILE *fp, bool *first, const char *field, u64 value) 1356 { 1357 if (value == 0) 1358 return 0; 1359 1360 return comma_fprintf(fp, first, " %s: %" PRIu64, field, value); 1361 } 1362 1363 #define if_print(field) printed += __if_fprintf(fp, &first, #field, evsel->attr.field) 1364 1365 struct bit_names { 1366 int bit; 1367 const char *name; 1368 }; 1369 1370 static int bits__fprintf(FILE *fp, const char *field, u64 value, 1371 struct bit_names *bits, bool *first) 1372 { 1373 int i = 0, printed = comma_fprintf(fp, first, " %s: ", field); 1374 bool first_bit = true; 1375 1376 do { 1377 if (value & bits[i].bit) { 1378 printed += fprintf(fp, "%s%s", first_bit ? "" : "|", bits[i].name); 1379 first_bit = false; 1380 } 1381 } while (bits[++i].name != NULL); 1382 1383 return printed; 1384 } 1385 1386 static int sample_type__fprintf(FILE *fp, bool *first, u64 value) 1387 { 1388 #define bit_name(n) { PERF_SAMPLE_##n, #n } 1389 struct bit_names bits[] = { 1390 bit_name(IP), bit_name(TID), bit_name(TIME), bit_name(ADDR), 1391 bit_name(READ), bit_name(CALLCHAIN), bit_name(ID), bit_name(CPU), 1392 bit_name(PERIOD), bit_name(STREAM_ID), bit_name(RAW), 1393 bit_name(BRANCH_STACK), bit_name(REGS_USER), bit_name(STACK_USER), 1394 { .name = NULL, } 1395 }; 1396 #undef bit_name 1397 return bits__fprintf(fp, "sample_type", value, bits, first); 1398 } 1399 1400 static int read_format__fprintf(FILE *fp, bool *first, u64 value) 1401 { 1402 #define bit_name(n) { PERF_FORMAT_##n, #n } 1403 struct bit_names bits[] = { 1404 bit_name(TOTAL_TIME_ENABLED), bit_name(TOTAL_TIME_RUNNING), 1405 bit_name(ID), bit_name(GROUP), 1406 { .name = NULL, } 1407 }; 1408 #undef bit_name 1409 return bits__fprintf(fp, "read_format", value, bits, first); 1410 } 1411 1412 int perf_evsel__fprintf(struct perf_evsel *evsel, 1413 struct perf_attr_details *details, FILE *fp) 1414 { 1415 bool first = true; 1416 int printed = 0; 1417 1418 if (details->event_group) { 1419 struct perf_evsel *pos; 1420 1421 if (!perf_evsel__is_group_leader(evsel)) 1422 return 0; 1423 1424 if (evsel->nr_members > 1) 1425 printed += fprintf(fp, "%s{", evsel->group_name ?: ""); 1426 1427 printed += fprintf(fp, "%s", perf_evsel__name(evsel)); 1428 for_each_group_member(pos, evsel) 1429 printed += fprintf(fp, ",%s", perf_evsel__name(pos)); 1430 1431 if (evsel->nr_members > 1) 1432 printed += fprintf(fp, "}"); 1433 goto out; 1434 } 1435 1436 printed += fprintf(fp, "%s", perf_evsel__name(evsel)); 1437 1438 if (details->verbose || details->freq) { 1439 printed += comma_fprintf(fp, &first, " sample_freq=%" PRIu64, 1440 (u64)evsel->attr.sample_freq); 1441 } 1442 1443 if (details->verbose) { 1444 if_print(type); 1445 if_print(config); 1446 if_print(config1); 1447 if_print(config2); 1448 if_print(size); 1449 printed += sample_type__fprintf(fp, &first, evsel->attr.sample_type); 1450 if (evsel->attr.read_format) 1451 printed += read_format__fprintf(fp, &first, evsel->attr.read_format); 1452 if_print(disabled); 1453 if_print(inherit); 1454 if_print(pinned); 1455 if_print(exclusive); 1456 if_print(exclude_user); 1457 if_print(exclude_kernel); 1458 if_print(exclude_hv); 1459 if_print(exclude_idle); 1460 if_print(mmap); 1461 if_print(comm); 1462 if_print(freq); 1463 if_print(inherit_stat); 1464 if_print(enable_on_exec); 1465 if_print(task); 1466 if_print(watermark); 1467 if_print(precise_ip); 1468 if_print(mmap_data); 1469 if_print(sample_id_all); 1470 if_print(exclude_host); 1471 if_print(exclude_guest); 1472 if_print(__reserved_1); 1473 if_print(wakeup_events); 1474 if_print(bp_type); 1475 if_print(branch_sample_type); 1476 } 1477 out: 1478 fputc('\n', fp); 1479 return ++printed; 1480 } 1481 1482 bool perf_evsel__fallback(struct perf_evsel *evsel, int err, 1483 char *msg, size_t msgsize) 1484 { 1485 if ((err == ENOENT || err == ENXIO) && 1486 evsel->attr.type == PERF_TYPE_HARDWARE && 1487 evsel->attr.config == PERF_COUNT_HW_CPU_CYCLES) { 1488 /* 1489 * If it's cycles then fall back to hrtimer based 1490 * cpu-clock-tick sw counter, which is always available even if 1491 * no PMU support. 1492 * 1493 * PPC returns ENXIO until 2.6.37 (behavior changed with commit 1494 * b0a873e). 1495 */ 1496 scnprintf(msg, msgsize, "%s", 1497 "The cycles event is not supported, trying to fall back to cpu-clock-ticks"); 1498 1499 evsel->attr.type = PERF_TYPE_SOFTWARE; 1500 evsel->attr.config = PERF_COUNT_SW_CPU_CLOCK; 1501 1502 free(evsel->name); 1503 evsel->name = NULL; 1504 return true; 1505 } 1506 1507 return false; 1508 } 1509 1510 int perf_evsel__open_strerror(struct perf_evsel *evsel, 1511 struct perf_target *target, 1512 int err, char *msg, size_t size) 1513 { 1514 switch (err) { 1515 case EPERM: 1516 case EACCES: 1517 return scnprintf(msg, size, 1518 "You may not have permission to collect %sstats.\n" 1519 "Consider tweaking /proc/sys/kernel/perf_event_paranoid:\n" 1520 " -1 - Not paranoid at all\n" 1521 " 0 - Disallow raw tracepoint access for unpriv\n" 1522 " 1 - Disallow cpu events for unpriv\n" 1523 " 2 - Disallow kernel profiling for unpriv", 1524 target->system_wide ? "system-wide " : ""); 1525 case ENOENT: 1526 return scnprintf(msg, size, "The %s event is not supported.", 1527 perf_evsel__name(evsel)); 1528 case EMFILE: 1529 return scnprintf(msg, size, "%s", 1530 "Too many events are opened.\n" 1531 "Try again after reducing the number of events."); 1532 case ENODEV: 1533 if (target->cpu_list) 1534 return scnprintf(msg, size, "%s", 1535 "No such device - did you specify an out-of-range profile CPU?\n"); 1536 break; 1537 case EOPNOTSUPP: 1538 if (evsel->attr.precise_ip) 1539 return scnprintf(msg, size, "%s", 1540 "\'precise\' request may not be supported. Try removing 'p' modifier."); 1541 #if defined(__i386__) || defined(__x86_64__) 1542 if (evsel->attr.type == PERF_TYPE_HARDWARE) 1543 return scnprintf(msg, size, "%s", 1544 "No hardware sampling interrupt available.\n" 1545 "No APIC? If so then you can boot the kernel with the \"lapic\" boot parameter to force-enable it."); 1546 #endif 1547 break; 1548 default: 1549 break; 1550 } 1551 1552 return scnprintf(msg, size, 1553 "The sys_perf_event_open() syscall returned with %d (%s) for event (%s). \n" 1554 "/bin/dmesg may provide additional information.\n" 1555 "No CONFIG_PERF_EVENTS=y kernel support configured?\n", 1556 err, strerror(err), perf_evsel__name(evsel)); 1557 } 1558