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