1 // SPDX-License-Identifier: GPL-2.0 2 #include <linux/list.h> 3 #include <linux/compiler.h> 4 #include <linux/string.h> 5 #include <linux/zalloc.h> 6 #include <linux/ctype.h> 7 #include <sys/types.h> 8 #include <fcntl.h> 9 #include <sys/stat.h> 10 #include <unistd.h> 11 #include <stdio.h> 12 #include <stdbool.h> 13 #include <dirent.h> 14 #include <api/fs/fs.h> 15 #include <api/io.h> 16 #include <api/io_dir.h> 17 #include <locale.h> 18 #include <fnmatch.h> 19 #include <math.h> 20 #include "debug.h" 21 #include "evsel.h" 22 #include "pmu.h" 23 #include "drm_pmu.h" 24 #include "hwmon_pmu.h" 25 #include "pmus.h" 26 #include "tool_pmu.h" 27 #include <util/pmu-bison.h> 28 #include <util/pmu-flex.h> 29 #include "parse-events.h" 30 #include "print-events.h" 31 #include "hashmap.h" 32 #include "header.h" 33 #include "string2.h" 34 #include "strbuf.h" 35 #include "fncache.h" 36 #include "util/evsel_config.h" 37 #include <regex.h> 38 39 #define UNIT_MAX_LEN 31 /* max length for event unit name */ 40 41 enum event_source { 42 /* An event loaded from /sys/bus/event_source/devices/<pmu>/events. */ 43 EVENT_SRC_SYSFS, 44 /* An event loaded from a CPUID matched json file. */ 45 EVENT_SRC_CPU_JSON, 46 /* 47 * An event loaded from a /sys/bus/event_source/devices/<pmu>/identifier matched json 48 * file. 49 */ 50 EVENT_SRC_SYS_JSON, 51 }; 52 53 /** 54 * struct perf_pmu_alias - An event either read from sysfs or builtin in 55 * pmu-events.c, created by parsing the pmu-events json files. 56 */ 57 struct perf_pmu_alias { 58 /** @name: Name of the event like "mem-loads". */ 59 char *name; 60 /** @desc: Optional short description of the event. */ 61 char *desc; 62 /** @long_desc: Optional long description. */ 63 char *long_desc; 64 /** 65 * @topic: Optional topic such as cache or pipeline, particularly for 66 * json events. 67 */ 68 char *topic; 69 /** @terms: Owned list of the original parsed parameters. */ 70 struct parse_events_terms terms; 71 /** 72 * @pmu_name: The name copied from the json struct pmu_event. This can 73 * differ from the PMU name as it won't have suffixes. 74 */ 75 char *pmu_name; 76 /** @unit: Units for the event, such as bytes or cache lines. */ 77 char unit[UNIT_MAX_LEN+1]; 78 /** @scale: Value to scale read counter values by. */ 79 double scale; 80 /** @retirement_latency_mean: Value to be given for unsampled retirement latency mean. */ 81 double retirement_latency_mean; 82 /** @retirement_latency_min: Value to be given for unsampled retirement latency min. */ 83 double retirement_latency_min; 84 /** @retirement_latency_max: Value to be given for unsampled retirement latency max. */ 85 double retirement_latency_max; 86 /** 87 * @per_pkg: Does the file 88 * <sysfs>/bus/event_source/devices/<pmu_name>/events/<name>.per-pkg or 89 * equivalent json value exist and have the value 1. 90 */ 91 bool per_pkg; 92 /** 93 * @snapshot: Does the file 94 * <sysfs>/bus/event_source/devices/<pmu_name>/events/<name>.snapshot 95 * exist and have the value 1. 96 */ 97 bool snapshot; 98 /** 99 * @deprecated: Is the event hidden and so not shown in perf list by 100 * default. 101 */ 102 bool deprecated; 103 /** @from_sysfs: Was the alias from sysfs or a json event? */ 104 bool from_sysfs; 105 /** @info_loaded: Have the scale, unit and other values been read from disk? */ 106 bool info_loaded; 107 }; 108 109 /** 110 * struct perf_pmu_format - Values from a format file read from 111 * <sysfs>/devices/cpu/format/ held in struct perf_pmu. 112 * 113 * For example, the contents of <sysfs>/devices/cpu/format/event may be 114 * "config:0-7" and will be represented here as name="event", 115 * value=PERF_PMU_FORMAT_VALUE_CONFIG and bits 0 to 7 will be set. 116 */ 117 struct perf_pmu_format { 118 /** @list: Element on list within struct perf_pmu. */ 119 struct list_head list; 120 /** @bits: Which config bits are set by this format value. */ 121 DECLARE_BITMAP(bits, PERF_PMU_FORMAT_BITS); 122 /** @name: The modifier/file name. */ 123 char *name; 124 /** 125 * @value : Which config value the format relates to. Supported values 126 * are from PERF_PMU_FORMAT_VALUE_CONFIG to 127 * PERF_PMU_FORMAT_VALUE_CONFIG_END. 128 */ 129 u16 value; 130 /** @loaded: Has the contents been loaded/parsed. */ 131 bool loaded; 132 }; 133 134 static int pmu_aliases_parse(struct perf_pmu *pmu); 135 136 static struct perf_pmu_format *perf_pmu__new_format(struct list_head *list, char *name) 137 { 138 struct perf_pmu_format *format; 139 140 format = zalloc(sizeof(*format)); 141 if (!format) 142 return NULL; 143 144 format->name = strdup(name); 145 if (!format->name) { 146 free(format); 147 return NULL; 148 } 149 list_add_tail(&format->list, list); 150 return format; 151 } 152 153 /* Called at the end of parsing a format. */ 154 void perf_pmu_format__set_value(void *vformat, int config, unsigned long *bits) 155 { 156 struct perf_pmu_format *format = vformat; 157 158 format->value = config; 159 memcpy(format->bits, bits, sizeof(format->bits)); 160 } 161 162 static void __perf_pmu_format__load(struct perf_pmu_format *format, FILE *file) 163 { 164 void *scanner; 165 int ret; 166 167 ret = perf_pmu_lex_init(&scanner); 168 if (ret) 169 return; 170 171 perf_pmu_set_in(file, scanner); 172 ret = perf_pmu_parse(format, scanner); 173 perf_pmu_lex_destroy(scanner); 174 format->loaded = true; 175 } 176 177 static void perf_pmu_format__load(const struct perf_pmu *pmu, struct perf_pmu_format *format) 178 { 179 char path[PATH_MAX]; 180 FILE *file = NULL; 181 182 if (format->loaded) 183 return; 184 185 if (!perf_pmu__pathname_scnprintf(path, sizeof(path), pmu->name, "format")) 186 return; 187 188 assert(strlen(path) + strlen(format->name) + 2 < sizeof(path)); 189 strcat(path, "/"); 190 strcat(path, format->name); 191 192 file = fopen(path, "r"); 193 if (!file) 194 return; 195 __perf_pmu_format__load(format, file); 196 fclose(file); 197 } 198 199 /* 200 * Parse & process all the sysfs attributes located under 201 * the directory specified in 'dir' parameter. 202 */ 203 static int perf_pmu__format_parse(struct perf_pmu *pmu, int dirfd, bool eager_load) 204 { 205 struct io_dirent64 *evt_ent; 206 struct io_dir format_dir; 207 int ret = 0; 208 209 io_dir__init(&format_dir, dirfd); 210 211 while ((evt_ent = io_dir__readdir(&format_dir)) != NULL) { 212 struct perf_pmu_format *format; 213 char *name = evt_ent->d_name; 214 215 if (io_dir__is_dir(&format_dir, evt_ent)) 216 continue; 217 218 format = perf_pmu__new_format(&pmu->format, name); 219 if (!format) { 220 ret = -ENOMEM; 221 break; 222 } 223 224 if (eager_load) { 225 FILE *file; 226 int fd = openat(dirfd, name, O_RDONLY); 227 228 if (fd < 0) { 229 ret = -errno; 230 break; 231 } 232 file = fdopen(fd, "r"); 233 if (!file) { 234 close(fd); 235 break; 236 } 237 __perf_pmu_format__load(format, file); 238 fclose(file); 239 } 240 } 241 242 close(format_dir.dirfd); 243 return ret; 244 } 245 246 /* 247 * Reading/parsing the default pmu format definition, which should be 248 * located at: 249 * /sys/bus/event_source/devices/<dev>/format as sysfs group attributes. 250 */ 251 static int pmu_format(struct perf_pmu *pmu, int dirfd, const char *name, bool eager_load) 252 { 253 int fd; 254 255 fd = perf_pmu__pathname_fd(dirfd, name, "format", O_DIRECTORY); 256 if (fd < 0) 257 return 0; 258 259 /* it'll close the fd */ 260 if (perf_pmu__format_parse(pmu, fd, eager_load)) 261 return -1; 262 263 return 0; 264 } 265 266 static int parse_double(const char *scale, char **end, double *sval) 267 { 268 char *lc; 269 int ret = 0; 270 271 /* 272 * save current locale 273 */ 274 lc = setlocale(LC_NUMERIC, NULL); 275 276 /* 277 * The lc string may be allocated in static storage, 278 * so get a dynamic copy to make it survive setlocale 279 * call below. 280 */ 281 lc = strdup(lc); 282 if (!lc) { 283 ret = -ENOMEM; 284 goto out; 285 } 286 287 /* 288 * force to C locale to ensure kernel 289 * scale string is converted correctly. 290 * kernel uses default C locale. 291 */ 292 setlocale(LC_NUMERIC, "C"); 293 294 *sval = strtod(scale, end); 295 296 out: 297 /* restore locale */ 298 setlocale(LC_NUMERIC, lc); 299 free(lc); 300 return ret; 301 } 302 303 int perf_pmu__convert_scale(const char *scale, char **end, double *sval) 304 { 305 return parse_double(scale, end, sval); 306 } 307 308 static int perf_pmu__parse_scale(struct perf_pmu *pmu, struct perf_pmu_alias *alias) 309 { 310 struct stat st; 311 ssize_t sret; 312 size_t len; 313 char scale[128]; 314 int fd, ret = -1; 315 char path[PATH_MAX]; 316 317 len = perf_pmu__event_source_devices_scnprintf(path, sizeof(path)); 318 if (!len) 319 return 0; 320 scnprintf(path + len, sizeof(path) - len, "%s/events/%s.scale", pmu->name, alias->name); 321 322 fd = open(path, O_RDONLY); 323 if (fd == -1) 324 return -1; 325 326 if (fstat(fd, &st) < 0) 327 goto error; 328 329 sret = read(fd, scale, sizeof(scale)-1); 330 if (sret < 0) 331 goto error; 332 333 if (scale[sret - 1] == '\n') 334 scale[sret - 1] = '\0'; 335 else 336 scale[sret] = '\0'; 337 338 ret = perf_pmu__convert_scale(scale, NULL, &alias->scale); 339 error: 340 close(fd); 341 return ret; 342 } 343 344 static int perf_pmu__parse_unit(struct perf_pmu *pmu, struct perf_pmu_alias *alias) 345 { 346 char path[PATH_MAX]; 347 size_t len; 348 ssize_t sret; 349 int fd; 350 351 352 len = perf_pmu__event_source_devices_scnprintf(path, sizeof(path)); 353 if (!len) 354 return 0; 355 scnprintf(path + len, sizeof(path) - len, "%s/events/%s.unit", pmu->name, alias->name); 356 357 fd = open(path, O_RDONLY); 358 if (fd == -1) 359 return -1; 360 361 sret = read(fd, alias->unit, UNIT_MAX_LEN); 362 if (sret < 0) 363 goto error; 364 365 close(fd); 366 367 if (alias->unit[sret - 1] == '\n') 368 alias->unit[sret - 1] = '\0'; 369 else 370 alias->unit[sret] = '\0'; 371 372 return 0; 373 error: 374 close(fd); 375 alias->unit[0] = '\0'; 376 return -1; 377 } 378 379 static bool perf_pmu__parse_event_source_bool(const char *pmu_name, const char *event_name, 380 const char *suffix) 381 { 382 char path[PATH_MAX]; 383 size_t len; 384 int fd; 385 386 len = perf_pmu__event_source_devices_scnprintf(path, sizeof(path)); 387 if (!len) 388 return false; 389 390 scnprintf(path + len, sizeof(path) - len, "%s/events/%s.%s", pmu_name, event_name, suffix); 391 392 fd = open(path, O_RDONLY); 393 if (fd == -1) 394 return false; 395 396 #ifndef NDEBUG 397 { 398 char buf[8]; 399 400 len = read(fd, buf, sizeof(buf)); 401 assert(len == 1 || len == 2); 402 assert(buf[0] == '1'); 403 } 404 #endif 405 406 close(fd); 407 return true; 408 } 409 410 static void perf_pmu__parse_per_pkg(struct perf_pmu *pmu, struct perf_pmu_alias *alias) 411 { 412 alias->per_pkg = perf_pmu__parse_event_source_bool(pmu->name, alias->name, "per-pkg"); 413 } 414 415 static void perf_pmu__parse_snapshot(struct perf_pmu *pmu, struct perf_pmu_alias *alias) 416 { 417 alias->snapshot = perf_pmu__parse_event_source_bool(pmu->name, alias->name, "snapshot"); 418 } 419 420 /* Delete an alias entry. */ 421 static void perf_pmu_free_alias(struct perf_pmu_alias *alias) 422 { 423 if (!alias) 424 return; 425 426 zfree(&alias->name); 427 zfree(&alias->desc); 428 zfree(&alias->long_desc); 429 zfree(&alias->topic); 430 zfree(&alias->pmu_name); 431 parse_events_terms__exit(&alias->terms); 432 free(alias); 433 } 434 435 static void perf_pmu__del_aliases(struct perf_pmu *pmu) 436 { 437 struct hashmap_entry *entry; 438 size_t bkt; 439 440 if (!pmu->aliases) 441 return; 442 443 hashmap__for_each_entry(pmu->aliases, entry, bkt) 444 perf_pmu_free_alias(entry->pvalue); 445 446 hashmap__free(pmu->aliases); 447 pmu->aliases = NULL; 448 } 449 450 static struct perf_pmu_alias *perf_pmu__find_alias(struct perf_pmu *pmu, 451 const char *name, 452 bool load) 453 { 454 struct perf_pmu_alias *alias; 455 bool has_sysfs_event; 456 char event_file_name[FILENAME_MAX + 8]; 457 458 if (hashmap__find(pmu->aliases, name, &alias)) 459 return alias; 460 461 if (!load || pmu->sysfs_aliases_loaded) 462 return NULL; 463 464 /* 465 * Test if alias/event 'name' exists in the PMU's sysfs/events 466 * directory. If not skip parsing the sysfs aliases. Sysfs event 467 * name must be all lower or all upper case. 468 */ 469 scnprintf(event_file_name, sizeof(event_file_name), "events/%s", name); 470 for (size_t i = 7, n = 7 + strlen(name); i < n; i++) 471 event_file_name[i] = tolower(event_file_name[i]); 472 473 has_sysfs_event = perf_pmu__file_exists(pmu, event_file_name); 474 if (!has_sysfs_event) { 475 for (size_t i = 7, n = 7 + strlen(name); i < n; i++) 476 event_file_name[i] = toupper(event_file_name[i]); 477 478 has_sysfs_event = perf_pmu__file_exists(pmu, event_file_name); 479 } 480 if (has_sysfs_event) { 481 pmu_aliases_parse(pmu); 482 if (hashmap__find(pmu->aliases, name, &alias)) 483 return alias; 484 } 485 486 return NULL; 487 } 488 489 static bool assign_str(const char *name, const char *field, char **old_str, 490 const char *new_str) 491 { 492 if (!*old_str && new_str) { 493 *old_str = strdup(new_str); 494 return true; 495 } 496 497 if (!new_str || !strcasecmp(*old_str, new_str)) 498 return false; /* Nothing to update. */ 499 500 pr_debug("alias %s differs in field '%s' ('%s' != '%s')\n", 501 name, field, *old_str, new_str); 502 zfree(old_str); 503 *old_str = strdup(new_str); 504 return true; 505 } 506 507 static void read_alias_info(struct perf_pmu *pmu, struct perf_pmu_alias *alias) 508 { 509 if (!alias->from_sysfs || alias->info_loaded) 510 return; 511 512 /* 513 * load unit name and scale if available 514 */ 515 perf_pmu__parse_unit(pmu, alias); 516 perf_pmu__parse_scale(pmu, alias); 517 perf_pmu__parse_per_pkg(pmu, alias); 518 perf_pmu__parse_snapshot(pmu, alias); 519 } 520 521 struct update_alias_data { 522 struct perf_pmu *pmu; 523 struct perf_pmu_alias *alias; 524 }; 525 526 static int update_alias(const struct pmu_event *pe, 527 const struct pmu_events_table *table __maybe_unused, 528 void *vdata) 529 { 530 struct update_alias_data *data = vdata; 531 int ret = 0; 532 533 read_alias_info(data->pmu, data->alias); 534 assign_str(pe->name, "desc", &data->alias->desc, pe->desc); 535 assign_str(pe->name, "long_desc", &data->alias->long_desc, pe->long_desc); 536 assign_str(pe->name, "topic", &data->alias->topic, pe->topic); 537 data->alias->per_pkg = pe->perpkg; 538 if (pe->event) { 539 parse_events_terms__exit(&data->alias->terms); 540 ret = parse_events_terms(&data->alias->terms, pe->event, /*input=*/NULL); 541 } 542 if (!ret && pe->unit) { 543 char *unit; 544 545 ret = perf_pmu__convert_scale(pe->unit, &unit, &data->alias->scale); 546 if (!ret) 547 snprintf(data->alias->unit, sizeof(data->alias->unit), "%s", unit); 548 } 549 if (!ret && pe->retirement_latency_mean) { 550 ret = parse_double(pe->retirement_latency_mean, NULL, 551 &data->alias->retirement_latency_mean); 552 } 553 if (!ret && pe->retirement_latency_min) { 554 ret = parse_double(pe->retirement_latency_min, NULL, 555 &data->alias->retirement_latency_min); 556 } 557 if (!ret && pe->retirement_latency_max) { 558 ret = parse_double(pe->retirement_latency_max, NULL, 559 &data->alias->retirement_latency_max); 560 } 561 return ret; 562 } 563 564 static int perf_pmu__new_alias(struct perf_pmu *pmu, const char *name, 565 const char *desc, const char *val, FILE *val_fd, 566 const struct pmu_event *pe, enum event_source src) 567 { 568 struct perf_pmu_alias *alias, *old_alias; 569 int ret = 0; 570 const char *long_desc = NULL, *topic = NULL, *unit = NULL, *pmu_name = NULL; 571 bool deprecated = false, perpkg = false; 572 573 if (perf_pmu__find_alias(pmu, name, /*load=*/ false)) { 574 /* Alias was already created/loaded. */ 575 return 0; 576 } 577 578 if (pe) { 579 long_desc = pe->long_desc; 580 topic = pe->topic; 581 unit = pe->unit; 582 perpkg = pe->perpkg; 583 deprecated = pe->deprecated; 584 if (pe->pmu && strcmp(pe->pmu, "default_core")) 585 pmu_name = pe->pmu; 586 } 587 588 alias = zalloc(sizeof(*alias)); 589 if (!alias) 590 return -ENOMEM; 591 592 parse_events_terms__init(&alias->terms); 593 alias->scale = 1.0; 594 alias->unit[0] = '\0'; 595 alias->per_pkg = perpkg; 596 alias->snapshot = false; 597 alias->deprecated = deprecated; 598 alias->retirement_latency_mean = 0.0; 599 alias->retirement_latency_min = 0.0; 600 alias->retirement_latency_max = 0.0; 601 602 if (!ret && pe && pe->retirement_latency_mean) { 603 ret = parse_double(pe->retirement_latency_mean, NULL, 604 &alias->retirement_latency_mean); 605 } 606 if (!ret && pe && pe->retirement_latency_min) { 607 ret = parse_double(pe->retirement_latency_min, NULL, 608 &alias->retirement_latency_min); 609 } 610 if (!ret && pe && pe->retirement_latency_max) { 611 ret = parse_double(pe->retirement_latency_max, NULL, 612 &alias->retirement_latency_max); 613 } 614 if (ret) 615 return ret; 616 617 ret = parse_events_terms(&alias->terms, val, val_fd); 618 if (ret) { 619 pr_err("Cannot parse alias %s: %d\n", val, ret); 620 free(alias); 621 return ret; 622 } 623 624 alias->name = strdup(name); 625 alias->desc = desc ? strdup(desc) : NULL; 626 alias->long_desc = long_desc ? strdup(long_desc) : 627 desc ? strdup(desc) : NULL; 628 alias->topic = topic ? strdup(topic) : NULL; 629 alias->pmu_name = pmu_name ? strdup(pmu_name) : NULL; 630 if (unit) { 631 if (perf_pmu__convert_scale(unit, (char **)&unit, &alias->scale) < 0) { 632 perf_pmu_free_alias(alias); 633 return -1; 634 } 635 snprintf(alias->unit, sizeof(alias->unit), "%s", unit); 636 } 637 switch (src) { 638 default: 639 case EVENT_SRC_SYSFS: 640 alias->from_sysfs = true; 641 if (pmu->events_table) { 642 /* Update an event from sysfs with json data. */ 643 struct update_alias_data data = { 644 .pmu = pmu, 645 .alias = alias, 646 }; 647 if (pmu_events_table__find_event(pmu->events_table, pmu, name, 648 update_alias, &data) == 0) 649 pmu->cpu_common_json_aliases++; 650 } 651 pmu->sysfs_aliases++; 652 break; 653 case EVENT_SRC_CPU_JSON: 654 pmu->cpu_json_aliases++; 655 break; 656 case EVENT_SRC_SYS_JSON: 657 pmu->sys_json_aliases++; 658 break; 659 660 } 661 hashmap__set(pmu->aliases, alias->name, alias, /*old_key=*/ NULL, &old_alias); 662 perf_pmu_free_alias(old_alias); 663 return 0; 664 } 665 666 static inline bool pmu_alias_info_file(const char *name) 667 { 668 size_t len; 669 670 len = strlen(name); 671 if (len > 5 && !strcmp(name + len - 5, ".unit")) 672 return true; 673 if (len > 6 && !strcmp(name + len - 6, ".scale")) 674 return true; 675 if (len > 8 && !strcmp(name + len - 8, ".per-pkg")) 676 return true; 677 if (len > 9 && !strcmp(name + len - 9, ".snapshot")) 678 return true; 679 680 return false; 681 } 682 683 /* 684 * Reading the pmu event aliases definition, which should be located at: 685 * /sys/bus/event_source/devices/<dev>/events as sysfs group attributes. 686 */ 687 static int __pmu_aliases_parse(struct perf_pmu *pmu, int events_dir_fd) 688 { 689 struct io_dirent64 *evt_ent; 690 struct io_dir event_dir; 691 692 io_dir__init(&event_dir, events_dir_fd); 693 694 while ((evt_ent = io_dir__readdir(&event_dir))) { 695 char *name = evt_ent->d_name; 696 int fd; 697 FILE *file; 698 699 if (!strcmp(name, ".") || !strcmp(name, "..")) 700 continue; 701 702 /* 703 * skip info files parsed in perf_pmu__new_alias() 704 */ 705 if (pmu_alias_info_file(name)) 706 continue; 707 708 fd = openat(events_dir_fd, name, O_RDONLY); 709 if (fd == -1) { 710 pr_debug("Cannot open %s\n", name); 711 continue; 712 } 713 file = fdopen(fd, "r"); 714 if (!file) { 715 close(fd); 716 continue; 717 } 718 719 if (perf_pmu__new_alias(pmu, name, /*desc=*/ NULL, 720 /*val=*/ NULL, file, /*pe=*/ NULL, 721 EVENT_SRC_SYSFS) < 0) 722 pr_debug("Cannot set up %s\n", name); 723 fclose(file); 724 } 725 726 pmu->sysfs_aliases_loaded = true; 727 return 0; 728 } 729 730 static int pmu_aliases_parse(struct perf_pmu *pmu) 731 { 732 char path[PATH_MAX]; 733 size_t len; 734 int events_dir_fd, ret; 735 736 if (pmu->sysfs_aliases_loaded) 737 return 0; 738 739 len = perf_pmu__event_source_devices_scnprintf(path, sizeof(path)); 740 if (!len) 741 return 0; 742 scnprintf(path + len, sizeof(path) - len, "%s/events", pmu->name); 743 744 events_dir_fd = open(path, O_DIRECTORY); 745 if (events_dir_fd == -1) { 746 pmu->sysfs_aliases_loaded = true; 747 return 0; 748 } 749 ret = __pmu_aliases_parse(pmu, events_dir_fd); 750 close(events_dir_fd); 751 return ret; 752 } 753 754 static int pmu_aliases_parse_eager(struct perf_pmu *pmu, int sysfs_fd) 755 { 756 char path[FILENAME_MAX + 7]; 757 int ret, events_dir_fd; 758 759 scnprintf(path, sizeof(path), "%s/events", pmu->name); 760 events_dir_fd = openat(sysfs_fd, path, O_DIRECTORY, 0); 761 if (events_dir_fd == -1) { 762 pmu->sysfs_aliases_loaded = true; 763 return 0; 764 } 765 ret = __pmu_aliases_parse(pmu, events_dir_fd); 766 close(events_dir_fd); 767 return ret; 768 } 769 770 static int pmu_alias_terms(struct perf_pmu_alias *alias, int err_loc, struct list_head *terms) 771 { 772 struct parse_events_term *term, *cloned; 773 struct parse_events_terms clone_terms; 774 775 parse_events_terms__init(&clone_terms); 776 list_for_each_entry(term, &alias->terms.terms, list) { 777 int ret = parse_events_term__clone(&cloned, term); 778 779 if (ret) { 780 parse_events_terms__exit(&clone_terms); 781 return ret; 782 } 783 /* 784 * Weak terms don't override command line options, 785 * which we don't want for implicit terms in aliases. 786 */ 787 cloned->weak = true; 788 cloned->err_term = cloned->err_val = err_loc; 789 list_add_tail(&cloned->list, &clone_terms.terms); 790 } 791 list_splice_init(&clone_terms.terms, terms); 792 parse_events_terms__exit(&clone_terms); 793 return 0; 794 } 795 796 /* 797 * Uncore PMUs have a "cpumask" file under sysfs. CPU PMUs (e.g. on arm/arm64) 798 * may have a "cpus" file. 799 */ 800 static struct perf_cpu_map *pmu_cpumask(int dirfd, const char *pmu_name, bool is_core) 801 { 802 const char *templates[] = { 803 "cpumask", 804 "cpus", 805 NULL 806 }; 807 const char **template; 808 809 for (template = templates; *template; template++) { 810 struct io io; 811 char buf[128]; 812 char *cpumask = NULL; 813 size_t cpumask_len; 814 ssize_t ret; 815 struct perf_cpu_map *cpus; 816 817 io.fd = perf_pmu__pathname_fd(dirfd, pmu_name, *template, O_RDONLY); 818 if (io.fd < 0) 819 continue; 820 821 io__init(&io, io.fd, buf, sizeof(buf)); 822 ret = io__getline(&io, &cpumask, &cpumask_len); 823 close(io.fd); 824 if (ret < 0) 825 continue; 826 827 cpus = perf_cpu_map__new(cpumask); 828 free(cpumask); 829 if (cpus) 830 return cpus; 831 } 832 833 /* Nothing found, for core PMUs assume this means all CPUs. */ 834 return is_core ? cpu_map__online() : NULL; 835 } 836 837 static bool pmu_is_uncore(int dirfd, const char *name) 838 { 839 int fd; 840 841 fd = perf_pmu__pathname_fd(dirfd, name, "cpumask", O_PATH); 842 if (fd < 0) 843 return false; 844 845 close(fd); 846 return true; 847 } 848 849 static char *pmu_id(const char *name) 850 { 851 char path[PATH_MAX], *str; 852 size_t len; 853 854 perf_pmu__pathname_scnprintf(path, sizeof(path), name, "identifier"); 855 856 if (filename__read_str(path, &str, &len) < 0) 857 return NULL; 858 859 str[len - 1] = 0; /* remove line feed */ 860 861 return str; 862 } 863 864 /** 865 * is_sysfs_pmu_core() - PMU CORE devices have different name other than cpu in 866 * sysfs on some platforms like ARM or Intel hybrid. Looking for 867 * possible the cpus file in sysfs files to identify whether this is a 868 * core device. 869 * @name: The PMU name such as "cpu_atom". 870 */ 871 static int is_sysfs_pmu_core(const char *name) 872 { 873 char path[PATH_MAX]; 874 875 if (!perf_pmu__pathname_scnprintf(path, sizeof(path), name, "cpus")) 876 return 0; 877 return file_available(path); 878 } 879 880 /** 881 * Return the length of the PMU name not including the suffix for uncore PMUs. 882 * 883 * We want to deduplicate many similar uncore PMUs by stripping their suffixes, 884 * but there are never going to be too many core PMUs and the suffixes might be 885 * interesting. "arm_cortex_a53" vs "arm_cortex_a57" or "cpum_cf" for example. 886 * 887 * @skip_duplicate_pmus: False in verbose mode so all uncore PMUs are visible 888 */ 889 static size_t pmu_deduped_name_len(const struct perf_pmu *pmu, const char *name, 890 bool skip_duplicate_pmus) 891 { 892 return skip_duplicate_pmus && !pmu->is_core 893 ? pmu_name_len_no_suffix(name) 894 : strlen(name); 895 } 896 897 /** 898 * perf_pmu__match_wildcard - Does the pmu_name start with tok and is then only 899 * followed by nothing or a suffix? tok may contain 900 * part of a suffix. 901 * @pmu_name: The pmu_name with possible suffix. 902 * @tok: The wildcard argument to match. 903 */ 904 static bool perf_pmu__match_wildcard(const char *pmu_name, const char *tok) 905 { 906 const char *p, *suffix; 907 bool has_hex = false; 908 size_t tok_len = strlen(tok); 909 910 /* Check start of pmu_name for equality. */ 911 if (strncmp(pmu_name, tok, tok_len)) 912 return false; 913 914 suffix = p = pmu_name + tok_len; 915 if (*p == 0) 916 return true; 917 918 if (*p == '_') { 919 ++p; 920 ++suffix; 921 } 922 923 /* Ensure we end in a number */ 924 while (1) { 925 if (!isxdigit(*p)) 926 return false; 927 if (!has_hex) 928 has_hex = !isdigit(*p); 929 if (*(++p) == 0) 930 break; 931 } 932 933 if (has_hex) 934 return (p - suffix) > 2; 935 936 return true; 937 } 938 939 /** 940 * perf_pmu__match_ignoring_suffix_uncore - Does the pmu_name match tok ignoring 941 * any trailing suffix on pmu_name and 942 * tok? The Suffix must be in form 943 * tok_{digits}, or tok{digits}. 944 * @pmu_name: The pmu_name with possible suffix. 945 * @tok: The possible match to pmu_name. 946 */ 947 static bool perf_pmu__match_ignoring_suffix_uncore(const char *pmu_name, const char *tok) 948 { 949 size_t pmu_name_len, tok_len; 950 951 /* For robustness, check for NULL. */ 952 if (pmu_name == NULL) 953 return tok == NULL; 954 955 /* uncore_ prefixes are ignored. */ 956 if (!strncmp(pmu_name, "uncore_", 7)) 957 pmu_name += 7; 958 if (!strncmp(tok, "uncore_", 7)) 959 tok += 7; 960 961 pmu_name_len = pmu_name_len_no_suffix(pmu_name); 962 tok_len = pmu_name_len_no_suffix(tok); 963 if (pmu_name_len != tok_len) 964 return false; 965 966 return strncmp(pmu_name, tok, pmu_name_len) == 0; 967 } 968 969 970 /** 971 * perf_pmu__match_wildcard_uncore - does to_match match the PMU's name? 972 * @pmu_name: The pmu->name or pmu->alias to match against. 973 * @to_match: the json struct pmu_event name. This may lack a suffix (which 974 * matches) or be of the form "socket,pmuname" which will match 975 * "socketX_pmunameY". 976 */ 977 static bool perf_pmu__match_wildcard_uncore(const char *pmu_name, const char *to_match) 978 { 979 char *mutable_to_match, *tok, *tmp; 980 981 if (!pmu_name) 982 return false; 983 984 /* uncore_ prefixes are ignored. */ 985 if (!strncmp(pmu_name, "uncore_", 7)) 986 pmu_name += 7; 987 if (!strncmp(to_match, "uncore_", 7)) 988 to_match += 7; 989 990 if (strchr(to_match, ',') == NULL) 991 return perf_pmu__match_wildcard(pmu_name, to_match); 992 993 /* Process comma separated list of PMU name components. */ 994 mutable_to_match = strdup(to_match); 995 if (!mutable_to_match) 996 return false; 997 998 tok = strtok_r(mutable_to_match, ",", &tmp); 999 while (tok) { 1000 size_t tok_len = strlen(tok); 1001 1002 if (strncmp(pmu_name, tok, tok_len)) { 1003 /* Mismatch between part of pmu_name and tok. */ 1004 free(mutable_to_match); 1005 return false; 1006 } 1007 /* Move pmu_name forward over tok and suffix. */ 1008 pmu_name += tok_len; 1009 while (*pmu_name != '\0' && isdigit(*pmu_name)) 1010 pmu_name++; 1011 if (*pmu_name == '_') 1012 pmu_name++; 1013 1014 tok = strtok_r(NULL, ",", &tmp); 1015 } 1016 free(mutable_to_match); 1017 return *pmu_name == '\0'; 1018 } 1019 1020 bool pmu_uncore_identifier_match(const char *compat, const char *id) 1021 { 1022 regex_t re; 1023 regmatch_t pmatch[1]; 1024 int match; 1025 1026 if (regcomp(&re, compat, REG_EXTENDED) != 0) { 1027 /* Warn unable to generate match particular string. */ 1028 pr_info("Invalid regular expression %s\n", compat); 1029 return false; 1030 } 1031 1032 match = !regexec(&re, id, 1, pmatch, 0); 1033 if (match) { 1034 /* Ensure a full match. */ 1035 match = pmatch[0].rm_so == 0 && (size_t)pmatch[0].rm_eo == strlen(id); 1036 } 1037 regfree(&re); 1038 1039 return match; 1040 } 1041 1042 static int pmu_add_cpu_aliases_map_callback(const struct pmu_event *pe, 1043 const struct pmu_events_table *table __maybe_unused, 1044 void *vdata) 1045 { 1046 struct perf_pmu *pmu = vdata; 1047 1048 perf_pmu__new_alias(pmu, pe->name, pe->desc, pe->event, /*val_fd=*/ NULL, 1049 pe, EVENT_SRC_CPU_JSON); 1050 return 0; 1051 } 1052 1053 /* 1054 * From the pmu_events_table, find the events that correspond to the given 1055 * PMU and add them to the list 'head'. 1056 */ 1057 void pmu_add_cpu_aliases_table(struct perf_pmu *pmu, const struct pmu_events_table *table) 1058 { 1059 pmu_events_table__for_each_event(table, pmu, pmu_add_cpu_aliases_map_callback, pmu); 1060 } 1061 1062 static void pmu_add_cpu_aliases(struct perf_pmu *pmu) 1063 { 1064 if (!pmu->events_table) 1065 return; 1066 1067 if (pmu->cpu_aliases_added) 1068 return; 1069 1070 pmu_add_cpu_aliases_table(pmu, pmu->events_table); 1071 pmu->cpu_aliases_added = true; 1072 } 1073 1074 static int pmu_add_sys_aliases_iter_fn(const struct pmu_event *pe, 1075 const struct pmu_events_table *table __maybe_unused, 1076 void *vdata) 1077 { 1078 struct perf_pmu *pmu = vdata; 1079 1080 if (!pe->compat || !pe->pmu) { 1081 /* No data to match. */ 1082 return 0; 1083 } 1084 1085 if (!perf_pmu__match_wildcard_uncore(pmu->name, pe->pmu) && 1086 !perf_pmu__match_wildcard_uncore(pmu->alias_name, pe->pmu)) { 1087 /* PMU name/alias_name don't match. */ 1088 return 0; 1089 } 1090 1091 if (pmu_uncore_identifier_match(pe->compat, pmu->id)) { 1092 /* Id matched. */ 1093 perf_pmu__new_alias(pmu, 1094 pe->name, 1095 pe->desc, 1096 pe->event, 1097 /*val_fd=*/ NULL, 1098 pe, 1099 EVENT_SRC_SYS_JSON); 1100 } 1101 return 0; 1102 } 1103 1104 void pmu_add_sys_aliases(struct perf_pmu *pmu) 1105 { 1106 if (!pmu->id) 1107 return; 1108 1109 pmu_for_each_sys_event(pmu_add_sys_aliases_iter_fn, pmu); 1110 } 1111 1112 static char *pmu_find_alias_name(struct perf_pmu *pmu, int dirfd) 1113 { 1114 FILE *file = perf_pmu__open_file_at(pmu, dirfd, "alias"); 1115 char *line = NULL; 1116 size_t line_len = 0; 1117 ssize_t ret; 1118 1119 if (!file) 1120 return NULL; 1121 1122 ret = getline(&line, &line_len, file); 1123 if (ret < 0) { 1124 fclose(file); 1125 return NULL; 1126 } 1127 /* Remove trailing newline. */ 1128 if (ret > 0 && line[ret - 1] == '\n') 1129 line[--ret] = '\0'; 1130 1131 fclose(file); 1132 return line; 1133 } 1134 1135 static int pmu_max_precise(int dirfd, struct perf_pmu *pmu) 1136 { 1137 int max_precise = -1; 1138 1139 perf_pmu__scan_file_at(pmu, dirfd, "caps/max_precise", "%d", &max_precise); 1140 return max_precise; 1141 } 1142 1143 void __weak 1144 perf_pmu__arch_init(struct perf_pmu *pmu) 1145 { 1146 if (pmu->is_core) 1147 pmu->mem_events = perf_mem_events; 1148 } 1149 1150 /* Variant of str_hash that does tolower on each character. */ 1151 static size_t aliases__hash(long key, void *ctx __maybe_unused) 1152 { 1153 const char *s = (const char *)key; 1154 size_t h = 0; 1155 1156 while (*s) { 1157 h = h * 31 + tolower(*s); 1158 s++; 1159 } 1160 return h; 1161 } 1162 1163 static bool aliases__equal(long key1, long key2, void *ctx __maybe_unused) 1164 { 1165 return strcasecmp((const char *)key1, (const char *)key2) == 0; 1166 } 1167 1168 int perf_pmu__init(struct perf_pmu *pmu, __u32 type, const char *name) 1169 { 1170 pmu->type = type; 1171 INIT_LIST_HEAD(&pmu->format); 1172 INIT_LIST_HEAD(&pmu->caps); 1173 1174 pmu->name = strdup(name); 1175 if (!pmu->name) 1176 return -ENOMEM; 1177 1178 pmu->aliases = hashmap__new(aliases__hash, aliases__equal, /*ctx=*/ NULL); 1179 if (!pmu->aliases) 1180 return -ENOMEM; 1181 1182 return 0; 1183 } 1184 1185 struct perf_pmu *perf_pmu__lookup(struct list_head *pmus, int dirfd, const char *name, 1186 bool eager_load) 1187 { 1188 struct perf_pmu *pmu; 1189 1190 pmu = zalloc(sizeof(*pmu)); 1191 if (!pmu) 1192 return NULL; 1193 1194 if (perf_pmu__init(pmu, PERF_PMU_TYPE_FAKE, name) != 0) { 1195 perf_pmu__delete(pmu); 1196 return NULL; 1197 } 1198 1199 /* 1200 * Read type early to fail fast if a lookup name isn't a PMU. Ensure 1201 * that type value is successfully assigned (return 1). 1202 */ 1203 if (perf_pmu__scan_file_at(pmu, dirfd, "type", "%u", &pmu->type) != 1) { 1204 perf_pmu__delete(pmu); 1205 return NULL; 1206 } 1207 1208 /* 1209 * The pmu data we store & need consists of the pmu 1210 * type value and format definitions. Load both right 1211 * now. 1212 */ 1213 if (pmu_format(pmu, dirfd, name, eager_load)) { 1214 perf_pmu__delete(pmu); 1215 return NULL; 1216 } 1217 1218 pmu->is_core = is_pmu_core(name); 1219 pmu->cpus = pmu_cpumask(dirfd, name, pmu->is_core); 1220 1221 pmu->is_uncore = pmu_is_uncore(dirfd, name); 1222 if (pmu->is_uncore) 1223 pmu->id = pmu_id(name); 1224 pmu->max_precise = pmu_max_precise(dirfd, pmu); 1225 pmu->alias_name = pmu_find_alias_name(pmu, dirfd); 1226 pmu->events_table = perf_pmu__find_events_table(pmu); 1227 /* 1228 * Load the sys json events/aliases when loading the PMU as each event 1229 * may have a different compat regular expression. We therefore can't 1230 * know the number of sys json events/aliases without computing the 1231 * regular expressions for them all. 1232 */ 1233 pmu_add_sys_aliases(pmu); 1234 list_add_tail(&pmu->list, pmus); 1235 1236 perf_pmu__arch_init(pmu); 1237 1238 if (eager_load) 1239 pmu_aliases_parse_eager(pmu, dirfd); 1240 1241 return pmu; 1242 } 1243 1244 /* Creates the PMU when sysfs scanning fails. */ 1245 struct perf_pmu *perf_pmu__create_placeholder_core_pmu(struct list_head *core_pmus) 1246 { 1247 struct perf_pmu *pmu = zalloc(sizeof(*pmu)); 1248 1249 if (!pmu) 1250 return NULL; 1251 1252 pmu->name = strdup("cpu"); 1253 if (!pmu->name) { 1254 free(pmu); 1255 return NULL; 1256 } 1257 1258 pmu->is_core = true; 1259 pmu->type = PERF_TYPE_RAW; 1260 pmu->cpus = cpu_map__online(); 1261 1262 INIT_LIST_HEAD(&pmu->format); 1263 pmu->aliases = hashmap__new(aliases__hash, aliases__equal, /*ctx=*/ NULL); 1264 INIT_LIST_HEAD(&pmu->caps); 1265 list_add_tail(&pmu->list, core_pmus); 1266 return pmu; 1267 } 1268 1269 bool perf_pmu__is_fake(const struct perf_pmu *pmu) 1270 { 1271 return pmu->type == PERF_PMU_TYPE_FAKE; 1272 } 1273 1274 void perf_pmu__warn_invalid_formats(struct perf_pmu *pmu) 1275 { 1276 struct perf_pmu_format *format; 1277 1278 if (pmu->formats_checked) 1279 return; 1280 1281 pmu->formats_checked = true; 1282 1283 /* fake pmu doesn't have format list */ 1284 if (perf_pmu__is_fake(pmu)) 1285 return; 1286 1287 list_for_each_entry(format, &pmu->format, list) { 1288 perf_pmu_format__load(pmu, format); 1289 if (format->value >= PERF_PMU_FORMAT_VALUE_CONFIG_END) { 1290 pr_warning("WARNING: '%s' format '%s' requires 'perf_event_attr::config%d'" 1291 "which is not supported by this version of perf!\n", 1292 pmu->name, format->name, format->value); 1293 return; 1294 } 1295 } 1296 } 1297 1298 bool evsel__is_aux_event(const struct evsel *evsel) 1299 { 1300 struct perf_pmu *pmu; 1301 1302 if (evsel->needs_auxtrace_mmap) 1303 return true; 1304 1305 pmu = evsel__find_pmu(evsel); 1306 return pmu && pmu->auxtrace; 1307 } 1308 1309 /* 1310 * Set @config_name to @val as long as the user hasn't already set or cleared it 1311 * by passing a config term on the command line. 1312 * 1313 * @val is the value to put into the bits specified by @config_name rather than 1314 * the bit pattern. It is shifted into position by this function, so to set 1315 * something to true, pass 1 for val rather than a pre shifted value. 1316 */ 1317 #define field_prep(_mask, _val) (((_val) << (ffsll(_mask) - 1)) & (_mask)) 1318 void evsel__set_config_if_unset(struct perf_pmu *pmu, struct evsel *evsel, 1319 const char *config_name, u64 val) 1320 { 1321 u64 user_bits = 0, bits; 1322 struct evsel_config_term *term = evsel__get_config_term(evsel, CFG_CHG); 1323 1324 if (term) 1325 user_bits = term->val.cfg_chg; 1326 1327 bits = perf_pmu__format_bits(pmu, config_name); 1328 1329 /* Do nothing if the user changed the value */ 1330 if (bits & user_bits) 1331 return; 1332 1333 /* Otherwise replace it */ 1334 evsel->core.attr.config &= ~bits; 1335 evsel->core.attr.config |= field_prep(bits, val); 1336 } 1337 1338 static struct perf_pmu_format * 1339 pmu_find_format(const struct list_head *formats, const char *name) 1340 { 1341 struct perf_pmu_format *format; 1342 1343 list_for_each_entry(format, formats, list) 1344 if (!strcmp(format->name, name)) 1345 return format; 1346 1347 return NULL; 1348 } 1349 1350 __u64 perf_pmu__format_bits(struct perf_pmu *pmu, const char *name) 1351 { 1352 struct perf_pmu_format *format = pmu_find_format(&pmu->format, name); 1353 __u64 bits = 0; 1354 int fbit; 1355 1356 if (!format) 1357 return 0; 1358 1359 for_each_set_bit(fbit, format->bits, PERF_PMU_FORMAT_BITS) 1360 bits |= 1ULL << fbit; 1361 1362 return bits; 1363 } 1364 1365 int perf_pmu__format_type(struct perf_pmu *pmu, const char *name) 1366 { 1367 struct perf_pmu_format *format = pmu_find_format(&pmu->format, name); 1368 1369 if (!format) 1370 return -1; 1371 1372 perf_pmu_format__load(pmu, format); 1373 return format->value; 1374 } 1375 1376 /* 1377 * Sets value based on the format definition (format parameter) 1378 * and unformatted value (value parameter). 1379 */ 1380 static void pmu_format_value(unsigned long *format, __u64 value, __u64 *v, 1381 bool zero) 1382 { 1383 unsigned long fbit, vbit; 1384 1385 for (fbit = 0, vbit = 0; fbit < PERF_PMU_FORMAT_BITS; fbit++) { 1386 1387 if (!test_bit(fbit, format)) 1388 continue; 1389 1390 if (value & (1llu << vbit++)) 1391 *v |= (1llu << fbit); 1392 else if (zero) 1393 *v &= ~(1llu << fbit); 1394 } 1395 } 1396 1397 static __u64 pmu_format_max_value(const unsigned long *format) 1398 { 1399 int w; 1400 1401 w = bitmap_weight(format, PERF_PMU_FORMAT_BITS); 1402 if (!w) 1403 return 0; 1404 if (w < 64) 1405 return (1ULL << w) - 1; 1406 return -1; 1407 } 1408 1409 /* 1410 * Term is a string term, and might be a param-term. Try to look up it's value 1411 * in the remaining terms. 1412 * - We have a term like "base-or-format-term=param-term", 1413 * - We need to find the value supplied for "param-term" (with param-term named 1414 * in a config string) later on in the term list. 1415 */ 1416 static int pmu_resolve_param_term(struct parse_events_term *term, 1417 struct parse_events_terms *head_terms, 1418 __u64 *value) 1419 { 1420 struct parse_events_term *t; 1421 1422 list_for_each_entry(t, &head_terms->terms, list) { 1423 if (t->type_val == PARSE_EVENTS__TERM_TYPE_NUM && 1424 t->config && !strcmp(t->config, term->config)) { 1425 t->used = true; 1426 *value = t->val.num; 1427 return 0; 1428 } 1429 } 1430 1431 if (verbose > 0) 1432 printf("Required parameter '%s' not specified\n", term->config); 1433 1434 return -1; 1435 } 1436 1437 static char *pmu_formats_string(const struct list_head *formats) 1438 { 1439 struct perf_pmu_format *format; 1440 char *str = NULL; 1441 struct strbuf buf = STRBUF_INIT; 1442 unsigned int i = 0; 1443 1444 if (!formats) 1445 return NULL; 1446 1447 /* sysfs exported terms */ 1448 list_for_each_entry(format, formats, list) 1449 if (strbuf_addf(&buf, i++ ? ",%s" : "%s", format->name) < 0) 1450 goto error; 1451 1452 str = strbuf_detach(&buf, NULL); 1453 error: 1454 strbuf_release(&buf); 1455 1456 return str; 1457 } 1458 1459 /* 1460 * Setup one of config[12] attr members based on the 1461 * user input data - term parameter. 1462 */ 1463 static int pmu_config_term(const struct perf_pmu *pmu, 1464 struct perf_event_attr *attr, 1465 struct parse_events_term *term, 1466 struct parse_events_terms *head_terms, 1467 bool zero, bool apply_hardcoded, 1468 struct parse_events_error *err) 1469 { 1470 struct perf_pmu_format *format; 1471 __u64 *vp; 1472 __u64 val, max_val; 1473 1474 /* 1475 * If this is a parameter we've already used for parameterized-eval, 1476 * skip it in normal eval. 1477 */ 1478 if (term->used) 1479 return 0; 1480 1481 /* 1482 * Hardcoded terms are generally handled in event parsing, which 1483 * traditionally have had to handle not having a PMU. An alias may 1484 * have hard coded config values, optionally apply them below. 1485 */ 1486 if (parse_events__is_hardcoded_term(term)) { 1487 /* Config terms set all bits in the config. */ 1488 DECLARE_BITMAP(bits, PERF_PMU_FORMAT_BITS); 1489 1490 if (!apply_hardcoded) 1491 return 0; 1492 1493 bitmap_fill(bits, PERF_PMU_FORMAT_BITS); 1494 1495 switch (term->type_term) { 1496 case PARSE_EVENTS__TERM_TYPE_CONFIG: 1497 assert(term->type_val == PARSE_EVENTS__TERM_TYPE_NUM); 1498 pmu_format_value(bits, term->val.num, &attr->config, zero); 1499 break; 1500 case PARSE_EVENTS__TERM_TYPE_CONFIG1: 1501 assert(term->type_val == PARSE_EVENTS__TERM_TYPE_NUM); 1502 pmu_format_value(bits, term->val.num, &attr->config1, zero); 1503 break; 1504 case PARSE_EVENTS__TERM_TYPE_CONFIG2: 1505 assert(term->type_val == PARSE_EVENTS__TERM_TYPE_NUM); 1506 pmu_format_value(bits, term->val.num, &attr->config2, zero); 1507 break; 1508 case PARSE_EVENTS__TERM_TYPE_CONFIG3: 1509 assert(term->type_val == PARSE_EVENTS__TERM_TYPE_NUM); 1510 pmu_format_value(bits, term->val.num, &attr->config3, zero); 1511 break; 1512 case PARSE_EVENTS__TERM_TYPE_USER: /* Not hardcoded. */ 1513 return -EINVAL; 1514 case PARSE_EVENTS__TERM_TYPE_NAME ... PARSE_EVENTS__TERM_TYPE_CPU: 1515 /* Skip non-config terms. */ 1516 break; 1517 default: 1518 break; 1519 } 1520 return 0; 1521 } 1522 1523 format = pmu_find_format(&pmu->format, term->config); 1524 if (!format) { 1525 char *pmu_term = pmu_formats_string(&pmu->format); 1526 char *unknown_term; 1527 char *help_msg; 1528 1529 if (asprintf(&unknown_term, 1530 "unknown term '%s' for pmu '%s'", 1531 term->config, pmu->name) < 0) 1532 unknown_term = NULL; 1533 help_msg = parse_events_formats_error_string(pmu_term); 1534 if (err) { 1535 parse_events_error__handle(err, term->err_term, 1536 unknown_term, 1537 help_msg); 1538 } else { 1539 pr_debug("%s (%s)\n", unknown_term, help_msg); 1540 free(unknown_term); 1541 } 1542 free(pmu_term); 1543 return -EINVAL; 1544 } 1545 perf_pmu_format__load(pmu, format); 1546 switch (format->value) { 1547 case PERF_PMU_FORMAT_VALUE_CONFIG: 1548 vp = &attr->config; 1549 break; 1550 case PERF_PMU_FORMAT_VALUE_CONFIG1: 1551 vp = &attr->config1; 1552 break; 1553 case PERF_PMU_FORMAT_VALUE_CONFIG2: 1554 vp = &attr->config2; 1555 break; 1556 case PERF_PMU_FORMAT_VALUE_CONFIG3: 1557 vp = &attr->config3; 1558 break; 1559 default: 1560 return -EINVAL; 1561 } 1562 1563 /* 1564 * Either directly use a numeric term, or try to translate string terms 1565 * using event parameters. 1566 */ 1567 if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM) { 1568 if (term->no_value && 1569 bitmap_weight(format->bits, PERF_PMU_FORMAT_BITS) > 1) { 1570 if (err) { 1571 parse_events_error__handle(err, term->err_val, 1572 strdup("no value assigned for term"), 1573 NULL); 1574 } 1575 return -EINVAL; 1576 } 1577 1578 val = term->val.num; 1579 } else if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) { 1580 if (strcmp(term->val.str, "?")) { 1581 if (verbose > 0) { 1582 pr_info("Invalid sysfs entry %s=%s\n", 1583 term->config, term->val.str); 1584 } 1585 if (err) { 1586 parse_events_error__handle(err, term->err_val, 1587 strdup("expected numeric value"), 1588 NULL); 1589 } 1590 return -EINVAL; 1591 } 1592 1593 if (pmu_resolve_param_term(term, head_terms, &val)) 1594 return -EINVAL; 1595 } else 1596 return -EINVAL; 1597 1598 max_val = pmu_format_max_value(format->bits); 1599 if (val > max_val) { 1600 if (err) { 1601 char *err_str; 1602 1603 if (asprintf(&err_str, 1604 "value too big for format (%s), maximum is %llu", 1605 format->name, (unsigned long long)max_val) < 0) { 1606 err_str = strdup("value too big for format"); 1607 } 1608 parse_events_error__handle(err, term->err_val, err_str, /*help=*/NULL); 1609 return -EINVAL; 1610 } 1611 /* 1612 * Assume we don't care if !err, in which case the value will be 1613 * silently truncated. 1614 */ 1615 } 1616 1617 pmu_format_value(format->bits, val, vp, zero); 1618 return 0; 1619 } 1620 1621 int perf_pmu__config_terms(const struct perf_pmu *pmu, 1622 struct perf_event_attr *attr, 1623 struct parse_events_terms *terms, 1624 bool zero, bool apply_hardcoded, 1625 struct parse_events_error *err) 1626 { 1627 struct parse_events_term *term; 1628 1629 if (perf_pmu__is_hwmon(pmu)) 1630 return hwmon_pmu__config_terms(pmu, attr, terms, err); 1631 if (perf_pmu__is_drm(pmu)) 1632 return drm_pmu__config_terms(pmu, attr, terms, err); 1633 1634 list_for_each_entry(term, &terms->terms, list) { 1635 if (pmu_config_term(pmu, attr, term, terms, zero, apply_hardcoded, err)) 1636 return -EINVAL; 1637 } 1638 1639 return 0; 1640 } 1641 1642 /* 1643 * Configures event's 'attr' parameter based on the: 1644 * 1) users input - specified in terms parameter 1645 * 2) pmu format definitions - specified by pmu parameter 1646 */ 1647 int perf_pmu__config(struct perf_pmu *pmu, struct perf_event_attr *attr, 1648 struct parse_events_terms *head_terms, 1649 bool apply_hardcoded, 1650 struct parse_events_error *err) 1651 { 1652 bool zero = !!pmu->perf_event_attr_init_default; 1653 1654 /* Fake PMU doesn't have proper terms so nothing to configure in attr. */ 1655 if (perf_pmu__is_fake(pmu)) 1656 return 0; 1657 1658 return perf_pmu__config_terms(pmu, attr, head_terms, zero, apply_hardcoded, err); 1659 } 1660 1661 static struct perf_pmu_alias *pmu_find_alias(struct perf_pmu *pmu, 1662 struct parse_events_term *term) 1663 { 1664 struct perf_pmu_alias *alias; 1665 const char *name; 1666 1667 if (parse_events__is_hardcoded_term(term)) 1668 return NULL; 1669 1670 if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM) { 1671 if (!term->no_value) 1672 return NULL; 1673 if (pmu_find_format(&pmu->format, term->config)) 1674 return NULL; 1675 name = term->config; 1676 1677 } else if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) { 1678 if (strcasecmp(term->config, "event")) 1679 return NULL; 1680 name = term->val.str; 1681 } else { 1682 return NULL; 1683 } 1684 1685 alias = perf_pmu__find_alias(pmu, name, /*load=*/ true); 1686 if (alias || pmu->cpu_aliases_added) 1687 return alias; 1688 1689 /* Alias doesn't exist, try to get it from the json events. */ 1690 if (pmu->events_table && 1691 pmu_events_table__find_event(pmu->events_table, pmu, name, 1692 pmu_add_cpu_aliases_map_callback, 1693 pmu) == 0) { 1694 alias = perf_pmu__find_alias(pmu, name, /*load=*/ false); 1695 } 1696 return alias; 1697 } 1698 1699 1700 static int check_info_data(struct perf_pmu *pmu, 1701 struct perf_pmu_alias *alias, 1702 struct perf_pmu_info *info, 1703 struct parse_events_error *err, 1704 int column) 1705 { 1706 read_alias_info(pmu, alias); 1707 /* 1708 * Only one term in event definition can 1709 * define unit, scale and snapshot, fail 1710 * if there's more than one. 1711 */ 1712 if (info->unit && alias->unit[0]) { 1713 parse_events_error__handle(err, column, 1714 strdup("Attempt to set event's unit twice"), 1715 NULL); 1716 return -EINVAL; 1717 } 1718 if (info->scale && alias->scale) { 1719 parse_events_error__handle(err, column, 1720 strdup("Attempt to set event's scale twice"), 1721 NULL); 1722 return -EINVAL; 1723 } 1724 if (info->snapshot && alias->snapshot) { 1725 parse_events_error__handle(err, column, 1726 strdup("Attempt to set event snapshot twice"), 1727 NULL); 1728 return -EINVAL; 1729 } 1730 1731 if (alias->unit[0]) 1732 info->unit = alias->unit; 1733 1734 if (alias->scale) 1735 info->scale = alias->scale; 1736 1737 if (alias->snapshot) 1738 info->snapshot = alias->snapshot; 1739 1740 return 0; 1741 } 1742 1743 /* 1744 * Find alias in the terms list and replace it with the terms 1745 * defined for the alias 1746 */ 1747 int perf_pmu__check_alias(struct perf_pmu *pmu, struct parse_events_terms *head_terms, 1748 struct perf_pmu_info *info, bool *rewrote_terms, 1749 u64 *alternate_hw_config, struct parse_events_error *err) 1750 { 1751 struct parse_events_term *term, *h; 1752 struct perf_pmu_alias *alias; 1753 int ret; 1754 1755 *rewrote_terms = false; 1756 info->per_pkg = false; 1757 1758 /* 1759 * Mark unit and scale as not set 1760 * (different from default values, see below) 1761 */ 1762 info->unit = NULL; 1763 info->scale = 0.0; 1764 info->snapshot = false; 1765 info->retirement_latency_mean = 0.0; 1766 info->retirement_latency_min = 0.0; 1767 info->retirement_latency_max = 0.0; 1768 1769 if (perf_pmu__is_hwmon(pmu)) { 1770 ret = hwmon_pmu__check_alias(head_terms, info, err); 1771 goto out; 1772 } 1773 if (perf_pmu__is_drm(pmu)) { 1774 ret = drm_pmu__check_alias(pmu, head_terms, info, err); 1775 goto out; 1776 } 1777 1778 /* Fake PMU doesn't rewrite terms. */ 1779 if (perf_pmu__is_fake(pmu)) 1780 goto out; 1781 1782 list_for_each_entry_safe(term, h, &head_terms->terms, list) { 1783 alias = pmu_find_alias(pmu, term); 1784 if (!alias) 1785 continue; 1786 ret = pmu_alias_terms(alias, term->err_term, &term->list); 1787 if (ret) { 1788 parse_events_error__handle(err, term->err_term, 1789 strdup("Failure to duplicate terms"), 1790 NULL); 1791 return ret; 1792 } 1793 1794 *rewrote_terms = true; 1795 ret = check_info_data(pmu, alias, info, err, term->err_term); 1796 if (ret) 1797 return ret; 1798 1799 if (alias->per_pkg) 1800 info->per_pkg = true; 1801 1802 if (term->alternate_hw_config) 1803 *alternate_hw_config = term->val.num; 1804 1805 info->retirement_latency_mean = alias->retirement_latency_mean; 1806 info->retirement_latency_min = alias->retirement_latency_min; 1807 info->retirement_latency_max = alias->retirement_latency_max; 1808 1809 list_del_init(&term->list); 1810 parse_events_term__delete(term); 1811 } 1812 out: 1813 /* 1814 * if no unit or scale found in aliases, then 1815 * set defaults as for evsel 1816 * unit cannot left to NULL 1817 */ 1818 if (info->unit == NULL) 1819 info->unit = ""; 1820 1821 if (info->scale == 0.0) 1822 info->scale = 1.0; 1823 1824 return 0; 1825 } 1826 1827 struct find_event_args { 1828 const char *event; 1829 void *state; 1830 pmu_event_callback cb; 1831 }; 1832 1833 static int find_event_callback(void *state, struct pmu_event_info *info) 1834 { 1835 struct find_event_args *args = state; 1836 1837 if (!strcmp(args->event, info->name)) 1838 return args->cb(args->state, info); 1839 1840 return 0; 1841 } 1842 1843 int perf_pmu__find_event(struct perf_pmu *pmu, const char *event, void *state, pmu_event_callback cb) 1844 { 1845 struct find_event_args args = { 1846 .event = event, 1847 .state = state, 1848 .cb = cb, 1849 }; 1850 1851 /* Sub-optimal, but function is only used by tests. */ 1852 return perf_pmu__for_each_event(pmu, /*skip_duplicate_pmus=*/ false, 1853 &args, find_event_callback); 1854 } 1855 1856 static void perf_pmu__del_formats(struct list_head *formats) 1857 { 1858 struct perf_pmu_format *fmt, *tmp; 1859 1860 list_for_each_entry_safe(fmt, tmp, formats, list) { 1861 list_del(&fmt->list); 1862 zfree(&fmt->name); 1863 free(fmt); 1864 } 1865 } 1866 1867 bool perf_pmu__has_format(const struct perf_pmu *pmu, const char *name) 1868 { 1869 struct perf_pmu_format *format; 1870 1871 list_for_each_entry(format, &pmu->format, list) { 1872 if (!strcmp(format->name, name)) 1873 return true; 1874 } 1875 return false; 1876 } 1877 1878 int perf_pmu__for_each_format(struct perf_pmu *pmu, void *state, pmu_format_callback cb) 1879 { 1880 static const char *const terms[] = { 1881 "config=0..0xffffffffffffffff", 1882 "config1=0..0xffffffffffffffff", 1883 "config2=0..0xffffffffffffffff", 1884 "config3=0..0xffffffffffffffff", 1885 "name=string", 1886 "period=number", 1887 "freq=number", 1888 "branch_type=(u|k|hv|any|...)", 1889 "time", 1890 "call-graph=(fp|dwarf|lbr)", 1891 "stack-size=number", 1892 "max-stack=number", 1893 "nr=number", 1894 "inherit", 1895 "no-inherit", 1896 "overwrite", 1897 "no-overwrite", 1898 "percore", 1899 "aux-output", 1900 "aux-action=(pause|resume|start-paused)", 1901 "aux-sample-size=number", 1902 "cpu=number", 1903 }; 1904 struct perf_pmu_format *format; 1905 int ret; 1906 1907 /* 1908 * max-events and driver-config are missing above as are the internal 1909 * types user, metric-id, raw, legacy cache and hardware. Assert against 1910 * the enum parse_events__term_type so they are kept in sync. 1911 */ 1912 _Static_assert(ARRAY_SIZE(terms) == __PARSE_EVENTS__TERM_TYPE_NR - 6, 1913 "perf_pmu__for_each_format()'s terms must be kept in sync with enum parse_events__term_type"); 1914 list_for_each_entry(format, &pmu->format, list) { 1915 perf_pmu_format__load(pmu, format); 1916 ret = cb(state, format->name, (int)format->value, format->bits); 1917 if (ret) 1918 return ret; 1919 } 1920 if (!pmu->is_core) 1921 return 0; 1922 1923 for (size_t i = 0; i < ARRAY_SIZE(terms); i++) { 1924 int config = PERF_PMU_FORMAT_VALUE_CONFIG; 1925 1926 if (i < PERF_PMU_FORMAT_VALUE_CONFIG_END) 1927 config = i; 1928 1929 ret = cb(state, terms[i], config, /*bits=*/NULL); 1930 if (ret) 1931 return ret; 1932 } 1933 return 0; 1934 } 1935 1936 bool is_pmu_core(const char *name) 1937 { 1938 return !strcmp(name, "cpu") || !strcmp(name, "cpum_cf") || is_sysfs_pmu_core(name); 1939 } 1940 1941 bool perf_pmu__supports_legacy_cache(const struct perf_pmu *pmu) 1942 { 1943 return pmu->is_core; 1944 } 1945 1946 bool perf_pmu__auto_merge_stats(const struct perf_pmu *pmu) 1947 { 1948 return !pmu->is_core || perf_pmus__num_core_pmus() == 1; 1949 } 1950 1951 bool perf_pmu__have_event(struct perf_pmu *pmu, const char *name) 1952 { 1953 if (!name) 1954 return false; 1955 if (perf_pmu__is_tool(pmu) && tool_pmu__skip_event(name)) 1956 return false; 1957 if (perf_pmu__is_hwmon(pmu)) 1958 return hwmon_pmu__have_event(pmu, name); 1959 if (perf_pmu__is_drm(pmu)) 1960 return drm_pmu__have_event(pmu, name); 1961 if (perf_pmu__find_alias(pmu, name, /*load=*/ true) != NULL) 1962 return true; 1963 if (pmu->cpu_aliases_added || !pmu->events_table) 1964 return false; 1965 return pmu_events_table__find_event(pmu->events_table, pmu, name, NULL, NULL) == 0; 1966 } 1967 1968 size_t perf_pmu__num_events(struct perf_pmu *pmu) 1969 { 1970 size_t nr; 1971 1972 if (perf_pmu__is_hwmon(pmu)) 1973 return hwmon_pmu__num_events(pmu); 1974 if (perf_pmu__is_drm(pmu)) 1975 return drm_pmu__num_events(pmu); 1976 1977 pmu_aliases_parse(pmu); 1978 nr = pmu->sysfs_aliases + pmu->sys_json_aliases; 1979 1980 if (pmu->cpu_aliases_added) 1981 nr += pmu->cpu_json_aliases; 1982 else if (pmu->events_table) 1983 nr += pmu_events_table__num_events(pmu->events_table, pmu) - 1984 pmu->cpu_common_json_aliases; 1985 else 1986 assert(pmu->cpu_json_aliases == 0 && pmu->cpu_common_json_aliases == 0); 1987 1988 if (perf_pmu__is_tool(pmu)) 1989 nr -= tool_pmu__num_skip_events(); 1990 1991 return pmu->selectable ? nr + 1 : nr; 1992 } 1993 1994 static int sub_non_neg(int a, int b) 1995 { 1996 if (b > a) 1997 return 0; 1998 return a - b; 1999 } 2000 2001 static char *format_alias(char *buf, int len, const struct perf_pmu *pmu, 2002 const struct perf_pmu_alias *alias, bool skip_duplicate_pmus) 2003 { 2004 struct parse_events_term *term; 2005 size_t pmu_name_len = pmu_deduped_name_len(pmu, pmu->name, 2006 skip_duplicate_pmus); 2007 int used = snprintf(buf, len, "%.*s/%s", (int)pmu_name_len, pmu->name, alias->name); 2008 2009 list_for_each_entry(term, &alias->terms.terms, list) { 2010 if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) 2011 used += snprintf(buf + used, sub_non_neg(len, used), 2012 ",%s=%s", term->config, 2013 term->val.str); 2014 } 2015 2016 if (sub_non_neg(len, used) > 0) { 2017 buf[used] = '/'; 2018 used++; 2019 } 2020 if (sub_non_neg(len, used) > 0) { 2021 buf[used] = '\0'; 2022 used++; 2023 } else 2024 buf[len - 1] = '\0'; 2025 2026 return buf; 2027 } 2028 2029 int perf_pmu__for_each_event(struct perf_pmu *pmu, bool skip_duplicate_pmus, 2030 void *state, pmu_event_callback cb) 2031 { 2032 char buf[1024]; 2033 struct pmu_event_info info = { 2034 .pmu = pmu, 2035 .event_type_desc = "Kernel PMU event", 2036 }; 2037 int ret = 0; 2038 struct strbuf sb; 2039 struct hashmap_entry *entry; 2040 size_t bkt; 2041 2042 if (perf_pmu__is_hwmon(pmu)) 2043 return hwmon_pmu__for_each_event(pmu, state, cb); 2044 if (perf_pmu__is_drm(pmu)) 2045 return drm_pmu__for_each_event(pmu, state, cb); 2046 2047 strbuf_init(&sb, /*hint=*/ 0); 2048 pmu_aliases_parse(pmu); 2049 pmu_add_cpu_aliases(pmu); 2050 hashmap__for_each_entry(pmu->aliases, entry, bkt) { 2051 struct perf_pmu_alias *event = entry->pvalue; 2052 size_t buf_used, pmu_name_len; 2053 2054 if (perf_pmu__is_tool(pmu) && tool_pmu__skip_event(event->name)) 2055 continue; 2056 2057 info.pmu_name = event->pmu_name ?: pmu->name; 2058 pmu_name_len = pmu_deduped_name_len(pmu, info.pmu_name, 2059 skip_duplicate_pmus); 2060 info.alias = NULL; 2061 if (event->desc) { 2062 info.name = event->name; 2063 buf_used = 0; 2064 } else { 2065 info.name = format_alias(buf, sizeof(buf), pmu, event, 2066 skip_duplicate_pmus); 2067 if (pmu->is_core) { 2068 info.alias = info.name; 2069 info.name = event->name; 2070 } 2071 buf_used = strlen(buf) + 1; 2072 } 2073 info.scale_unit = NULL; 2074 if (strlen(event->unit) || event->scale != 1.0) { 2075 info.scale_unit = buf + buf_used; 2076 buf_used += snprintf(buf + buf_used, sizeof(buf) - buf_used, 2077 "%G%s", event->scale, event->unit) + 1; 2078 } 2079 info.desc = event->desc; 2080 info.long_desc = event->long_desc; 2081 info.encoding_desc = buf + buf_used; 2082 parse_events_terms__to_strbuf(&event->terms, &sb); 2083 buf_used += snprintf(buf + buf_used, sizeof(buf) - buf_used, 2084 "%.*s/%s/", (int)pmu_name_len, info.pmu_name, sb.buf) + 1; 2085 info.topic = event->topic; 2086 info.str = sb.buf; 2087 info.deprecated = event->deprecated; 2088 ret = cb(state, &info); 2089 if (ret) 2090 goto out; 2091 strbuf_setlen(&sb, /*len=*/ 0); 2092 } 2093 if (pmu->selectable) { 2094 info.name = buf; 2095 snprintf(buf, sizeof(buf), "%s//", pmu->name); 2096 info.alias = NULL; 2097 info.scale_unit = NULL; 2098 info.desc = NULL; 2099 info.long_desc = NULL; 2100 info.encoding_desc = NULL; 2101 info.topic = NULL; 2102 info.pmu_name = pmu->name; 2103 info.deprecated = false; 2104 ret = cb(state, &info); 2105 } 2106 out: 2107 strbuf_release(&sb); 2108 return ret; 2109 } 2110 2111 static bool perf_pmu___name_match(const struct perf_pmu *pmu, const char *to_match, bool wildcard) 2112 { 2113 const char *names[2] = { 2114 pmu->name, 2115 pmu->alias_name, 2116 }; 2117 if (pmu->is_core) { 2118 for (size_t i = 0; i < ARRAY_SIZE(names); i++) { 2119 const char *name = names[i]; 2120 2121 if (!name) 2122 continue; 2123 2124 if (!strcmp(name, to_match)) { 2125 /* Exact name match. */ 2126 return true; 2127 } 2128 } 2129 if (!strcmp(to_match, "default_core")) { 2130 /* 2131 * jevents and tests use default_core as a marker for any core 2132 * PMU as the PMU name varies across architectures. 2133 */ 2134 return true; 2135 } 2136 return false; 2137 } 2138 if (!pmu->is_uncore) { 2139 /* 2140 * PMU isn't core or uncore, some kind of broken CPU mask 2141 * situation. Only match exact name. 2142 */ 2143 for (size_t i = 0; i < ARRAY_SIZE(names); i++) { 2144 const char *name = names[i]; 2145 2146 if (!name) 2147 continue; 2148 2149 if (!strcmp(name, to_match)) { 2150 /* Exact name match. */ 2151 return true; 2152 } 2153 } 2154 return false; 2155 } 2156 for (size_t i = 0; i < ARRAY_SIZE(names); i++) { 2157 const char *name = names[i]; 2158 2159 if (!name) 2160 continue; 2161 2162 if (wildcard && perf_pmu__match_wildcard_uncore(name, to_match)) 2163 return true; 2164 if (!wildcard && perf_pmu__match_ignoring_suffix_uncore(name, to_match)) 2165 return true; 2166 } 2167 return false; 2168 } 2169 2170 /** 2171 * perf_pmu__name_wildcard_match - Called by the jevents generated code to see 2172 * if pmu matches the json to_match string. 2173 * @pmu: The pmu whose name/alias to match. 2174 * @to_match: The possible match to pmu_name. 2175 */ 2176 bool perf_pmu__name_wildcard_match(const struct perf_pmu *pmu, const char *to_match) 2177 { 2178 return perf_pmu___name_match(pmu, to_match, /*wildcard=*/true); 2179 } 2180 2181 /** 2182 * perf_pmu__name_no_suffix_match - Does pmu's name match to_match ignoring any 2183 * trailing suffix on the pmu_name and/or tok? 2184 * @pmu: The pmu whose name/alias to match. 2185 * @to_match: The possible match to pmu_name. 2186 */ 2187 bool perf_pmu__name_no_suffix_match(const struct perf_pmu *pmu, const char *to_match) 2188 { 2189 return perf_pmu___name_match(pmu, to_match, /*wildcard=*/false); 2190 } 2191 2192 bool perf_pmu__is_software(const struct perf_pmu *pmu) 2193 { 2194 const char *known_sw_pmus[] = { 2195 "kprobe", 2196 "msr", 2197 "uprobe", 2198 }; 2199 2200 if (pmu->is_core || pmu->is_uncore || pmu->auxtrace) 2201 return false; 2202 switch (pmu->type) { 2203 case PERF_TYPE_HARDWARE: return false; 2204 case PERF_TYPE_SOFTWARE: return true; 2205 case PERF_TYPE_TRACEPOINT: return true; 2206 case PERF_TYPE_HW_CACHE: return false; 2207 case PERF_TYPE_RAW: return false; 2208 case PERF_TYPE_BREAKPOINT: return true; 2209 case PERF_PMU_TYPE_TOOL: return true; 2210 default: break; 2211 } 2212 for (size_t i = 0; i < ARRAY_SIZE(known_sw_pmus); i++) { 2213 if (!strcmp(pmu->name, known_sw_pmus[i])) 2214 return true; 2215 } 2216 return false; 2217 } 2218 2219 FILE *perf_pmu__open_file(const struct perf_pmu *pmu, const char *name) 2220 { 2221 char path[PATH_MAX]; 2222 2223 if (!perf_pmu__pathname_scnprintf(path, sizeof(path), pmu->name, name) || 2224 !file_available(path)) 2225 return NULL; 2226 2227 return fopen(path, "r"); 2228 } 2229 2230 FILE *perf_pmu__open_file_at(const struct perf_pmu *pmu, int dirfd, const char *name) 2231 { 2232 int fd; 2233 2234 fd = perf_pmu__pathname_fd(dirfd, pmu->name, name, O_RDONLY); 2235 if (fd < 0) 2236 return NULL; 2237 2238 return fdopen(fd, "r"); 2239 } 2240 2241 int perf_pmu__scan_file(const struct perf_pmu *pmu, const char *name, const char *fmt, 2242 ...) 2243 { 2244 va_list args; 2245 FILE *file; 2246 int ret = EOF; 2247 2248 va_start(args, fmt); 2249 file = perf_pmu__open_file(pmu, name); 2250 if (file) { 2251 ret = vfscanf(file, fmt, args); 2252 fclose(file); 2253 } 2254 va_end(args); 2255 return ret; 2256 } 2257 2258 int perf_pmu__scan_file_at(const struct perf_pmu *pmu, int dirfd, const char *name, 2259 const char *fmt, ...) 2260 { 2261 va_list args; 2262 FILE *file; 2263 int ret = EOF; 2264 2265 va_start(args, fmt); 2266 file = perf_pmu__open_file_at(pmu, dirfd, name); 2267 if (file) { 2268 ret = vfscanf(file, fmt, args); 2269 fclose(file); 2270 } 2271 va_end(args); 2272 return ret; 2273 } 2274 2275 bool perf_pmu__file_exists(const struct perf_pmu *pmu, const char *name) 2276 { 2277 char path[PATH_MAX]; 2278 2279 if (!perf_pmu__pathname_scnprintf(path, sizeof(path), pmu->name, name)) 2280 return false; 2281 2282 return file_available(path); 2283 } 2284 2285 static int perf_pmu__new_caps(struct list_head *list, char *name, char *value) 2286 { 2287 struct perf_pmu_caps *caps = zalloc(sizeof(*caps)); 2288 2289 if (!caps) 2290 return -ENOMEM; 2291 2292 caps->name = strdup(name); 2293 if (!caps->name) 2294 goto free_caps; 2295 caps->value = strndup(value, strlen(value) - 1); 2296 if (!caps->value) 2297 goto free_name; 2298 list_add_tail(&caps->list, list); 2299 return 0; 2300 2301 free_name: 2302 zfree(&caps->name); 2303 free_caps: 2304 free(caps); 2305 2306 return -ENOMEM; 2307 } 2308 2309 static void perf_pmu__del_caps(struct perf_pmu *pmu) 2310 { 2311 struct perf_pmu_caps *caps, *tmp; 2312 2313 list_for_each_entry_safe(caps, tmp, &pmu->caps, list) { 2314 list_del(&caps->list); 2315 zfree(&caps->name); 2316 zfree(&caps->value); 2317 free(caps); 2318 } 2319 } 2320 2321 struct perf_pmu_caps *perf_pmu__get_cap(struct perf_pmu *pmu, const char *name) 2322 { 2323 struct perf_pmu_caps *caps; 2324 2325 list_for_each_entry(caps, &pmu->caps, list) { 2326 if (!strcmp(caps->name, name)) 2327 return caps; 2328 } 2329 return NULL; 2330 } 2331 2332 /* 2333 * Reading/parsing the given pmu capabilities, which should be located at: 2334 * /sys/bus/event_source/devices/<dev>/caps as sysfs group attributes. 2335 * Return the number of capabilities 2336 */ 2337 int perf_pmu__caps_parse(struct perf_pmu *pmu) 2338 { 2339 char caps_path[PATH_MAX]; 2340 struct io_dir caps_dir; 2341 struct io_dirent64 *evt_ent; 2342 int caps_fd; 2343 2344 if (pmu->caps_initialized) 2345 return pmu->nr_caps; 2346 2347 pmu->nr_caps = 0; 2348 2349 if (!perf_pmu__pathname_scnprintf(caps_path, sizeof(caps_path), pmu->name, "caps")) 2350 return -1; 2351 2352 caps_fd = open(caps_path, O_CLOEXEC | O_DIRECTORY | O_RDONLY); 2353 if (caps_fd == -1) { 2354 pmu->caps_initialized = true; 2355 return 0; /* no error if caps does not exist */ 2356 } 2357 2358 io_dir__init(&caps_dir, caps_fd); 2359 2360 while ((evt_ent = io_dir__readdir(&caps_dir)) != NULL) { 2361 char *name = evt_ent->d_name; 2362 char value[128]; 2363 FILE *file; 2364 int fd; 2365 2366 if (io_dir__is_dir(&caps_dir, evt_ent)) 2367 continue; 2368 2369 fd = openat(caps_fd, name, O_RDONLY); 2370 if (fd == -1) 2371 continue; 2372 file = fdopen(fd, "r"); 2373 if (!file) { 2374 close(fd); 2375 continue; 2376 } 2377 2378 if (!fgets(value, sizeof(value), file) || 2379 (perf_pmu__new_caps(&pmu->caps, name, value) < 0)) { 2380 fclose(file); 2381 continue; 2382 } 2383 2384 pmu->nr_caps++; 2385 fclose(file); 2386 } 2387 2388 close(caps_fd); 2389 2390 pmu->caps_initialized = true; 2391 return pmu->nr_caps; 2392 } 2393 2394 static void perf_pmu__compute_config_masks(struct perf_pmu *pmu) 2395 { 2396 struct perf_pmu_format *format; 2397 2398 if (pmu->config_masks_computed) 2399 return; 2400 2401 list_for_each_entry(format, &pmu->format, list) { 2402 unsigned int i; 2403 __u64 *mask; 2404 2405 if (format->value >= PERF_PMU_FORMAT_VALUE_CONFIG_END) 2406 continue; 2407 2408 pmu->config_masks_present = true; 2409 mask = &pmu->config_masks[format->value]; 2410 2411 for_each_set_bit(i, format->bits, PERF_PMU_FORMAT_BITS) 2412 *mask |= 1ULL << i; 2413 } 2414 pmu->config_masks_computed = true; 2415 } 2416 2417 void perf_pmu__warn_invalid_config(struct perf_pmu *pmu, __u64 config, 2418 const char *name, int config_num, 2419 const char *config_name) 2420 { 2421 __u64 bits; 2422 char buf[100]; 2423 2424 perf_pmu__compute_config_masks(pmu); 2425 2426 /* 2427 * Kernel doesn't export any valid format bits. 2428 */ 2429 if (!pmu->config_masks_present) 2430 return; 2431 2432 bits = config & ~pmu->config_masks[config_num]; 2433 if (bits == 0) 2434 return; 2435 2436 bitmap_scnprintf((unsigned long *)&bits, sizeof(bits) * 8, buf, sizeof(buf)); 2437 2438 pr_warning("WARNING: event '%s' not valid (bits %s of %s " 2439 "'%llx' not supported by kernel)!\n", 2440 name ?: "N/A", buf, config_name, config); 2441 } 2442 2443 bool perf_pmu__wildcard_match(const struct perf_pmu *pmu, const char *wildcard_to_match) 2444 { 2445 const char *names[2] = { 2446 pmu->name, 2447 pmu->alias_name, 2448 }; 2449 bool need_fnmatch = strisglob(wildcard_to_match); 2450 2451 if (!strncmp(wildcard_to_match, "uncore_", 7)) 2452 wildcard_to_match += 7; 2453 2454 for (size_t i = 0; i < ARRAY_SIZE(names); i++) { 2455 const char *pmu_name = names[i]; 2456 2457 if (!pmu_name) 2458 continue; 2459 2460 if (!strncmp(pmu_name, "uncore_", 7)) 2461 pmu_name += 7; 2462 2463 if (perf_pmu__match_wildcard(pmu_name, wildcard_to_match) || 2464 (need_fnmatch && !fnmatch(wildcard_to_match, pmu_name, 0))) 2465 return true; 2466 } 2467 return false; 2468 } 2469 2470 int perf_pmu__event_source_devices_scnprintf(char *pathname, size_t size) 2471 { 2472 const char *sysfs = sysfs__mountpoint(); 2473 2474 if (!sysfs) 2475 return 0; 2476 return scnprintf(pathname, size, "%s/bus/event_source/devices/", sysfs); 2477 } 2478 2479 int perf_pmu__event_source_devices_fd(void) 2480 { 2481 char path[PATH_MAX]; 2482 const char *sysfs = sysfs__mountpoint(); 2483 2484 if (!sysfs) 2485 return -1; 2486 2487 scnprintf(path, sizeof(path), "%s/bus/event_source/devices/", sysfs); 2488 return open(path, O_DIRECTORY); 2489 } 2490 2491 /* 2492 * Fill 'buf' with the path to a file or folder in 'pmu_name' in 2493 * sysfs. For example if pmu_name = "cs_etm" and 'filename' = "format" 2494 * then pathname will be filled with 2495 * "/sys/bus/event_source/devices/cs_etm/format" 2496 * 2497 * Return 0 if the sysfs mountpoint couldn't be found, if no characters were 2498 * written or if the buffer size is exceeded. 2499 */ 2500 int perf_pmu__pathname_scnprintf(char *buf, size_t size, 2501 const char *pmu_name, const char *filename) 2502 { 2503 size_t len; 2504 2505 len = perf_pmu__event_source_devices_scnprintf(buf, size); 2506 if (!len || (len + strlen(pmu_name) + strlen(filename) + 1) >= size) 2507 return 0; 2508 2509 return scnprintf(buf + len, size - len, "%s/%s", pmu_name, filename); 2510 } 2511 2512 int perf_pmu__pathname_fd(int dirfd, const char *pmu_name, const char *filename, int flags) 2513 { 2514 char path[PATH_MAX]; 2515 2516 scnprintf(path, sizeof(path), "%s/%s", pmu_name, filename); 2517 return openat(dirfd, path, flags); 2518 } 2519 2520 void perf_pmu__delete(struct perf_pmu *pmu) 2521 { 2522 if (!pmu) 2523 return; 2524 2525 if (perf_pmu__is_hwmon(pmu)) 2526 hwmon_pmu__exit(pmu); 2527 else if (perf_pmu__is_drm(pmu)) 2528 drm_pmu__exit(pmu); 2529 2530 perf_pmu__del_formats(&pmu->format); 2531 perf_pmu__del_aliases(pmu); 2532 perf_pmu__del_caps(pmu); 2533 2534 perf_cpu_map__put(pmu->cpus); 2535 2536 zfree(&pmu->name); 2537 zfree(&pmu->alias_name); 2538 zfree(&pmu->id); 2539 free(pmu); 2540 } 2541 2542 const char *perf_pmu__name_from_config(struct perf_pmu *pmu, u64 config) 2543 { 2544 struct hashmap_entry *entry; 2545 size_t bkt; 2546 2547 if (!pmu) 2548 return NULL; 2549 2550 pmu_aliases_parse(pmu); 2551 pmu_add_cpu_aliases(pmu); 2552 hashmap__for_each_entry(pmu->aliases, entry, bkt) { 2553 struct perf_pmu_alias *event = entry->pvalue; 2554 struct perf_event_attr attr = {.config = 0,}; 2555 2556 int ret = perf_pmu__config(pmu, &attr, &event->terms, /*apply_hardcoded=*/true, 2557 /*err=*/NULL); 2558 2559 if (ret == 0 && config == attr.config) 2560 return event->name; 2561 } 2562 return NULL; 2563 } 2564