1 #include <linux/list.h> 2 #include <linux/compiler.h> 3 #include <sys/types.h> 4 #include <unistd.h> 5 #include <stdio.h> 6 #include <stdbool.h> 7 #include <stdarg.h> 8 #include <dirent.h> 9 #include <api/fs/fs.h> 10 #include <locale.h> 11 #include "util.h" 12 #include "pmu.h" 13 #include "parse-events.h" 14 #include "cpumap.h" 15 16 struct perf_pmu_format { 17 char *name; 18 int value; 19 DECLARE_BITMAP(bits, PERF_PMU_FORMAT_BITS); 20 struct list_head list; 21 }; 22 23 #define EVENT_SOURCE_DEVICE_PATH "/bus/event_source/devices/" 24 25 int perf_pmu_parse(struct list_head *list, char *name); 26 extern FILE *perf_pmu_in; 27 28 static LIST_HEAD(pmus); 29 30 /* 31 * Parse & process all the sysfs attributes located under 32 * the directory specified in 'dir' parameter. 33 */ 34 int perf_pmu__format_parse(char *dir, struct list_head *head) 35 { 36 struct dirent *evt_ent; 37 DIR *format_dir; 38 int ret = 0; 39 40 format_dir = opendir(dir); 41 if (!format_dir) 42 return -EINVAL; 43 44 while (!ret && (evt_ent = readdir(format_dir))) { 45 char path[PATH_MAX]; 46 char *name = evt_ent->d_name; 47 FILE *file; 48 49 if (!strcmp(name, ".") || !strcmp(name, "..")) 50 continue; 51 52 snprintf(path, PATH_MAX, "%s/%s", dir, name); 53 54 ret = -EINVAL; 55 file = fopen(path, "r"); 56 if (!file) 57 break; 58 59 perf_pmu_in = file; 60 ret = perf_pmu_parse(head, name); 61 fclose(file); 62 } 63 64 closedir(format_dir); 65 return ret; 66 } 67 68 /* 69 * Reading/parsing the default pmu format definition, which should be 70 * located at: 71 * /sys/bus/event_source/devices/<dev>/format as sysfs group attributes. 72 */ 73 static int pmu_format(const char *name, struct list_head *format) 74 { 75 struct stat st; 76 char path[PATH_MAX]; 77 const char *sysfs = sysfs__mountpoint(); 78 79 if (!sysfs) 80 return -1; 81 82 snprintf(path, PATH_MAX, 83 "%s" EVENT_SOURCE_DEVICE_PATH "%s/format", sysfs, name); 84 85 if (stat(path, &st) < 0) 86 return 0; /* no error if format does not exist */ 87 88 if (perf_pmu__format_parse(path, format)) 89 return -1; 90 91 return 0; 92 } 93 94 static int perf_pmu__parse_scale(struct perf_pmu_alias *alias, char *dir, char *name) 95 { 96 struct stat st; 97 ssize_t sret; 98 char scale[128]; 99 int fd, ret = -1; 100 char path[PATH_MAX]; 101 char *lc; 102 103 snprintf(path, PATH_MAX, "%s/%s.scale", dir, name); 104 105 fd = open(path, O_RDONLY); 106 if (fd == -1) 107 return -1; 108 109 if (fstat(fd, &st) < 0) 110 goto error; 111 112 sret = read(fd, scale, sizeof(scale)-1); 113 if (sret < 0) 114 goto error; 115 116 if (scale[sret - 1] == '\n') 117 scale[sret - 1] = '\0'; 118 else 119 scale[sret] = '\0'; 120 121 /* 122 * save current locale 123 */ 124 lc = setlocale(LC_NUMERIC, NULL); 125 126 /* 127 * The lc string may be allocated in static storage, 128 * so get a dynamic copy to make it survive setlocale 129 * call below. 130 */ 131 lc = strdup(lc); 132 if (!lc) { 133 ret = -ENOMEM; 134 goto error; 135 } 136 137 /* 138 * force to C locale to ensure kernel 139 * scale string is converted correctly. 140 * kernel uses default C locale. 141 */ 142 setlocale(LC_NUMERIC, "C"); 143 144 alias->scale = strtod(scale, NULL); 145 146 /* restore locale */ 147 setlocale(LC_NUMERIC, lc); 148 149 free(lc); 150 151 ret = 0; 152 error: 153 close(fd); 154 return ret; 155 } 156 157 static int perf_pmu__parse_unit(struct perf_pmu_alias *alias, char *dir, char *name) 158 { 159 char path[PATH_MAX]; 160 ssize_t sret; 161 int fd; 162 163 snprintf(path, PATH_MAX, "%s/%s.unit", dir, name); 164 165 fd = open(path, O_RDONLY); 166 if (fd == -1) 167 return -1; 168 169 sret = read(fd, alias->unit, UNIT_MAX_LEN); 170 if (sret < 0) 171 goto error; 172 173 close(fd); 174 175 if (alias->unit[sret - 1] == '\n') 176 alias->unit[sret - 1] = '\0'; 177 else 178 alias->unit[sret] = '\0'; 179 180 return 0; 181 error: 182 close(fd); 183 alias->unit[0] = '\0'; 184 return -1; 185 } 186 187 static int 188 perf_pmu__parse_per_pkg(struct perf_pmu_alias *alias, char *dir, char *name) 189 { 190 char path[PATH_MAX]; 191 int fd; 192 193 snprintf(path, PATH_MAX, "%s/%s.per-pkg", dir, name); 194 195 fd = open(path, O_RDONLY); 196 if (fd == -1) 197 return -1; 198 199 close(fd); 200 201 alias->per_pkg = true; 202 return 0; 203 } 204 205 static int perf_pmu__parse_snapshot(struct perf_pmu_alias *alias, 206 char *dir, char *name) 207 { 208 char path[PATH_MAX]; 209 int fd; 210 211 snprintf(path, PATH_MAX, "%s/%s.snapshot", dir, name); 212 213 fd = open(path, O_RDONLY); 214 if (fd == -1) 215 return -1; 216 217 alias->snapshot = true; 218 close(fd); 219 return 0; 220 } 221 222 static int __perf_pmu__new_alias(struct list_head *list, char *dir, char *name, 223 char *desc __maybe_unused, char *val) 224 { 225 struct perf_pmu_alias *alias; 226 int ret; 227 228 alias = malloc(sizeof(*alias)); 229 if (!alias) 230 return -ENOMEM; 231 232 INIT_LIST_HEAD(&alias->terms); 233 alias->scale = 1.0; 234 alias->unit[0] = '\0'; 235 alias->per_pkg = false; 236 alias->snapshot = false; 237 238 ret = parse_events_terms(&alias->terms, val); 239 if (ret) { 240 pr_err("Cannot parse alias %s: %d\n", val, ret); 241 free(alias); 242 return ret; 243 } 244 245 alias->name = strdup(name); 246 if (dir) { 247 /* 248 * load unit name and scale if available 249 */ 250 perf_pmu__parse_unit(alias, dir, name); 251 perf_pmu__parse_scale(alias, dir, name); 252 perf_pmu__parse_per_pkg(alias, dir, name); 253 perf_pmu__parse_snapshot(alias, dir, name); 254 } 255 256 list_add_tail(&alias->list, list); 257 258 return 0; 259 } 260 261 static int perf_pmu__new_alias(struct list_head *list, char *dir, char *name, FILE *file) 262 { 263 char buf[256]; 264 int ret; 265 266 ret = fread(buf, 1, sizeof(buf), file); 267 if (ret == 0) 268 return -EINVAL; 269 270 buf[ret] = 0; 271 272 return __perf_pmu__new_alias(list, dir, name, NULL, buf); 273 } 274 275 static inline bool pmu_alias_info_file(char *name) 276 { 277 size_t len; 278 279 len = strlen(name); 280 if (len > 5 && !strcmp(name + len - 5, ".unit")) 281 return true; 282 if (len > 6 && !strcmp(name + len - 6, ".scale")) 283 return true; 284 if (len > 8 && !strcmp(name + len - 8, ".per-pkg")) 285 return true; 286 if (len > 9 && !strcmp(name + len - 9, ".snapshot")) 287 return true; 288 289 return false; 290 } 291 292 /* 293 * Process all the sysfs attributes located under the directory 294 * specified in 'dir' parameter. 295 */ 296 static int pmu_aliases_parse(char *dir, struct list_head *head) 297 { 298 struct dirent *evt_ent; 299 DIR *event_dir; 300 301 event_dir = opendir(dir); 302 if (!event_dir) 303 return -EINVAL; 304 305 while ((evt_ent = readdir(event_dir))) { 306 char path[PATH_MAX]; 307 char *name = evt_ent->d_name; 308 FILE *file; 309 310 if (!strcmp(name, ".") || !strcmp(name, "..")) 311 continue; 312 313 /* 314 * skip info files parsed in perf_pmu__new_alias() 315 */ 316 if (pmu_alias_info_file(name)) 317 continue; 318 319 snprintf(path, PATH_MAX, "%s/%s", dir, name); 320 321 file = fopen(path, "r"); 322 if (!file) { 323 pr_debug("Cannot open %s\n", path); 324 continue; 325 } 326 327 if (perf_pmu__new_alias(head, dir, name, file) < 0) 328 pr_debug("Cannot set up %s\n", name); 329 fclose(file); 330 } 331 332 closedir(event_dir); 333 return 0; 334 } 335 336 /* 337 * Reading the pmu event aliases definition, which should be located at: 338 * /sys/bus/event_source/devices/<dev>/events as sysfs group attributes. 339 */ 340 static int pmu_aliases(const char *name, struct list_head *head) 341 { 342 struct stat st; 343 char path[PATH_MAX]; 344 const char *sysfs = sysfs__mountpoint(); 345 346 if (!sysfs) 347 return -1; 348 349 snprintf(path, PATH_MAX, 350 "%s/bus/event_source/devices/%s/events", sysfs, name); 351 352 if (stat(path, &st) < 0) 353 return 0; /* no error if 'events' does not exist */ 354 355 if (pmu_aliases_parse(path, head)) 356 return -1; 357 358 return 0; 359 } 360 361 static int pmu_alias_terms(struct perf_pmu_alias *alias, 362 struct list_head *terms) 363 { 364 struct parse_events_term *term, *cloned; 365 LIST_HEAD(list); 366 int ret; 367 368 list_for_each_entry(term, &alias->terms, list) { 369 ret = parse_events_term__clone(&cloned, term); 370 if (ret) { 371 parse_events_terms__purge(&list); 372 return ret; 373 } 374 list_add_tail(&cloned->list, &list); 375 } 376 list_splice(&list, terms); 377 return 0; 378 } 379 380 /* 381 * Reading/parsing the default pmu type value, which should be 382 * located at: 383 * /sys/bus/event_source/devices/<dev>/type as sysfs attribute. 384 */ 385 static int pmu_type(const char *name, __u32 *type) 386 { 387 struct stat st; 388 char path[PATH_MAX]; 389 FILE *file; 390 int ret = 0; 391 const char *sysfs = sysfs__mountpoint(); 392 393 if (!sysfs) 394 return -1; 395 396 snprintf(path, PATH_MAX, 397 "%s" EVENT_SOURCE_DEVICE_PATH "%s/type", sysfs, name); 398 399 if (stat(path, &st) < 0) 400 return -1; 401 402 file = fopen(path, "r"); 403 if (!file) 404 return -EINVAL; 405 406 if (1 != fscanf(file, "%u", type)) 407 ret = -1; 408 409 fclose(file); 410 return ret; 411 } 412 413 /* Add all pmus in sysfs to pmu list: */ 414 static void pmu_read_sysfs(void) 415 { 416 char path[PATH_MAX]; 417 DIR *dir; 418 struct dirent *dent; 419 const char *sysfs = sysfs__mountpoint(); 420 421 if (!sysfs) 422 return; 423 424 snprintf(path, PATH_MAX, 425 "%s" EVENT_SOURCE_DEVICE_PATH, sysfs); 426 427 dir = opendir(path); 428 if (!dir) 429 return; 430 431 while ((dent = readdir(dir))) { 432 if (!strcmp(dent->d_name, ".") || !strcmp(dent->d_name, "..")) 433 continue; 434 /* add to static LIST_HEAD(pmus): */ 435 perf_pmu__find(dent->d_name); 436 } 437 438 closedir(dir); 439 } 440 441 static struct cpu_map *pmu_cpumask(const char *name) 442 { 443 struct stat st; 444 char path[PATH_MAX]; 445 FILE *file; 446 struct cpu_map *cpus; 447 const char *sysfs = sysfs__mountpoint(); 448 449 if (!sysfs) 450 return NULL; 451 452 snprintf(path, PATH_MAX, 453 "%s/bus/event_source/devices/%s/cpumask", sysfs, name); 454 455 if (stat(path, &st) < 0) 456 return NULL; 457 458 file = fopen(path, "r"); 459 if (!file) 460 return NULL; 461 462 cpus = cpu_map__read(file); 463 fclose(file); 464 return cpus; 465 } 466 467 struct perf_event_attr * __weak 468 perf_pmu__get_default_config(struct perf_pmu *pmu __maybe_unused) 469 { 470 return NULL; 471 } 472 473 static struct perf_pmu *pmu_lookup(const char *name) 474 { 475 struct perf_pmu *pmu; 476 LIST_HEAD(format); 477 LIST_HEAD(aliases); 478 __u32 type; 479 480 /* 481 * The pmu data we store & need consists of the pmu 482 * type value and format definitions. Load both right 483 * now. 484 */ 485 if (pmu_format(name, &format)) 486 return NULL; 487 488 if (pmu_aliases(name, &aliases)) 489 return NULL; 490 491 if (pmu_type(name, &type)) 492 return NULL; 493 494 pmu = zalloc(sizeof(*pmu)); 495 if (!pmu) 496 return NULL; 497 498 pmu->cpus = pmu_cpumask(name); 499 500 INIT_LIST_HEAD(&pmu->format); 501 INIT_LIST_HEAD(&pmu->aliases); 502 list_splice(&format, &pmu->format); 503 list_splice(&aliases, &pmu->aliases); 504 pmu->name = strdup(name); 505 pmu->type = type; 506 list_add_tail(&pmu->list, &pmus); 507 508 pmu->default_config = perf_pmu__get_default_config(pmu); 509 510 return pmu; 511 } 512 513 static struct perf_pmu *pmu_find(const char *name) 514 { 515 struct perf_pmu *pmu; 516 517 list_for_each_entry(pmu, &pmus, list) 518 if (!strcmp(pmu->name, name)) 519 return pmu; 520 521 return NULL; 522 } 523 524 struct perf_pmu *perf_pmu__scan(struct perf_pmu *pmu) 525 { 526 /* 527 * pmu iterator: If pmu is NULL, we start at the begin, 528 * otherwise return the next pmu. Returns NULL on end. 529 */ 530 if (!pmu) { 531 pmu_read_sysfs(); 532 pmu = list_prepare_entry(pmu, &pmus, list); 533 } 534 list_for_each_entry_continue(pmu, &pmus, list) 535 return pmu; 536 return NULL; 537 } 538 539 struct perf_pmu *perf_pmu__find(const char *name) 540 { 541 struct perf_pmu *pmu; 542 543 /* 544 * Once PMU is loaded it stays in the list, 545 * so we keep us from multiple reading/parsing 546 * the pmu format definitions. 547 */ 548 pmu = pmu_find(name); 549 if (pmu) 550 return pmu; 551 552 return pmu_lookup(name); 553 } 554 555 static struct perf_pmu_format * 556 pmu_find_format(struct list_head *formats, const char *name) 557 { 558 struct perf_pmu_format *format; 559 560 list_for_each_entry(format, formats, list) 561 if (!strcmp(format->name, name)) 562 return format; 563 564 return NULL; 565 } 566 567 __u64 perf_pmu__format_bits(struct list_head *formats, const char *name) 568 { 569 struct perf_pmu_format *format = pmu_find_format(formats, name); 570 __u64 bits = 0; 571 int fbit; 572 573 if (!format) 574 return 0; 575 576 for_each_set_bit(fbit, format->bits, PERF_PMU_FORMAT_BITS) 577 bits |= 1ULL << fbit; 578 579 return bits; 580 } 581 582 /* 583 * Sets value based on the format definition (format parameter) 584 * and unformated value (value parameter). 585 */ 586 static void pmu_format_value(unsigned long *format, __u64 value, __u64 *v, 587 bool zero) 588 { 589 unsigned long fbit, vbit; 590 591 for (fbit = 0, vbit = 0; fbit < PERF_PMU_FORMAT_BITS; fbit++) { 592 593 if (!test_bit(fbit, format)) 594 continue; 595 596 if (value & (1llu << vbit++)) 597 *v |= (1llu << fbit); 598 else if (zero) 599 *v &= ~(1llu << fbit); 600 } 601 } 602 603 static __u64 pmu_format_max_value(const unsigned long *format) 604 { 605 __u64 w = 0; 606 int fbit; 607 608 for_each_set_bit(fbit, format, PERF_PMU_FORMAT_BITS) 609 w |= (1ULL << fbit); 610 611 return w; 612 } 613 614 /* 615 * Term is a string term, and might be a param-term. Try to look up it's value 616 * in the remaining terms. 617 * - We have a term like "base-or-format-term=param-term", 618 * - We need to find the value supplied for "param-term" (with param-term named 619 * in a config string) later on in the term list. 620 */ 621 static int pmu_resolve_param_term(struct parse_events_term *term, 622 struct list_head *head_terms, 623 __u64 *value) 624 { 625 struct parse_events_term *t; 626 627 list_for_each_entry(t, head_terms, list) { 628 if (t->type_val == PARSE_EVENTS__TERM_TYPE_NUM) { 629 if (!strcmp(t->config, term->config)) { 630 t->used = true; 631 *value = t->val.num; 632 return 0; 633 } 634 } 635 } 636 637 if (verbose) 638 printf("Required parameter '%s' not specified\n", term->config); 639 640 return -1; 641 } 642 643 static char *pmu_formats_string(struct list_head *formats) 644 { 645 struct perf_pmu_format *format; 646 char *str = NULL; 647 struct strbuf buf = STRBUF_INIT; 648 unsigned i = 0; 649 650 if (!formats) 651 return NULL; 652 653 /* sysfs exported terms */ 654 list_for_each_entry(format, formats, list) 655 if (strbuf_addf(&buf, i++ ? ",%s" : "%s", format->name) < 0) 656 goto error; 657 658 str = strbuf_detach(&buf, NULL); 659 error: 660 strbuf_release(&buf); 661 662 return str; 663 } 664 665 /* 666 * Setup one of config[12] attr members based on the 667 * user input data - term parameter. 668 */ 669 static int pmu_config_term(struct list_head *formats, 670 struct perf_event_attr *attr, 671 struct parse_events_term *term, 672 struct list_head *head_terms, 673 bool zero, struct parse_events_error *err) 674 { 675 struct perf_pmu_format *format; 676 __u64 *vp; 677 __u64 val, max_val; 678 679 /* 680 * If this is a parameter we've already used for parameterized-eval, 681 * skip it in normal eval. 682 */ 683 if (term->used) 684 return 0; 685 686 /* 687 * Hardcoded terms should be already in, so nothing 688 * to be done for them. 689 */ 690 if (parse_events__is_hardcoded_term(term)) 691 return 0; 692 693 format = pmu_find_format(formats, term->config); 694 if (!format) { 695 if (verbose) 696 printf("Invalid event/parameter '%s'\n", term->config); 697 if (err) { 698 char *pmu_term = pmu_formats_string(formats); 699 700 err->idx = term->err_term; 701 err->str = strdup("unknown term"); 702 err->help = parse_events_formats_error_string(pmu_term); 703 free(pmu_term); 704 } 705 return -EINVAL; 706 } 707 708 switch (format->value) { 709 case PERF_PMU_FORMAT_VALUE_CONFIG: 710 vp = &attr->config; 711 break; 712 case PERF_PMU_FORMAT_VALUE_CONFIG1: 713 vp = &attr->config1; 714 break; 715 case PERF_PMU_FORMAT_VALUE_CONFIG2: 716 vp = &attr->config2; 717 break; 718 default: 719 return -EINVAL; 720 } 721 722 /* 723 * Either directly use a numeric term, or try to translate string terms 724 * using event parameters. 725 */ 726 if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM) 727 val = term->val.num; 728 else if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) { 729 if (strcmp(term->val.str, "?")) { 730 if (verbose) { 731 pr_info("Invalid sysfs entry %s=%s\n", 732 term->config, term->val.str); 733 } 734 if (err) { 735 err->idx = term->err_val; 736 err->str = strdup("expected numeric value"); 737 } 738 return -EINVAL; 739 } 740 741 if (pmu_resolve_param_term(term, head_terms, &val)) 742 return -EINVAL; 743 } else 744 return -EINVAL; 745 746 max_val = pmu_format_max_value(format->bits); 747 if (val > max_val) { 748 if (err) { 749 err->idx = term->err_val; 750 if (asprintf(&err->str, 751 "value too big for format, maximum is %llu", 752 (unsigned long long)max_val) < 0) 753 err->str = strdup("value too big for format"); 754 return -EINVAL; 755 } 756 /* 757 * Assume we don't care if !err, in which case the value will be 758 * silently truncated. 759 */ 760 } 761 762 pmu_format_value(format->bits, val, vp, zero); 763 return 0; 764 } 765 766 int perf_pmu__config_terms(struct list_head *formats, 767 struct perf_event_attr *attr, 768 struct list_head *head_terms, 769 bool zero, struct parse_events_error *err) 770 { 771 struct parse_events_term *term; 772 773 list_for_each_entry(term, head_terms, list) { 774 if (pmu_config_term(formats, attr, term, head_terms, 775 zero, err)) 776 return -EINVAL; 777 } 778 779 return 0; 780 } 781 782 /* 783 * Configures event's 'attr' parameter based on the: 784 * 1) users input - specified in terms parameter 785 * 2) pmu format definitions - specified by pmu parameter 786 */ 787 int perf_pmu__config(struct perf_pmu *pmu, struct perf_event_attr *attr, 788 struct list_head *head_terms, 789 struct parse_events_error *err) 790 { 791 bool zero = !!pmu->default_config; 792 793 attr->type = pmu->type; 794 return perf_pmu__config_terms(&pmu->format, attr, head_terms, 795 zero, err); 796 } 797 798 static struct perf_pmu_alias *pmu_find_alias(struct perf_pmu *pmu, 799 struct parse_events_term *term) 800 { 801 struct perf_pmu_alias *alias; 802 char *name; 803 804 if (parse_events__is_hardcoded_term(term)) 805 return NULL; 806 807 if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM) { 808 if (term->val.num != 1) 809 return NULL; 810 if (pmu_find_format(&pmu->format, term->config)) 811 return NULL; 812 name = term->config; 813 } else if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) { 814 if (strcasecmp(term->config, "event")) 815 return NULL; 816 name = term->val.str; 817 } else { 818 return NULL; 819 } 820 821 list_for_each_entry(alias, &pmu->aliases, list) { 822 if (!strcasecmp(alias->name, name)) 823 return alias; 824 } 825 return NULL; 826 } 827 828 829 static int check_info_data(struct perf_pmu_alias *alias, 830 struct perf_pmu_info *info) 831 { 832 /* 833 * Only one term in event definition can 834 * define unit, scale and snapshot, fail 835 * if there's more than one. 836 */ 837 if ((info->unit && alias->unit) || 838 (info->scale && alias->scale) || 839 (info->snapshot && alias->snapshot)) 840 return -EINVAL; 841 842 if (alias->unit) 843 info->unit = alias->unit; 844 845 if (alias->scale) 846 info->scale = alias->scale; 847 848 if (alias->snapshot) 849 info->snapshot = alias->snapshot; 850 851 return 0; 852 } 853 854 /* 855 * Find alias in the terms list and replace it with the terms 856 * defined for the alias 857 */ 858 int perf_pmu__check_alias(struct perf_pmu *pmu, struct list_head *head_terms, 859 struct perf_pmu_info *info) 860 { 861 struct parse_events_term *term, *h; 862 struct perf_pmu_alias *alias; 863 int ret; 864 865 info->per_pkg = false; 866 867 /* 868 * Mark unit and scale as not set 869 * (different from default values, see below) 870 */ 871 info->unit = NULL; 872 info->scale = 0.0; 873 info->snapshot = false; 874 875 list_for_each_entry_safe(term, h, head_terms, list) { 876 alias = pmu_find_alias(pmu, term); 877 if (!alias) 878 continue; 879 ret = pmu_alias_terms(alias, &term->list); 880 if (ret) 881 return ret; 882 883 ret = check_info_data(alias, info); 884 if (ret) 885 return ret; 886 887 if (alias->per_pkg) 888 info->per_pkg = true; 889 890 list_del(&term->list); 891 free(term); 892 } 893 894 /* 895 * if no unit or scale foundin aliases, then 896 * set defaults as for evsel 897 * unit cannot left to NULL 898 */ 899 if (info->unit == NULL) 900 info->unit = ""; 901 902 if (info->scale == 0.0) 903 info->scale = 1.0; 904 905 return 0; 906 } 907 908 int perf_pmu__new_format(struct list_head *list, char *name, 909 int config, unsigned long *bits) 910 { 911 struct perf_pmu_format *format; 912 913 format = zalloc(sizeof(*format)); 914 if (!format) 915 return -ENOMEM; 916 917 format->name = strdup(name); 918 format->value = config; 919 memcpy(format->bits, bits, sizeof(format->bits)); 920 921 list_add_tail(&format->list, list); 922 return 0; 923 } 924 925 void perf_pmu__set_format(unsigned long *bits, long from, long to) 926 { 927 long b; 928 929 if (!to) 930 to = from; 931 932 memset(bits, 0, BITS_TO_BYTES(PERF_PMU_FORMAT_BITS)); 933 for (b = from; b <= to; b++) 934 set_bit(b, bits); 935 } 936 937 static int sub_non_neg(int a, int b) 938 { 939 if (b > a) 940 return 0; 941 return a - b; 942 } 943 944 static char *format_alias(char *buf, int len, struct perf_pmu *pmu, 945 struct perf_pmu_alias *alias) 946 { 947 struct parse_events_term *term; 948 int used = snprintf(buf, len, "%s/%s", pmu->name, alias->name); 949 950 list_for_each_entry(term, &alias->terms, list) { 951 if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) 952 used += snprintf(buf + used, sub_non_neg(len, used), 953 ",%s=%s", term->config, 954 term->val.str); 955 } 956 957 if (sub_non_neg(len, used) > 0) { 958 buf[used] = '/'; 959 used++; 960 } 961 if (sub_non_neg(len, used) > 0) { 962 buf[used] = '\0'; 963 used++; 964 } else 965 buf[len - 1] = '\0'; 966 967 return buf; 968 } 969 970 static char *format_alias_or(char *buf, int len, struct perf_pmu *pmu, 971 struct perf_pmu_alias *alias) 972 { 973 snprintf(buf, len, "%s OR %s/%s/", alias->name, pmu->name, alias->name); 974 return buf; 975 } 976 977 static int cmp_string(const void *a, const void *b) 978 { 979 const char * const *as = a; 980 const char * const *bs = b; 981 return strcmp(*as, *bs); 982 } 983 984 void print_pmu_events(const char *event_glob, bool name_only) 985 { 986 struct perf_pmu *pmu; 987 struct perf_pmu_alias *alias; 988 char buf[1024]; 989 int printed = 0; 990 int len, j; 991 char **aliases; 992 993 pmu = NULL; 994 len = 0; 995 while ((pmu = perf_pmu__scan(pmu)) != NULL) { 996 list_for_each_entry(alias, &pmu->aliases, list) 997 len++; 998 if (pmu->selectable) 999 len++; 1000 } 1001 aliases = zalloc(sizeof(char *) * len); 1002 if (!aliases) 1003 goto out_enomem; 1004 pmu = NULL; 1005 j = 0; 1006 while ((pmu = perf_pmu__scan(pmu)) != NULL) { 1007 list_for_each_entry(alias, &pmu->aliases, list) { 1008 char *name = format_alias(buf, sizeof(buf), pmu, alias); 1009 bool is_cpu = !strcmp(pmu->name, "cpu"); 1010 1011 if (event_glob != NULL && 1012 !(strglobmatch(name, event_glob) || 1013 (!is_cpu && strglobmatch(alias->name, 1014 event_glob)))) 1015 continue; 1016 1017 if (is_cpu && !name_only) 1018 name = format_alias_or(buf, sizeof(buf), pmu, alias); 1019 1020 aliases[j] = strdup(name); 1021 if (aliases[j] == NULL) 1022 goto out_enomem; 1023 j++; 1024 } 1025 if (pmu->selectable && 1026 (event_glob == NULL || strglobmatch(pmu->name, event_glob))) { 1027 char *s; 1028 if (asprintf(&s, "%s//", pmu->name) < 0) 1029 goto out_enomem; 1030 aliases[j] = s; 1031 j++; 1032 } 1033 } 1034 len = j; 1035 qsort(aliases, len, sizeof(char *), cmp_string); 1036 for (j = 0; j < len; j++) { 1037 if (name_only) { 1038 printf("%s ", aliases[j]); 1039 continue; 1040 } 1041 printf(" %-50s [Kernel PMU event]\n", aliases[j]); 1042 printed++; 1043 } 1044 if (printed && pager_in_use()) 1045 printf("\n"); 1046 out_free: 1047 for (j = 0; j < len; j++) 1048 zfree(&aliases[j]); 1049 zfree(&aliases); 1050 return; 1051 1052 out_enomem: 1053 printf("FATAL: not enough memory to print PMU events\n"); 1054 if (aliases) 1055 goto out_free; 1056 } 1057 1058 bool pmu_have_event(const char *pname, const char *name) 1059 { 1060 struct perf_pmu *pmu; 1061 struct perf_pmu_alias *alias; 1062 1063 pmu = NULL; 1064 while ((pmu = perf_pmu__scan(pmu)) != NULL) { 1065 if (strcmp(pname, pmu->name)) 1066 continue; 1067 list_for_each_entry(alias, &pmu->aliases, list) 1068 if (!strcmp(alias->name, name)) 1069 return true; 1070 } 1071 return false; 1072 } 1073 1074 static FILE *perf_pmu__open_file(struct perf_pmu *pmu, const char *name) 1075 { 1076 struct stat st; 1077 char path[PATH_MAX]; 1078 const char *sysfs; 1079 1080 sysfs = sysfs__mountpoint(); 1081 if (!sysfs) 1082 return NULL; 1083 1084 snprintf(path, PATH_MAX, 1085 "%s" EVENT_SOURCE_DEVICE_PATH "%s/%s", sysfs, pmu->name, name); 1086 1087 if (stat(path, &st) < 0) 1088 return NULL; 1089 1090 return fopen(path, "r"); 1091 } 1092 1093 int perf_pmu__scan_file(struct perf_pmu *pmu, const char *name, const char *fmt, 1094 ...) 1095 { 1096 va_list args; 1097 FILE *file; 1098 int ret = EOF; 1099 1100 va_start(args, fmt); 1101 file = perf_pmu__open_file(pmu, name); 1102 if (file) { 1103 ret = vfscanf(file, fmt, args); 1104 fclose(file); 1105 } 1106 va_end(args); 1107 return ret; 1108 } 1109