1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Copyright (C) 2011, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com> 4 * 5 * Parts came from builtin-{top,stat,record}.c, see those files for further 6 * copyright notes. 7 */ 8 #include <api/fs/fs.h> 9 #include <errno.h> 10 #include <inttypes.h> 11 #include <poll.h> 12 #include "cpumap.h" 13 #include "util/mmap.h" 14 #include "thread_map.h" 15 #include "target.h" 16 #include "evlist.h" 17 #include "evsel.h" 18 #include "debug.h" 19 #include "units.h" 20 #include <internal/lib.h> // page_size 21 #include "../perf.h" 22 #include "asm/bug.h" 23 #include "bpf-event.h" 24 #include "util/string2.h" 25 #include <signal.h> 26 #include <unistd.h> 27 #include <sched.h> 28 #include <stdlib.h> 29 30 #include "parse-events.h" 31 #include <subcmd/parse-options.h> 32 33 #include <fcntl.h> 34 #include <sys/ioctl.h> 35 #include <sys/mman.h> 36 37 #include <linux/bitops.h> 38 #include <linux/hash.h> 39 #include <linux/log2.h> 40 #include <linux/err.h> 41 #include <linux/string.h> 42 #include <linux/zalloc.h> 43 #include <perf/evlist.h> 44 #include <perf/evsel.h> 45 #include <perf/cpumap.h> 46 #include <perf/mmap.h> 47 48 #include <internal/xyarray.h> 49 50 #ifdef LACKS_SIGQUEUE_PROTOTYPE 51 int sigqueue(pid_t pid, int sig, const union sigval value); 52 #endif 53 54 #define FD(e, x, y) (*(int *)xyarray__entry(e->core.fd, x, y)) 55 #define SID(e, x, y) xyarray__entry(e->core.sample_id, x, y) 56 57 void evlist__init(struct evlist *evlist, struct perf_cpu_map *cpus, 58 struct perf_thread_map *threads) 59 { 60 perf_evlist__init(&evlist->core); 61 perf_evlist__set_maps(&evlist->core, cpus, threads); 62 evlist->workload.pid = -1; 63 evlist->bkw_mmap_state = BKW_MMAP_NOTREADY; 64 } 65 66 struct evlist *evlist__new(void) 67 { 68 struct evlist *evlist = zalloc(sizeof(*evlist)); 69 70 if (evlist != NULL) 71 evlist__init(evlist, NULL, NULL); 72 73 return evlist; 74 } 75 76 struct evlist *perf_evlist__new_default(void) 77 { 78 struct evlist *evlist = evlist__new(); 79 80 if (evlist && perf_evlist__add_default(evlist)) { 81 evlist__delete(evlist); 82 evlist = NULL; 83 } 84 85 return evlist; 86 } 87 88 struct evlist *perf_evlist__new_dummy(void) 89 { 90 struct evlist *evlist = evlist__new(); 91 92 if (evlist && perf_evlist__add_dummy(evlist)) { 93 evlist__delete(evlist); 94 evlist = NULL; 95 } 96 97 return evlist; 98 } 99 100 /** 101 * perf_evlist__set_id_pos - set the positions of event ids. 102 * @evlist: selected event list 103 * 104 * Events with compatible sample types all have the same id_pos 105 * and is_pos. For convenience, put a copy on evlist. 106 */ 107 void perf_evlist__set_id_pos(struct evlist *evlist) 108 { 109 struct evsel *first = evlist__first(evlist); 110 111 evlist->id_pos = first->id_pos; 112 evlist->is_pos = first->is_pos; 113 } 114 115 static void perf_evlist__update_id_pos(struct evlist *evlist) 116 { 117 struct evsel *evsel; 118 119 evlist__for_each_entry(evlist, evsel) 120 perf_evsel__calc_id_pos(evsel); 121 122 perf_evlist__set_id_pos(evlist); 123 } 124 125 static void evlist__purge(struct evlist *evlist) 126 { 127 struct evsel *pos, *n; 128 129 evlist__for_each_entry_safe(evlist, n, pos) { 130 list_del_init(&pos->core.node); 131 pos->evlist = NULL; 132 evsel__delete(pos); 133 } 134 135 evlist->core.nr_entries = 0; 136 } 137 138 void evlist__exit(struct evlist *evlist) 139 { 140 zfree(&evlist->mmap); 141 zfree(&evlist->overwrite_mmap); 142 perf_evlist__exit(&evlist->core); 143 } 144 145 void evlist__delete(struct evlist *evlist) 146 { 147 if (evlist == NULL) 148 return; 149 150 evlist__munmap(evlist); 151 evlist__close(evlist); 152 evlist__purge(evlist); 153 evlist__exit(evlist); 154 free(evlist); 155 } 156 157 void evlist__add(struct evlist *evlist, struct evsel *entry) 158 { 159 entry->evlist = evlist; 160 entry->idx = evlist->core.nr_entries; 161 entry->tracking = !entry->idx; 162 163 perf_evlist__add(&evlist->core, &entry->core); 164 165 if (evlist->core.nr_entries == 1) 166 perf_evlist__set_id_pos(evlist); 167 } 168 169 void evlist__remove(struct evlist *evlist, struct evsel *evsel) 170 { 171 evsel->evlist = NULL; 172 perf_evlist__remove(&evlist->core, &evsel->core); 173 } 174 175 void perf_evlist__splice_list_tail(struct evlist *evlist, 176 struct list_head *list) 177 { 178 struct evsel *evsel, *temp; 179 180 __evlist__for_each_entry_safe(list, temp, evsel) { 181 list_del_init(&evsel->core.node); 182 evlist__add(evlist, evsel); 183 } 184 } 185 186 int __evlist__set_tracepoints_handlers(struct evlist *evlist, 187 const struct evsel_str_handler *assocs, size_t nr_assocs) 188 { 189 struct evsel *evsel; 190 size_t i; 191 int err; 192 193 for (i = 0; i < nr_assocs; i++) { 194 // Adding a handler for an event not in this evlist, just ignore it. 195 evsel = perf_evlist__find_tracepoint_by_name(evlist, assocs[i].name); 196 if (evsel == NULL) 197 continue; 198 199 err = -EEXIST; 200 if (evsel->handler != NULL) 201 goto out; 202 evsel->handler = assocs[i].handler; 203 } 204 205 err = 0; 206 out: 207 return err; 208 } 209 210 void __perf_evlist__set_leader(struct list_head *list) 211 { 212 struct evsel *evsel, *leader; 213 214 leader = list_entry(list->next, struct evsel, core.node); 215 evsel = list_entry(list->prev, struct evsel, core.node); 216 217 leader->core.nr_members = evsel->idx - leader->idx + 1; 218 219 __evlist__for_each_entry(list, evsel) { 220 evsel->leader = leader; 221 } 222 } 223 224 void perf_evlist__set_leader(struct evlist *evlist) 225 { 226 if (evlist->core.nr_entries) { 227 evlist->nr_groups = evlist->core.nr_entries > 1 ? 1 : 0; 228 __perf_evlist__set_leader(&evlist->core.entries); 229 } 230 } 231 232 int __perf_evlist__add_default(struct evlist *evlist, bool precise) 233 { 234 struct evsel *evsel = perf_evsel__new_cycles(precise); 235 236 if (evsel == NULL) 237 return -ENOMEM; 238 239 evlist__add(evlist, evsel); 240 return 0; 241 } 242 243 int perf_evlist__add_dummy(struct evlist *evlist) 244 { 245 struct perf_event_attr attr = { 246 .type = PERF_TYPE_SOFTWARE, 247 .config = PERF_COUNT_SW_DUMMY, 248 .size = sizeof(attr), /* to capture ABI version */ 249 }; 250 struct evsel *evsel = perf_evsel__new_idx(&attr, evlist->core.nr_entries); 251 252 if (evsel == NULL) 253 return -ENOMEM; 254 255 evlist__add(evlist, evsel); 256 return 0; 257 } 258 259 static int evlist__add_attrs(struct evlist *evlist, 260 struct perf_event_attr *attrs, size_t nr_attrs) 261 { 262 struct evsel *evsel, *n; 263 LIST_HEAD(head); 264 size_t i; 265 266 for (i = 0; i < nr_attrs; i++) { 267 evsel = perf_evsel__new_idx(attrs + i, evlist->core.nr_entries + i); 268 if (evsel == NULL) 269 goto out_delete_partial_list; 270 list_add_tail(&evsel->core.node, &head); 271 } 272 273 perf_evlist__splice_list_tail(evlist, &head); 274 275 return 0; 276 277 out_delete_partial_list: 278 __evlist__for_each_entry_safe(&head, n, evsel) 279 evsel__delete(evsel); 280 return -1; 281 } 282 283 int __perf_evlist__add_default_attrs(struct evlist *evlist, 284 struct perf_event_attr *attrs, size_t nr_attrs) 285 { 286 size_t i; 287 288 for (i = 0; i < nr_attrs; i++) 289 event_attr_init(attrs + i); 290 291 return evlist__add_attrs(evlist, attrs, nr_attrs); 292 } 293 294 struct evsel * 295 perf_evlist__find_tracepoint_by_id(struct evlist *evlist, int id) 296 { 297 struct evsel *evsel; 298 299 evlist__for_each_entry(evlist, evsel) { 300 if (evsel->core.attr.type == PERF_TYPE_TRACEPOINT && 301 (int)evsel->core.attr.config == id) 302 return evsel; 303 } 304 305 return NULL; 306 } 307 308 struct evsel * 309 perf_evlist__find_tracepoint_by_name(struct evlist *evlist, 310 const char *name) 311 { 312 struct evsel *evsel; 313 314 evlist__for_each_entry(evlist, evsel) { 315 if ((evsel->core.attr.type == PERF_TYPE_TRACEPOINT) && 316 (strcmp(evsel->name, name) == 0)) 317 return evsel; 318 } 319 320 return NULL; 321 } 322 323 int perf_evlist__add_newtp(struct evlist *evlist, 324 const char *sys, const char *name, void *handler) 325 { 326 struct evsel *evsel = perf_evsel__newtp(sys, name); 327 328 if (IS_ERR(evsel)) 329 return -1; 330 331 evsel->handler = handler; 332 evlist__add(evlist, evsel); 333 return 0; 334 } 335 336 static int perf_evlist__nr_threads(struct evlist *evlist, 337 struct evsel *evsel) 338 { 339 if (evsel->core.system_wide) 340 return 1; 341 else 342 return perf_thread_map__nr(evlist->core.threads); 343 } 344 345 void evlist__disable(struct evlist *evlist) 346 { 347 struct evsel *pos; 348 349 evlist__for_each_entry(evlist, pos) { 350 if (pos->disabled || !perf_evsel__is_group_leader(pos) || !pos->core.fd) 351 continue; 352 evsel__disable(pos); 353 } 354 355 evlist->enabled = false; 356 } 357 358 void evlist__enable(struct evlist *evlist) 359 { 360 struct evsel *pos; 361 362 evlist__for_each_entry(evlist, pos) { 363 if (!perf_evsel__is_group_leader(pos) || !pos->core.fd) 364 continue; 365 evsel__enable(pos); 366 } 367 368 evlist->enabled = true; 369 } 370 371 void perf_evlist__toggle_enable(struct evlist *evlist) 372 { 373 (evlist->enabled ? evlist__disable : evlist__enable)(evlist); 374 } 375 376 static int perf_evlist__enable_event_cpu(struct evlist *evlist, 377 struct evsel *evsel, int cpu) 378 { 379 int thread; 380 int nr_threads = perf_evlist__nr_threads(evlist, evsel); 381 382 if (!evsel->core.fd) 383 return -EINVAL; 384 385 for (thread = 0; thread < nr_threads; thread++) { 386 int err = ioctl(FD(evsel, cpu, thread), PERF_EVENT_IOC_ENABLE, 0); 387 if (err) 388 return err; 389 } 390 return 0; 391 } 392 393 static int perf_evlist__enable_event_thread(struct evlist *evlist, 394 struct evsel *evsel, 395 int thread) 396 { 397 int cpu; 398 int nr_cpus = perf_cpu_map__nr(evlist->core.cpus); 399 400 if (!evsel->core.fd) 401 return -EINVAL; 402 403 for (cpu = 0; cpu < nr_cpus; cpu++) { 404 int err = ioctl(FD(evsel, cpu, thread), PERF_EVENT_IOC_ENABLE, 0); 405 if (err) 406 return err; 407 } 408 return 0; 409 } 410 411 int perf_evlist__enable_event_idx(struct evlist *evlist, 412 struct evsel *evsel, int idx) 413 { 414 bool per_cpu_mmaps = !perf_cpu_map__empty(evlist->core.cpus); 415 416 if (per_cpu_mmaps) 417 return perf_evlist__enable_event_cpu(evlist, evsel, idx); 418 else 419 return perf_evlist__enable_event_thread(evlist, evsel, idx); 420 } 421 422 int evlist__add_pollfd(struct evlist *evlist, int fd) 423 { 424 return perf_evlist__add_pollfd(&evlist->core, fd, NULL, POLLIN); 425 } 426 427 int evlist__filter_pollfd(struct evlist *evlist, short revents_and_mask) 428 { 429 return perf_evlist__filter_pollfd(&evlist->core, revents_and_mask); 430 } 431 432 int evlist__poll(struct evlist *evlist, int timeout) 433 { 434 return perf_evlist__poll(&evlist->core, timeout); 435 } 436 437 struct perf_sample_id *perf_evlist__id2sid(struct evlist *evlist, u64 id) 438 { 439 struct hlist_head *head; 440 struct perf_sample_id *sid; 441 int hash; 442 443 hash = hash_64(id, PERF_EVLIST__HLIST_BITS); 444 head = &evlist->core.heads[hash]; 445 446 hlist_for_each_entry(sid, head, node) 447 if (sid->id == id) 448 return sid; 449 450 return NULL; 451 } 452 453 struct evsel *perf_evlist__id2evsel(struct evlist *evlist, u64 id) 454 { 455 struct perf_sample_id *sid; 456 457 if (evlist->core.nr_entries == 1 || !id) 458 return evlist__first(evlist); 459 460 sid = perf_evlist__id2sid(evlist, id); 461 if (sid) 462 return container_of(sid->evsel, struct evsel, core); 463 464 if (!perf_evlist__sample_id_all(evlist)) 465 return evlist__first(evlist); 466 467 return NULL; 468 } 469 470 struct evsel *perf_evlist__id2evsel_strict(struct evlist *evlist, 471 u64 id) 472 { 473 struct perf_sample_id *sid; 474 475 if (!id) 476 return NULL; 477 478 sid = perf_evlist__id2sid(evlist, id); 479 if (sid) 480 return container_of(sid->evsel, struct evsel, core); 481 482 return NULL; 483 } 484 485 static int perf_evlist__event2id(struct evlist *evlist, 486 union perf_event *event, u64 *id) 487 { 488 const __u64 *array = event->sample.array; 489 ssize_t n; 490 491 n = (event->header.size - sizeof(event->header)) >> 3; 492 493 if (event->header.type == PERF_RECORD_SAMPLE) { 494 if (evlist->id_pos >= n) 495 return -1; 496 *id = array[evlist->id_pos]; 497 } else { 498 if (evlist->is_pos > n) 499 return -1; 500 n -= evlist->is_pos; 501 *id = array[n]; 502 } 503 return 0; 504 } 505 506 struct evsel *perf_evlist__event2evsel(struct evlist *evlist, 507 union perf_event *event) 508 { 509 struct evsel *first = evlist__first(evlist); 510 struct hlist_head *head; 511 struct perf_sample_id *sid; 512 int hash; 513 u64 id; 514 515 if (evlist->core.nr_entries == 1) 516 return first; 517 518 if (!first->core.attr.sample_id_all && 519 event->header.type != PERF_RECORD_SAMPLE) 520 return first; 521 522 if (perf_evlist__event2id(evlist, event, &id)) 523 return NULL; 524 525 /* Synthesized events have an id of zero */ 526 if (!id) 527 return first; 528 529 hash = hash_64(id, PERF_EVLIST__HLIST_BITS); 530 head = &evlist->core.heads[hash]; 531 532 hlist_for_each_entry(sid, head, node) { 533 if (sid->id == id) 534 return container_of(sid->evsel, struct evsel, core); 535 } 536 return NULL; 537 } 538 539 static int perf_evlist__set_paused(struct evlist *evlist, bool value) 540 { 541 int i; 542 543 if (!evlist->overwrite_mmap) 544 return 0; 545 546 for (i = 0; i < evlist->core.nr_mmaps; i++) { 547 int fd = evlist->overwrite_mmap[i].core.fd; 548 int err; 549 550 if (fd < 0) 551 continue; 552 err = ioctl(fd, PERF_EVENT_IOC_PAUSE_OUTPUT, value ? 1 : 0); 553 if (err) 554 return err; 555 } 556 return 0; 557 } 558 559 static int perf_evlist__pause(struct evlist *evlist) 560 { 561 return perf_evlist__set_paused(evlist, true); 562 } 563 564 static int perf_evlist__resume(struct evlist *evlist) 565 { 566 return perf_evlist__set_paused(evlist, false); 567 } 568 569 static void evlist__munmap_nofree(struct evlist *evlist) 570 { 571 int i; 572 573 if (evlist->mmap) 574 for (i = 0; i < evlist->core.nr_mmaps; i++) 575 perf_mmap__munmap(&evlist->mmap[i].core); 576 577 if (evlist->overwrite_mmap) 578 for (i = 0; i < evlist->core.nr_mmaps; i++) 579 perf_mmap__munmap(&evlist->overwrite_mmap[i].core); 580 } 581 582 void evlist__munmap(struct evlist *evlist) 583 { 584 evlist__munmap_nofree(evlist); 585 zfree(&evlist->mmap); 586 zfree(&evlist->overwrite_mmap); 587 } 588 589 static void perf_mmap__unmap_cb(struct perf_mmap *map) 590 { 591 struct mmap *m = container_of(map, struct mmap, core); 592 593 mmap__munmap(m); 594 } 595 596 static struct mmap *evlist__alloc_mmap(struct evlist *evlist, 597 bool overwrite) 598 { 599 int i; 600 struct mmap *map; 601 602 map = zalloc(evlist->core.nr_mmaps * sizeof(struct mmap)); 603 if (!map) 604 return NULL; 605 606 for (i = 0; i < evlist->core.nr_mmaps; i++) { 607 struct perf_mmap *prev = i ? &map[i - 1].core : NULL; 608 609 /* 610 * When the perf_mmap() call is made we grab one refcount, plus 611 * one extra to let perf_mmap__consume() get the last 612 * events after all real references (perf_mmap__get()) are 613 * dropped. 614 * 615 * Each PERF_EVENT_IOC_SET_OUTPUT points to this mmap and 616 * thus does perf_mmap__get() on it. 617 */ 618 perf_mmap__init(&map[i].core, prev, overwrite, perf_mmap__unmap_cb); 619 } 620 621 return map; 622 } 623 624 static void 625 perf_evlist__mmap_cb_idx(struct perf_evlist *_evlist, 626 struct perf_mmap_param *_mp, 627 int idx, bool per_cpu) 628 { 629 struct evlist *evlist = container_of(_evlist, struct evlist, core); 630 struct mmap_params *mp = container_of(_mp, struct mmap_params, core); 631 632 auxtrace_mmap_params__set_idx(&mp->auxtrace_mp, evlist, idx, per_cpu); 633 } 634 635 static struct perf_mmap* 636 perf_evlist__mmap_cb_get(struct perf_evlist *_evlist, bool overwrite, int idx) 637 { 638 struct evlist *evlist = container_of(_evlist, struct evlist, core); 639 struct mmap *maps; 640 641 maps = overwrite ? evlist->overwrite_mmap : evlist->mmap; 642 643 if (!maps) { 644 maps = evlist__alloc_mmap(evlist, overwrite); 645 if (!maps) 646 return NULL; 647 648 if (overwrite) { 649 evlist->overwrite_mmap = maps; 650 if (evlist->bkw_mmap_state == BKW_MMAP_NOTREADY) 651 perf_evlist__toggle_bkw_mmap(evlist, BKW_MMAP_RUNNING); 652 } else { 653 evlist->mmap = maps; 654 } 655 } 656 657 return &maps[idx].core; 658 } 659 660 static int 661 perf_evlist__mmap_cb_mmap(struct perf_mmap *_map, struct perf_mmap_param *_mp, 662 int output, int cpu) 663 { 664 struct mmap *map = container_of(_map, struct mmap, core); 665 struct mmap_params *mp = container_of(_mp, struct mmap_params, core); 666 667 return mmap__mmap(map, mp, output, cpu); 668 } 669 670 unsigned long perf_event_mlock_kb_in_pages(void) 671 { 672 unsigned long pages; 673 int max; 674 675 if (sysctl__read_int("kernel/perf_event_mlock_kb", &max) < 0) { 676 /* 677 * Pick a once upon a time good value, i.e. things look 678 * strange since we can't read a sysctl value, but lets not 679 * die yet... 680 */ 681 max = 512; 682 } else { 683 max -= (page_size / 1024); 684 } 685 686 pages = (max * 1024) / page_size; 687 if (!is_power_of_2(pages)) 688 pages = rounddown_pow_of_two(pages); 689 690 return pages; 691 } 692 693 size_t evlist__mmap_size(unsigned long pages) 694 { 695 if (pages == UINT_MAX) 696 pages = perf_event_mlock_kb_in_pages(); 697 else if (!is_power_of_2(pages)) 698 return 0; 699 700 return (pages + 1) * page_size; 701 } 702 703 static long parse_pages_arg(const char *str, unsigned long min, 704 unsigned long max) 705 { 706 unsigned long pages, val; 707 static struct parse_tag tags[] = { 708 { .tag = 'B', .mult = 1 }, 709 { .tag = 'K', .mult = 1 << 10 }, 710 { .tag = 'M', .mult = 1 << 20 }, 711 { .tag = 'G', .mult = 1 << 30 }, 712 { .tag = 0 }, 713 }; 714 715 if (str == NULL) 716 return -EINVAL; 717 718 val = parse_tag_value(str, tags); 719 if (val != (unsigned long) -1) { 720 /* we got file size value */ 721 pages = PERF_ALIGN(val, page_size) / page_size; 722 } else { 723 /* we got pages count value */ 724 char *eptr; 725 pages = strtoul(str, &eptr, 10); 726 if (*eptr != '\0') 727 return -EINVAL; 728 } 729 730 if (pages == 0 && min == 0) { 731 /* leave number of pages at 0 */ 732 } else if (!is_power_of_2(pages)) { 733 char buf[100]; 734 735 /* round pages up to next power of 2 */ 736 pages = roundup_pow_of_two(pages); 737 if (!pages) 738 return -EINVAL; 739 740 unit_number__scnprintf(buf, sizeof(buf), pages * page_size); 741 pr_info("rounding mmap pages size to %s (%lu pages)\n", 742 buf, pages); 743 } 744 745 if (pages > max) 746 return -EINVAL; 747 748 return pages; 749 } 750 751 int __perf_evlist__parse_mmap_pages(unsigned int *mmap_pages, const char *str) 752 { 753 unsigned long max = UINT_MAX; 754 long pages; 755 756 if (max > SIZE_MAX / page_size) 757 max = SIZE_MAX / page_size; 758 759 pages = parse_pages_arg(str, 1, max); 760 if (pages < 0) { 761 pr_err("Invalid argument for --mmap_pages/-m\n"); 762 return -1; 763 } 764 765 *mmap_pages = pages; 766 return 0; 767 } 768 769 int perf_evlist__parse_mmap_pages(const struct option *opt, const char *str, 770 int unset __maybe_unused) 771 { 772 return __perf_evlist__parse_mmap_pages(opt->value, str); 773 } 774 775 /** 776 * evlist__mmap_ex - Create mmaps to receive events. 777 * @evlist: list of events 778 * @pages: map length in pages 779 * @overwrite: overwrite older events? 780 * @auxtrace_pages - auxtrace map length in pages 781 * @auxtrace_overwrite - overwrite older auxtrace data? 782 * 783 * If @overwrite is %false the user needs to signal event consumption using 784 * perf_mmap__write_tail(). Using evlist__mmap_read() does this 785 * automatically. 786 * 787 * Similarly, if @auxtrace_overwrite is %false the user needs to signal data 788 * consumption using auxtrace_mmap__write_tail(). 789 * 790 * Return: %0 on success, negative error code otherwise. 791 */ 792 int evlist__mmap_ex(struct evlist *evlist, unsigned int pages, 793 unsigned int auxtrace_pages, 794 bool auxtrace_overwrite, int nr_cblocks, int affinity, int flush, 795 int comp_level) 796 { 797 /* 798 * Delay setting mp.prot: set it before calling perf_mmap__mmap. 799 * Its value is decided by evsel's write_backward. 800 * So &mp should not be passed through const pointer. 801 */ 802 struct mmap_params mp = { 803 .nr_cblocks = nr_cblocks, 804 .affinity = affinity, 805 .flush = flush, 806 .comp_level = comp_level 807 }; 808 struct perf_evlist_mmap_ops ops = { 809 .idx = perf_evlist__mmap_cb_idx, 810 .get = perf_evlist__mmap_cb_get, 811 .mmap = perf_evlist__mmap_cb_mmap, 812 }; 813 814 evlist->core.mmap_len = evlist__mmap_size(pages); 815 pr_debug("mmap size %zuB\n", evlist->core.mmap_len); 816 817 auxtrace_mmap_params__init(&mp.auxtrace_mp, evlist->core.mmap_len, 818 auxtrace_pages, auxtrace_overwrite); 819 820 return perf_evlist__mmap_ops(&evlist->core, &ops, &mp.core); 821 } 822 823 int evlist__mmap(struct evlist *evlist, unsigned int pages) 824 { 825 return evlist__mmap_ex(evlist, pages, 0, false, 0, PERF_AFFINITY_SYS, 1, 0); 826 } 827 828 int perf_evlist__create_maps(struct evlist *evlist, struct target *target) 829 { 830 bool all_threads = (target->per_thread && target->system_wide); 831 struct perf_cpu_map *cpus; 832 struct perf_thread_map *threads; 833 834 /* 835 * If specify '-a' and '--per-thread' to perf record, perf record 836 * will override '--per-thread'. target->per_thread = false and 837 * target->system_wide = true. 838 * 839 * If specify '--per-thread' only to perf record, 840 * target->per_thread = true and target->system_wide = false. 841 * 842 * So target->per_thread && target->system_wide is false. 843 * For perf record, thread_map__new_str doesn't call 844 * thread_map__new_all_cpus. That will keep perf record's 845 * current behavior. 846 * 847 * For perf stat, it allows the case that target->per_thread and 848 * target->system_wide are all true. It means to collect system-wide 849 * per-thread data. thread_map__new_str will call 850 * thread_map__new_all_cpus to enumerate all threads. 851 */ 852 threads = thread_map__new_str(target->pid, target->tid, target->uid, 853 all_threads); 854 855 if (!threads) 856 return -1; 857 858 if (target__uses_dummy_map(target)) 859 cpus = perf_cpu_map__dummy_new(); 860 else 861 cpus = perf_cpu_map__new(target->cpu_list); 862 863 if (!cpus) 864 goto out_delete_threads; 865 866 evlist->core.has_user_cpus = !!target->cpu_list; 867 868 perf_evlist__set_maps(&evlist->core, cpus, threads); 869 870 return 0; 871 872 out_delete_threads: 873 perf_thread_map__put(threads); 874 return -1; 875 } 876 877 void __perf_evlist__set_sample_bit(struct evlist *evlist, 878 enum perf_event_sample_format bit) 879 { 880 struct evsel *evsel; 881 882 evlist__for_each_entry(evlist, evsel) 883 __perf_evsel__set_sample_bit(evsel, bit); 884 } 885 886 void __perf_evlist__reset_sample_bit(struct evlist *evlist, 887 enum perf_event_sample_format bit) 888 { 889 struct evsel *evsel; 890 891 evlist__for_each_entry(evlist, evsel) 892 __perf_evsel__reset_sample_bit(evsel, bit); 893 } 894 895 int perf_evlist__apply_filters(struct evlist *evlist, struct evsel **err_evsel) 896 { 897 struct evsel *evsel; 898 int err = 0; 899 900 evlist__for_each_entry(evlist, evsel) { 901 if (evsel->filter == NULL) 902 continue; 903 904 /* 905 * filters only work for tracepoint event, which doesn't have cpu limit. 906 * So evlist and evsel should always be same. 907 */ 908 err = perf_evsel__apply_filter(&evsel->core, evsel->filter); 909 if (err) { 910 *err_evsel = evsel; 911 break; 912 } 913 } 914 915 return err; 916 } 917 918 int perf_evlist__set_tp_filter(struct evlist *evlist, const char *filter) 919 { 920 struct evsel *evsel; 921 int err = 0; 922 923 if (filter == NULL) 924 return -1; 925 926 evlist__for_each_entry(evlist, evsel) { 927 if (evsel->core.attr.type != PERF_TYPE_TRACEPOINT) 928 continue; 929 930 err = perf_evsel__set_filter(evsel, filter); 931 if (err) 932 break; 933 } 934 935 return err; 936 } 937 938 int perf_evlist__append_tp_filter(struct evlist *evlist, const char *filter) 939 { 940 struct evsel *evsel; 941 int err = 0; 942 943 if (filter == NULL) 944 return -1; 945 946 evlist__for_each_entry(evlist, evsel) { 947 if (evsel->core.attr.type != PERF_TYPE_TRACEPOINT) 948 continue; 949 950 err = perf_evsel__append_tp_filter(evsel, filter); 951 if (err) 952 break; 953 } 954 955 return err; 956 } 957 958 char *asprintf__tp_filter_pids(size_t npids, pid_t *pids) 959 { 960 char *filter; 961 size_t i; 962 963 for (i = 0; i < npids; ++i) { 964 if (i == 0) { 965 if (asprintf(&filter, "common_pid != %d", pids[i]) < 0) 966 return NULL; 967 } else { 968 char *tmp; 969 970 if (asprintf(&tmp, "%s && common_pid != %d", filter, pids[i]) < 0) 971 goto out_free; 972 973 free(filter); 974 filter = tmp; 975 } 976 } 977 978 return filter; 979 out_free: 980 free(filter); 981 return NULL; 982 } 983 984 int perf_evlist__set_tp_filter_pids(struct evlist *evlist, size_t npids, pid_t *pids) 985 { 986 char *filter = asprintf__tp_filter_pids(npids, pids); 987 int ret = perf_evlist__set_tp_filter(evlist, filter); 988 989 free(filter); 990 return ret; 991 } 992 993 int perf_evlist__set_tp_filter_pid(struct evlist *evlist, pid_t pid) 994 { 995 return perf_evlist__set_tp_filter_pids(evlist, 1, &pid); 996 } 997 998 int perf_evlist__append_tp_filter_pids(struct evlist *evlist, size_t npids, pid_t *pids) 999 { 1000 char *filter = asprintf__tp_filter_pids(npids, pids); 1001 int ret = perf_evlist__append_tp_filter(evlist, filter); 1002 1003 free(filter); 1004 return ret; 1005 } 1006 1007 int perf_evlist__append_tp_filter_pid(struct evlist *evlist, pid_t pid) 1008 { 1009 return perf_evlist__append_tp_filter_pids(evlist, 1, &pid); 1010 } 1011 1012 bool perf_evlist__valid_sample_type(struct evlist *evlist) 1013 { 1014 struct evsel *pos; 1015 1016 if (evlist->core.nr_entries == 1) 1017 return true; 1018 1019 if (evlist->id_pos < 0 || evlist->is_pos < 0) 1020 return false; 1021 1022 evlist__for_each_entry(evlist, pos) { 1023 if (pos->id_pos != evlist->id_pos || 1024 pos->is_pos != evlist->is_pos) 1025 return false; 1026 } 1027 1028 return true; 1029 } 1030 1031 u64 __perf_evlist__combined_sample_type(struct evlist *evlist) 1032 { 1033 struct evsel *evsel; 1034 1035 if (evlist->combined_sample_type) 1036 return evlist->combined_sample_type; 1037 1038 evlist__for_each_entry(evlist, evsel) 1039 evlist->combined_sample_type |= evsel->core.attr.sample_type; 1040 1041 return evlist->combined_sample_type; 1042 } 1043 1044 u64 perf_evlist__combined_sample_type(struct evlist *evlist) 1045 { 1046 evlist->combined_sample_type = 0; 1047 return __perf_evlist__combined_sample_type(evlist); 1048 } 1049 1050 u64 perf_evlist__combined_branch_type(struct evlist *evlist) 1051 { 1052 struct evsel *evsel; 1053 u64 branch_type = 0; 1054 1055 evlist__for_each_entry(evlist, evsel) 1056 branch_type |= evsel->core.attr.branch_sample_type; 1057 return branch_type; 1058 } 1059 1060 bool perf_evlist__valid_read_format(struct evlist *evlist) 1061 { 1062 struct evsel *first = evlist__first(evlist), *pos = first; 1063 u64 read_format = first->core.attr.read_format; 1064 u64 sample_type = first->core.attr.sample_type; 1065 1066 evlist__for_each_entry(evlist, pos) { 1067 if (read_format != pos->core.attr.read_format) 1068 return false; 1069 } 1070 1071 /* PERF_SAMPLE_READ imples PERF_FORMAT_ID. */ 1072 if ((sample_type & PERF_SAMPLE_READ) && 1073 !(read_format & PERF_FORMAT_ID)) { 1074 return false; 1075 } 1076 1077 return true; 1078 } 1079 1080 u16 perf_evlist__id_hdr_size(struct evlist *evlist) 1081 { 1082 struct evsel *first = evlist__first(evlist); 1083 struct perf_sample *data; 1084 u64 sample_type; 1085 u16 size = 0; 1086 1087 if (!first->core.attr.sample_id_all) 1088 goto out; 1089 1090 sample_type = first->core.attr.sample_type; 1091 1092 if (sample_type & PERF_SAMPLE_TID) 1093 size += sizeof(data->tid) * 2; 1094 1095 if (sample_type & PERF_SAMPLE_TIME) 1096 size += sizeof(data->time); 1097 1098 if (sample_type & PERF_SAMPLE_ID) 1099 size += sizeof(data->id); 1100 1101 if (sample_type & PERF_SAMPLE_STREAM_ID) 1102 size += sizeof(data->stream_id); 1103 1104 if (sample_type & PERF_SAMPLE_CPU) 1105 size += sizeof(data->cpu) * 2; 1106 1107 if (sample_type & PERF_SAMPLE_IDENTIFIER) 1108 size += sizeof(data->id); 1109 out: 1110 return size; 1111 } 1112 1113 bool perf_evlist__valid_sample_id_all(struct evlist *evlist) 1114 { 1115 struct evsel *first = evlist__first(evlist), *pos = first; 1116 1117 evlist__for_each_entry_continue(evlist, pos) { 1118 if (first->core.attr.sample_id_all != pos->core.attr.sample_id_all) 1119 return false; 1120 } 1121 1122 return true; 1123 } 1124 1125 bool perf_evlist__sample_id_all(struct evlist *evlist) 1126 { 1127 struct evsel *first = evlist__first(evlist); 1128 return first->core.attr.sample_id_all; 1129 } 1130 1131 void perf_evlist__set_selected(struct evlist *evlist, 1132 struct evsel *evsel) 1133 { 1134 evlist->selected = evsel; 1135 } 1136 1137 void evlist__close(struct evlist *evlist) 1138 { 1139 struct evsel *evsel; 1140 1141 evlist__for_each_entry_reverse(evlist, evsel) 1142 evsel__close(evsel); 1143 } 1144 1145 static int perf_evlist__create_syswide_maps(struct evlist *evlist) 1146 { 1147 struct perf_cpu_map *cpus; 1148 struct perf_thread_map *threads; 1149 int err = -ENOMEM; 1150 1151 /* 1152 * Try reading /sys/devices/system/cpu/online to get 1153 * an all cpus map. 1154 * 1155 * FIXME: -ENOMEM is the best we can do here, the cpu_map 1156 * code needs an overhaul to properly forward the 1157 * error, and we may not want to do that fallback to a 1158 * default cpu identity map :-\ 1159 */ 1160 cpus = perf_cpu_map__new(NULL); 1161 if (!cpus) 1162 goto out; 1163 1164 threads = perf_thread_map__new_dummy(); 1165 if (!threads) 1166 goto out_put; 1167 1168 perf_evlist__set_maps(&evlist->core, cpus, threads); 1169 out: 1170 return err; 1171 out_put: 1172 perf_cpu_map__put(cpus); 1173 goto out; 1174 } 1175 1176 int evlist__open(struct evlist *evlist) 1177 { 1178 struct evsel *evsel; 1179 int err; 1180 1181 /* 1182 * Default: one fd per CPU, all threads, aka systemwide 1183 * as sys_perf_event_open(cpu = -1, thread = -1) is EINVAL 1184 */ 1185 if (evlist->core.threads == NULL && evlist->core.cpus == NULL) { 1186 err = perf_evlist__create_syswide_maps(evlist); 1187 if (err < 0) 1188 goto out_err; 1189 } 1190 1191 perf_evlist__update_id_pos(evlist); 1192 1193 evlist__for_each_entry(evlist, evsel) { 1194 err = evsel__open(evsel, evsel->core.cpus, evsel->core.threads); 1195 if (err < 0) 1196 goto out_err; 1197 } 1198 1199 return 0; 1200 out_err: 1201 evlist__close(evlist); 1202 errno = -err; 1203 return err; 1204 } 1205 1206 int perf_evlist__prepare_workload(struct evlist *evlist, struct target *target, 1207 const char *argv[], bool pipe_output, 1208 void (*exec_error)(int signo, siginfo_t *info, void *ucontext)) 1209 { 1210 int child_ready_pipe[2], go_pipe[2]; 1211 char bf; 1212 1213 if (pipe(child_ready_pipe) < 0) { 1214 perror("failed to create 'ready' pipe"); 1215 return -1; 1216 } 1217 1218 if (pipe(go_pipe) < 0) { 1219 perror("failed to create 'go' pipe"); 1220 goto out_close_ready_pipe; 1221 } 1222 1223 evlist->workload.pid = fork(); 1224 if (evlist->workload.pid < 0) { 1225 perror("failed to fork"); 1226 goto out_close_pipes; 1227 } 1228 1229 if (!evlist->workload.pid) { 1230 int ret; 1231 1232 if (pipe_output) 1233 dup2(2, 1); 1234 1235 signal(SIGTERM, SIG_DFL); 1236 1237 close(child_ready_pipe[0]); 1238 close(go_pipe[1]); 1239 fcntl(go_pipe[0], F_SETFD, FD_CLOEXEC); 1240 1241 /* 1242 * Tell the parent we're ready to go 1243 */ 1244 close(child_ready_pipe[1]); 1245 1246 /* 1247 * Wait until the parent tells us to go. 1248 */ 1249 ret = read(go_pipe[0], &bf, 1); 1250 /* 1251 * The parent will ask for the execvp() to be performed by 1252 * writing exactly one byte, in workload.cork_fd, usually via 1253 * perf_evlist__start_workload(). 1254 * 1255 * For cancelling the workload without actually running it, 1256 * the parent will just close workload.cork_fd, without writing 1257 * anything, i.e. read will return zero and we just exit() 1258 * here. 1259 */ 1260 if (ret != 1) { 1261 if (ret == -1) 1262 perror("unable to read pipe"); 1263 exit(ret); 1264 } 1265 1266 execvp(argv[0], (char **)argv); 1267 1268 if (exec_error) { 1269 union sigval val; 1270 1271 val.sival_int = errno; 1272 if (sigqueue(getppid(), SIGUSR1, val)) 1273 perror(argv[0]); 1274 } else 1275 perror(argv[0]); 1276 exit(-1); 1277 } 1278 1279 if (exec_error) { 1280 struct sigaction act = { 1281 .sa_flags = SA_SIGINFO, 1282 .sa_sigaction = exec_error, 1283 }; 1284 sigaction(SIGUSR1, &act, NULL); 1285 } 1286 1287 if (target__none(target)) { 1288 if (evlist->core.threads == NULL) { 1289 fprintf(stderr, "FATAL: evlist->threads need to be set at this point (%s:%d).\n", 1290 __func__, __LINE__); 1291 goto out_close_pipes; 1292 } 1293 perf_thread_map__set_pid(evlist->core.threads, 0, evlist->workload.pid); 1294 } 1295 1296 close(child_ready_pipe[1]); 1297 close(go_pipe[0]); 1298 /* 1299 * wait for child to settle 1300 */ 1301 if (read(child_ready_pipe[0], &bf, 1) == -1) { 1302 perror("unable to read pipe"); 1303 goto out_close_pipes; 1304 } 1305 1306 fcntl(go_pipe[1], F_SETFD, FD_CLOEXEC); 1307 evlist->workload.cork_fd = go_pipe[1]; 1308 close(child_ready_pipe[0]); 1309 return 0; 1310 1311 out_close_pipes: 1312 close(go_pipe[0]); 1313 close(go_pipe[1]); 1314 out_close_ready_pipe: 1315 close(child_ready_pipe[0]); 1316 close(child_ready_pipe[1]); 1317 return -1; 1318 } 1319 1320 int perf_evlist__start_workload(struct evlist *evlist) 1321 { 1322 if (evlist->workload.cork_fd > 0) { 1323 char bf = 0; 1324 int ret; 1325 /* 1326 * Remove the cork, let it rip! 1327 */ 1328 ret = write(evlist->workload.cork_fd, &bf, 1); 1329 if (ret < 0) 1330 perror("unable to write to pipe"); 1331 1332 close(evlist->workload.cork_fd); 1333 return ret; 1334 } 1335 1336 return 0; 1337 } 1338 1339 int perf_evlist__parse_sample(struct evlist *evlist, union perf_event *event, 1340 struct perf_sample *sample) 1341 { 1342 struct evsel *evsel = perf_evlist__event2evsel(evlist, event); 1343 1344 if (!evsel) 1345 return -EFAULT; 1346 return perf_evsel__parse_sample(evsel, event, sample); 1347 } 1348 1349 int perf_evlist__parse_sample_timestamp(struct evlist *evlist, 1350 union perf_event *event, 1351 u64 *timestamp) 1352 { 1353 struct evsel *evsel = perf_evlist__event2evsel(evlist, event); 1354 1355 if (!evsel) 1356 return -EFAULT; 1357 return perf_evsel__parse_sample_timestamp(evsel, event, timestamp); 1358 } 1359 1360 int perf_evlist__strerror_open(struct evlist *evlist, 1361 int err, char *buf, size_t size) 1362 { 1363 int printed, value; 1364 char sbuf[STRERR_BUFSIZE], *emsg = str_error_r(err, sbuf, sizeof(sbuf)); 1365 1366 switch (err) { 1367 case EACCES: 1368 case EPERM: 1369 printed = scnprintf(buf, size, 1370 "Error:\t%s.\n" 1371 "Hint:\tCheck /proc/sys/kernel/perf_event_paranoid setting.", emsg); 1372 1373 value = perf_event_paranoid(); 1374 1375 printed += scnprintf(buf + printed, size - printed, "\nHint:\t"); 1376 1377 if (value >= 2) { 1378 printed += scnprintf(buf + printed, size - printed, 1379 "For your workloads it needs to be <= 1\nHint:\t"); 1380 } 1381 printed += scnprintf(buf + printed, size - printed, 1382 "For system wide tracing it needs to be set to -1.\n"); 1383 1384 printed += scnprintf(buf + printed, size - printed, 1385 "Hint:\tTry: 'sudo sh -c \"echo -1 > /proc/sys/kernel/perf_event_paranoid\"'\n" 1386 "Hint:\tThe current value is %d.", value); 1387 break; 1388 case EINVAL: { 1389 struct evsel *first = evlist__first(evlist); 1390 int max_freq; 1391 1392 if (sysctl__read_int("kernel/perf_event_max_sample_rate", &max_freq) < 0) 1393 goto out_default; 1394 1395 if (first->core.attr.sample_freq < (u64)max_freq) 1396 goto out_default; 1397 1398 printed = scnprintf(buf, size, 1399 "Error:\t%s.\n" 1400 "Hint:\tCheck /proc/sys/kernel/perf_event_max_sample_rate.\n" 1401 "Hint:\tThe current value is %d and %" PRIu64 " is being requested.", 1402 emsg, max_freq, first->core.attr.sample_freq); 1403 break; 1404 } 1405 default: 1406 out_default: 1407 scnprintf(buf, size, "%s", emsg); 1408 break; 1409 } 1410 1411 return 0; 1412 } 1413 1414 int perf_evlist__strerror_mmap(struct evlist *evlist, int err, char *buf, size_t size) 1415 { 1416 char sbuf[STRERR_BUFSIZE], *emsg = str_error_r(err, sbuf, sizeof(sbuf)); 1417 int pages_attempted = evlist->core.mmap_len / 1024, pages_max_per_user, printed = 0; 1418 1419 switch (err) { 1420 case EPERM: 1421 sysctl__read_int("kernel/perf_event_mlock_kb", &pages_max_per_user); 1422 printed += scnprintf(buf + printed, size - printed, 1423 "Error:\t%s.\n" 1424 "Hint:\tCheck /proc/sys/kernel/perf_event_mlock_kb (%d kB) setting.\n" 1425 "Hint:\tTried using %zd kB.\n", 1426 emsg, pages_max_per_user, pages_attempted); 1427 1428 if (pages_attempted >= pages_max_per_user) { 1429 printed += scnprintf(buf + printed, size - printed, 1430 "Hint:\tTry 'sudo sh -c \"echo %d > /proc/sys/kernel/perf_event_mlock_kb\"', or\n", 1431 pages_max_per_user + pages_attempted); 1432 } 1433 1434 printed += scnprintf(buf + printed, size - printed, 1435 "Hint:\tTry using a smaller -m/--mmap-pages value."); 1436 break; 1437 default: 1438 scnprintf(buf, size, "%s", emsg); 1439 break; 1440 } 1441 1442 return 0; 1443 } 1444 1445 void perf_evlist__to_front(struct evlist *evlist, 1446 struct evsel *move_evsel) 1447 { 1448 struct evsel *evsel, *n; 1449 LIST_HEAD(move); 1450 1451 if (move_evsel == evlist__first(evlist)) 1452 return; 1453 1454 evlist__for_each_entry_safe(evlist, n, evsel) { 1455 if (evsel->leader == move_evsel->leader) 1456 list_move_tail(&evsel->core.node, &move); 1457 } 1458 1459 list_splice(&move, &evlist->core.entries); 1460 } 1461 1462 void perf_evlist__set_tracking_event(struct evlist *evlist, 1463 struct evsel *tracking_evsel) 1464 { 1465 struct evsel *evsel; 1466 1467 if (tracking_evsel->tracking) 1468 return; 1469 1470 evlist__for_each_entry(evlist, evsel) { 1471 if (evsel != tracking_evsel) 1472 evsel->tracking = false; 1473 } 1474 1475 tracking_evsel->tracking = true; 1476 } 1477 1478 struct evsel * 1479 perf_evlist__find_evsel_by_str(struct evlist *evlist, 1480 const char *str) 1481 { 1482 struct evsel *evsel; 1483 1484 evlist__for_each_entry(evlist, evsel) { 1485 if (!evsel->name) 1486 continue; 1487 if (strcmp(str, evsel->name) == 0) 1488 return evsel; 1489 } 1490 1491 return NULL; 1492 } 1493 1494 void perf_evlist__toggle_bkw_mmap(struct evlist *evlist, 1495 enum bkw_mmap_state state) 1496 { 1497 enum bkw_mmap_state old_state = evlist->bkw_mmap_state; 1498 enum action { 1499 NONE, 1500 PAUSE, 1501 RESUME, 1502 } action = NONE; 1503 1504 if (!evlist->overwrite_mmap) 1505 return; 1506 1507 switch (old_state) { 1508 case BKW_MMAP_NOTREADY: { 1509 if (state != BKW_MMAP_RUNNING) 1510 goto state_err; 1511 break; 1512 } 1513 case BKW_MMAP_RUNNING: { 1514 if (state != BKW_MMAP_DATA_PENDING) 1515 goto state_err; 1516 action = PAUSE; 1517 break; 1518 } 1519 case BKW_MMAP_DATA_PENDING: { 1520 if (state != BKW_MMAP_EMPTY) 1521 goto state_err; 1522 break; 1523 } 1524 case BKW_MMAP_EMPTY: { 1525 if (state != BKW_MMAP_RUNNING) 1526 goto state_err; 1527 action = RESUME; 1528 break; 1529 } 1530 default: 1531 WARN_ONCE(1, "Shouldn't get there\n"); 1532 } 1533 1534 evlist->bkw_mmap_state = state; 1535 1536 switch (action) { 1537 case PAUSE: 1538 perf_evlist__pause(evlist); 1539 break; 1540 case RESUME: 1541 perf_evlist__resume(evlist); 1542 break; 1543 case NONE: 1544 default: 1545 break; 1546 } 1547 1548 state_err: 1549 return; 1550 } 1551 1552 bool perf_evlist__exclude_kernel(struct evlist *evlist) 1553 { 1554 struct evsel *evsel; 1555 1556 evlist__for_each_entry(evlist, evsel) { 1557 if (!evsel->core.attr.exclude_kernel) 1558 return false; 1559 } 1560 1561 return true; 1562 } 1563 1564 /* 1565 * Events in data file are not collect in groups, but we still want 1566 * the group display. Set the artificial group and set the leader's 1567 * forced_leader flag to notify the display code. 1568 */ 1569 void perf_evlist__force_leader(struct evlist *evlist) 1570 { 1571 if (!evlist->nr_groups) { 1572 struct evsel *leader = evlist__first(evlist); 1573 1574 perf_evlist__set_leader(evlist); 1575 leader->forced_leader = true; 1576 } 1577 } 1578 1579 struct evsel *perf_evlist__reset_weak_group(struct evlist *evsel_list, 1580 struct evsel *evsel) 1581 { 1582 struct evsel *c2, *leader; 1583 bool is_open = true; 1584 1585 leader = evsel->leader; 1586 pr_debug("Weak group for %s/%d failed\n", 1587 leader->name, leader->core.nr_members); 1588 1589 /* 1590 * for_each_group_member doesn't work here because it doesn't 1591 * include the first entry. 1592 */ 1593 evlist__for_each_entry(evsel_list, c2) { 1594 if (c2 == evsel) 1595 is_open = false; 1596 if (c2->leader == leader) { 1597 if (is_open) 1598 perf_evsel__close(&c2->core); 1599 c2->leader = c2; 1600 c2->core.nr_members = 0; 1601 } 1602 } 1603 return leader; 1604 } 1605 1606 int perf_evlist__add_sb_event(struct evlist **evlist, 1607 struct perf_event_attr *attr, 1608 perf_evsel__sb_cb_t cb, 1609 void *data) 1610 { 1611 struct evsel *evsel; 1612 bool new_evlist = (*evlist) == NULL; 1613 1614 if (*evlist == NULL) 1615 *evlist = evlist__new(); 1616 if (*evlist == NULL) 1617 return -1; 1618 1619 if (!attr->sample_id_all) { 1620 pr_warning("enabling sample_id_all for all side band events\n"); 1621 attr->sample_id_all = 1; 1622 } 1623 1624 evsel = perf_evsel__new_idx(attr, (*evlist)->core.nr_entries); 1625 if (!evsel) 1626 goto out_err; 1627 1628 evsel->side_band.cb = cb; 1629 evsel->side_band.data = data; 1630 evlist__add(*evlist, evsel); 1631 return 0; 1632 1633 out_err: 1634 if (new_evlist) { 1635 evlist__delete(*evlist); 1636 *evlist = NULL; 1637 } 1638 return -1; 1639 } 1640 1641 static void *perf_evlist__poll_thread(void *arg) 1642 { 1643 struct evlist *evlist = arg; 1644 bool draining = false; 1645 int i, done = 0; 1646 /* 1647 * In order to read symbols from other namespaces perf to needs to call 1648 * setns(2). This isn't permitted if the struct_fs has multiple users. 1649 * unshare(2) the fs so that we may continue to setns into namespaces 1650 * that we're observing when, for instance, reading the build-ids at 1651 * the end of a 'perf record' session. 1652 */ 1653 unshare(CLONE_FS); 1654 1655 while (!done) { 1656 bool got_data = false; 1657 1658 if (evlist->thread.done) 1659 draining = true; 1660 1661 if (!draining) 1662 evlist__poll(evlist, 1000); 1663 1664 for (i = 0; i < evlist->core.nr_mmaps; i++) { 1665 struct mmap *map = &evlist->mmap[i]; 1666 union perf_event *event; 1667 1668 if (perf_mmap__read_init(&map->core)) 1669 continue; 1670 while ((event = perf_mmap__read_event(&map->core)) != NULL) { 1671 struct evsel *evsel = perf_evlist__event2evsel(evlist, event); 1672 1673 if (evsel && evsel->side_band.cb) 1674 evsel->side_band.cb(event, evsel->side_band.data); 1675 else 1676 pr_warning("cannot locate proper evsel for the side band event\n"); 1677 1678 perf_mmap__consume(&map->core); 1679 got_data = true; 1680 } 1681 perf_mmap__read_done(&map->core); 1682 } 1683 1684 if (draining && !got_data) 1685 break; 1686 } 1687 return NULL; 1688 } 1689 1690 int perf_evlist__start_sb_thread(struct evlist *evlist, 1691 struct target *target) 1692 { 1693 struct evsel *counter; 1694 1695 if (!evlist) 1696 return 0; 1697 1698 if (perf_evlist__create_maps(evlist, target)) 1699 goto out_delete_evlist; 1700 1701 evlist__for_each_entry(evlist, counter) { 1702 if (evsel__open(counter, evlist->core.cpus, 1703 evlist->core.threads) < 0) 1704 goto out_delete_evlist; 1705 } 1706 1707 if (evlist__mmap(evlist, UINT_MAX)) 1708 goto out_delete_evlist; 1709 1710 evlist__for_each_entry(evlist, counter) { 1711 if (evsel__enable(counter)) 1712 goto out_delete_evlist; 1713 } 1714 1715 evlist->thread.done = 0; 1716 if (pthread_create(&evlist->thread.th, NULL, perf_evlist__poll_thread, evlist)) 1717 goto out_delete_evlist; 1718 1719 return 0; 1720 1721 out_delete_evlist: 1722 evlist__delete(evlist); 1723 evlist = NULL; 1724 return -1; 1725 } 1726 1727 void perf_evlist__stop_sb_thread(struct evlist *evlist) 1728 { 1729 if (!evlist) 1730 return; 1731 evlist->thread.done = 1; 1732 pthread_join(evlist->thread.th, NULL); 1733 evlist__delete(evlist); 1734 } 1735