Lines Matching +full:long +full:- +full:term

1 // SPDX-License-Identifier: GPL-2.0
25 #include <util/pmu-bison.h>
26 #include <util/pmu-flex.h>
27 #include "parse-events.h"
28 #include "print-events.h"
51 * struct perf_pmu_alias - An event either read from sysfs or builtin in
52 * pmu-events.c, created by parsing the pmu-events json files.
55 /** @name: Name of the event like "mem-loads". */
59 /** @long_desc: Optional long description. */
81 * <sysfs>/bus/event_source/devices/<pmu_name>/events/<name>.per-pkg or
103 * struct perf_pmu_format - Values from a format file read from
107 * "config:0-7" and will be represented here as name="event",
137 format->name = strdup(name); in perf_pmu__new_format()
138 if (!format->name) { in perf_pmu__new_format()
142 list_add_tail(&format->list, list); in perf_pmu__new_format()
147 void perf_pmu_format__set_value(void *vformat, int config, unsigned long *bits) in perf_pmu_format__set_value()
151 format->value = config; in perf_pmu_format__set_value()
152 memcpy(format->bits, bits, sizeof(format->bits)); in perf_pmu_format__set_value()
167 format->loaded = true; in __perf_pmu_format__load()
175 if (format->loaded) in perf_pmu_format__load()
178 if (!perf_pmu__pathname_scnprintf(path, sizeof(path), pmu->name, "format")) in perf_pmu_format__load()
181 assert(strlen(path) + strlen(format->name) + 2 < sizeof(path)); in perf_pmu_format__load()
183 strcat(path, format->name); in perf_pmu_format__load()
204 return -EINVAL; in perf_pmu__format_parse()
208 char *name = evt_ent->d_name; in perf_pmu__format_parse()
213 format = perf_pmu__new_format(&pmu->format, name); in perf_pmu__format_parse()
215 ret = -ENOMEM; in perf_pmu__format_parse()
224 ret = -errno; in perf_pmu__format_parse()
256 return -1; in pmu_format()
278 ret = -ENOMEM; in perf_pmu__convert_scale()
304 int fd, ret = -1; in perf_pmu__parse_scale()
310 scnprintf(path + len, sizeof(path) - len, "%s/events/%s.scale", pmu->name, alias->name); in perf_pmu__parse_scale()
313 if (fd == -1) in perf_pmu__parse_scale()
314 return -1; in perf_pmu__parse_scale()
319 sret = read(fd, scale, sizeof(scale)-1); in perf_pmu__parse_scale()
323 if (scale[sret - 1] == '\n') in perf_pmu__parse_scale()
324 scale[sret - 1] = '\0'; in perf_pmu__parse_scale()
328 ret = perf_pmu__convert_scale(scale, NULL, &alias->scale); in perf_pmu__parse_scale()
345 scnprintf(path + len, sizeof(path) - len, "%s/events/%s.unit", pmu->name, alias->name); in perf_pmu__parse_unit()
348 if (fd == -1) in perf_pmu__parse_unit()
349 return -1; in perf_pmu__parse_unit()
351 sret = read(fd, alias->unit, UNIT_MAX_LEN); in perf_pmu__parse_unit()
357 if (alias->unit[sret - 1] == '\n') in perf_pmu__parse_unit()
358 alias->unit[sret - 1] = '\0'; in perf_pmu__parse_unit()
360 alias->unit[sret] = '\0'; in perf_pmu__parse_unit()
365 alias->unit[0] = '\0'; in perf_pmu__parse_unit()
366 return -1; in perf_pmu__parse_unit()
380 scnprintf(path + len, sizeof(path) - len, "%s/events/%s.%s", pmu_name, event_name, suffix); in perf_pmu__parse_event_source_bool()
383 if (fd == -1) in perf_pmu__parse_event_source_bool()
402 alias->per_pkg = perf_pmu__parse_event_source_bool(pmu->name, alias->name, "per-pkg"); in perf_pmu__parse_per_pkg()
407 alias->snapshot = perf_pmu__parse_event_source_bool(pmu->name, alias->name, "snapshot"); in perf_pmu__parse_snapshot()
413 zfree(&newalias->name); in perf_pmu_free_alias()
414 zfree(&newalias->desc); in perf_pmu_free_alias()
415 zfree(&newalias->long_desc); in perf_pmu_free_alias()
416 zfree(&newalias->topic); in perf_pmu_free_alias()
417 zfree(&newalias->pmu_name); in perf_pmu_free_alias()
418 parse_events_terms__exit(&newalias->terms); in perf_pmu_free_alias()
426 list_for_each_entry_safe(alias, tmp, &pmu->aliases, list) { in perf_pmu__del_aliases()
427 list_del(&alias->list); in perf_pmu__del_aliases()
438 if (load && !pmu->sysfs_aliases_loaded) { in perf_pmu__find_alias()
462 list_for_each_entry(alias, &pmu->aliases, list) { in perf_pmu__find_alias()
463 if (!strcasecmp(alias->name, name)) in perf_pmu__find_alias()
489 if (!alias->from_sysfs || alias->info_loaded) in read_alias_info()
513 read_alias_info(data->pmu, data->alias); in update_alias()
514 assign_str(pe->name, "desc", &data->alias->desc, pe->desc); in update_alias()
515 assign_str(pe->name, "long_desc", &data->alias->long_desc, pe->long_desc); in update_alias()
516 assign_str(pe->name, "topic", &data->alias->topic, pe->topic); in update_alias()
517 data->alias->per_pkg = pe->perpkg; in update_alias()
518 if (pe->event) { in update_alias()
519 parse_events_terms__exit(&data->alias->terms); in update_alias()
520 ret = parse_events_terms(&data->alias->terms, pe->event, /*input=*/NULL); in update_alias()
522 if (!ret && pe->unit) { in update_alias()
525 ret = perf_pmu__convert_scale(pe->unit, &unit, &data->alias->scale); in update_alias()
527 snprintf(data->alias->unit, sizeof(data->alias->unit), "%s", unit); in update_alias()
547 long_desc = pe->long_desc; in perf_pmu__new_alias()
548 topic = pe->topic; in perf_pmu__new_alias()
549 unit = pe->unit; in perf_pmu__new_alias()
550 perpkg = pe->perpkg; in perf_pmu__new_alias()
551 deprecated = pe->deprecated; in perf_pmu__new_alias()
552 if (pe->pmu && strcmp(pe->pmu, "default_core")) in perf_pmu__new_alias()
553 pmu_name = pe->pmu; in perf_pmu__new_alias()
558 return -ENOMEM; in perf_pmu__new_alias()
560 parse_events_terms__init(&alias->terms); in perf_pmu__new_alias()
561 alias->scale = 1.0; in perf_pmu__new_alias()
562 alias->unit[0] = '\0'; in perf_pmu__new_alias()
563 alias->per_pkg = perpkg; in perf_pmu__new_alias()
564 alias->snapshot = false; in perf_pmu__new_alias()
565 alias->deprecated = deprecated; in perf_pmu__new_alias()
567 ret = parse_events_terms(&alias->terms, val, val_fd); in perf_pmu__new_alias()
574 alias->name = strdup(name); in perf_pmu__new_alias()
575 alias->desc = desc ? strdup(desc) : NULL; in perf_pmu__new_alias()
576 alias->long_desc = long_desc ? strdup(long_desc) : in perf_pmu__new_alias()
578 alias->topic = topic ? strdup(topic) : NULL; in perf_pmu__new_alias()
579 alias->pmu_name = pmu_name ? strdup(pmu_name) : NULL; in perf_pmu__new_alias()
581 if (perf_pmu__convert_scale(unit, (char **)&unit, &alias->scale) < 0) { in perf_pmu__new_alias()
583 return -1; in perf_pmu__new_alias()
585 snprintf(alias->unit, sizeof(alias->unit), "%s", unit); in perf_pmu__new_alias()
590 alias->from_sysfs = true; in perf_pmu__new_alias()
591 if (pmu->events_table) { in perf_pmu__new_alias()
597 if (pmu_events_table__find_event(pmu->events_table, pmu, name, in perf_pmu__new_alias()
599 pmu->cpu_common_json_aliases++; in perf_pmu__new_alias()
601 pmu->sysfs_aliases++; in perf_pmu__new_alias()
604 pmu->cpu_json_aliases++; in perf_pmu__new_alias()
607 pmu->sys_json_aliases++; in perf_pmu__new_alias()
611 list_add_tail(&alias->list, &pmu->aliases); in perf_pmu__new_alias()
620 if (len > 5 && !strcmp(name + len - 5, ".unit")) in pmu_alias_info_file()
622 if (len > 6 && !strcmp(name + len - 6, ".scale")) in pmu_alias_info_file()
624 if (len > 8 && !strcmp(name + len - 8, ".per-pkg")) in pmu_alias_info_file()
626 if (len > 9 && !strcmp(name + len - 9, ".snapshot")) in pmu_alias_info_file()
643 return -EINVAL; in __pmu_aliases_parse()
646 char *name = evt_ent->d_name; in __pmu_aliases_parse()
660 if (fd == -1) { in __pmu_aliases_parse()
678 pmu->sysfs_aliases_loaded = true; in __pmu_aliases_parse()
688 if (pmu->sysfs_aliases_loaded) in pmu_aliases_parse()
694 scnprintf(path + len, sizeof(path) - len, "%s/events", pmu->name); in pmu_aliases_parse()
697 if (events_dir_fd == -1) { in pmu_aliases_parse()
698 pmu->sysfs_aliases_loaded = true; in pmu_aliases_parse()
711 scnprintf(path, sizeof(path), "%s/events", pmu->name); in pmu_aliases_parse_eager()
713 if (events_dir_fd == -1) { in pmu_aliases_parse_eager()
714 pmu->sysfs_aliases_loaded = true; in pmu_aliases_parse_eager()
724 struct parse_events_term *term, *cloned; in pmu_alias_terms() local
728 list_for_each_entry(term, &alias->terms.terms, list) { in pmu_alias_terms()
729 int ret = parse_events_term__clone(&cloned, term); in pmu_alias_terms()
739 cloned->weak = true; in pmu_alias_terms()
740 cloned->err_term = cloned->err_val = err_loc; in pmu_alias_terms()
741 list_add_tail(&cloned->list, &clone_terms.terms); in pmu_alias_terms()
811 str[len - 1] = 0; /* remove line feed */ in pmu_id()
817 * is_sysfs_pmu_core() - PMU CORE devices have different name other than cpu in
844 return skip_duplicate_pmus && !pmu->is_core in pmu_deduped_name_len()
850 * perf_pmu__match_wildcard - Does the pmu_name start with tok and is then only
886 return (p - suffix) > 2; in perf_pmu__match_wildcard()
892 * perf_pmu__match_ignoring_suffix_uncore - Does the pmu_name match tok ignoring
923 * perf_pmu__match_wildcard_uncore - does to_match match the PMU's name?
924 * @pmu_name: The pmu->name or pmu->alias to match against.
1000 perf_pmu__new_alias(pmu, pe->name, pe->desc, pe->event, /*val_fd=*/ NULL, in pmu_add_cpu_aliases_map_callback()
1016 if (!pmu->events_table) in pmu_add_cpu_aliases()
1019 if (pmu->cpu_aliases_added) in pmu_add_cpu_aliases()
1022 pmu_add_cpu_aliases_table(pmu, pmu->events_table); in pmu_add_cpu_aliases()
1023 pmu->cpu_aliases_added = true; in pmu_add_cpu_aliases()
1032 if (!pe->compat || !pe->pmu) { in pmu_add_sys_aliases_iter_fn()
1037 if (!perf_pmu__match_wildcard_uncore(pmu->name, pe->pmu) && in pmu_add_sys_aliases_iter_fn()
1038 !perf_pmu__match_wildcard_uncore(pmu->alias_name, pe->pmu)) { in pmu_add_sys_aliases_iter_fn()
1043 if (pmu_uncore_identifier_match(pe->compat, pmu->id)) { in pmu_add_sys_aliases_iter_fn()
1046 pe->name, in pmu_add_sys_aliases_iter_fn()
1047 pe->desc, in pmu_add_sys_aliases_iter_fn()
1048 pe->event, in pmu_add_sys_aliases_iter_fn()
1058 if (!pmu->id) in pmu_add_sys_aliases()
1080 if (ret > 0 && line[ret - 1] == '\n') in pmu_find_alias_name()
1081 line[--ret] = '\0'; in pmu_find_alias_name()
1089 int max_precise = -1; in pmu_max_precise()
1098 if (pmu->is_core) in perf_pmu__arch_init()
1099 pmu->mem_events = perf_mem_events; in perf_pmu__arch_init()
1112 pmu->name = strdup(name); in perf_pmu__lookup()
1113 if (!pmu->name) in perf_pmu__lookup()
1123 INIT_LIST_HEAD(&pmu->format); in perf_pmu__lookup()
1124 INIT_LIST_HEAD(&pmu->aliases); in perf_pmu__lookup()
1125 INIT_LIST_HEAD(&pmu->caps); in perf_pmu__lookup()
1135 pmu->is_core = is_pmu_core(name); in perf_pmu__lookup()
1136 pmu->cpus = pmu_cpumask(dirfd, name, pmu->is_core); in perf_pmu__lookup()
1138 pmu->type = type; in perf_pmu__lookup()
1139 pmu->is_uncore = pmu_is_uncore(dirfd, name); in perf_pmu__lookup()
1140 if (pmu->is_uncore) in perf_pmu__lookup()
1141 pmu->id = pmu_id(name); in perf_pmu__lookup()
1142 pmu->max_precise = pmu_max_precise(dirfd, pmu); in perf_pmu__lookup()
1143 pmu->alias_name = pmu_find_alias_name(pmu, dirfd); in perf_pmu__lookup()
1144 pmu->events_table = perf_pmu__find_events_table(pmu); in perf_pmu__lookup()
1152 list_add_tail(&pmu->list, pmus); in perf_pmu__lookup()
1161 zfree(&pmu->name); in perf_pmu__lookup()
1174 pmu->name = strdup("cpu"); in perf_pmu__create_placeholder_core_pmu()
1175 if (!pmu->name) { in perf_pmu__create_placeholder_core_pmu()
1180 pmu->is_core = true; in perf_pmu__create_placeholder_core_pmu()
1181 pmu->type = PERF_TYPE_RAW; in perf_pmu__create_placeholder_core_pmu()
1182 pmu->cpus = cpu_map__online(); in perf_pmu__create_placeholder_core_pmu()
1184 INIT_LIST_HEAD(&pmu->format); in perf_pmu__create_placeholder_core_pmu()
1185 INIT_LIST_HEAD(&pmu->aliases); in perf_pmu__create_placeholder_core_pmu()
1186 INIT_LIST_HEAD(&pmu->caps); in perf_pmu__create_placeholder_core_pmu()
1187 list_add_tail(&pmu->list, core_pmus); in perf_pmu__create_placeholder_core_pmu()
1193 return pmu->type == PERF_PMU_TYPE_FAKE; in perf_pmu__is_fake()
1200 if (pmu->formats_checked) in perf_pmu__warn_invalid_formats()
1203 pmu->formats_checked = true; in perf_pmu__warn_invalid_formats()
1209 list_for_each_entry(format, &pmu->format, list) { in perf_pmu__warn_invalid_formats()
1211 if (format->value >= PERF_PMU_FORMAT_VALUE_CONFIG_END) { in perf_pmu__warn_invalid_formats()
1214 pmu->name, format->name, format->value); in perf_pmu__warn_invalid_formats()
1224 if (evsel->needs_auxtrace_mmap) in evsel__is_aux_event()
1228 return pmu && pmu->auxtrace; in evsel__is_aux_event()
1232 * Set @config_name to @val as long as the user hasn't already set or cleared it
1233 * by passing a config term on the command line.
1239 #define field_prep(_mask, _val) (((_val) << (ffsll(_mask) - 1)) & (_mask))
1244 struct evsel_config_term *term = evsel__get_config_term(evsel, CFG_CHG); in evsel__set_config_if_unset() local
1246 if (term) in evsel__set_config_if_unset()
1247 user_bits = term->val.cfg_chg; in evsel__set_config_if_unset()
1256 evsel->core.attr.config &= ~bits; in evsel__set_config_if_unset()
1257 evsel->core.attr.config |= field_prep(bits, val); in evsel__set_config_if_unset()
1266 if (!strcmp(format->name, name)) in pmu_find_format()
1274 struct perf_pmu_format *format = pmu_find_format(&pmu->format, name); in perf_pmu__format_bits()
1281 for_each_set_bit(fbit, format->bits, PERF_PMU_FORMAT_BITS) in perf_pmu__format_bits()
1289 struct perf_pmu_format *format = pmu_find_format(&pmu->format, name); in perf_pmu__format_type()
1292 return -1; in perf_pmu__format_type()
1295 return format->value; in perf_pmu__format_type()
1302 static void pmu_format_value(unsigned long *format, __u64 value, __u64 *v, in pmu_format_value()
1305 unsigned long fbit, vbit; in pmu_format_value()
1319 static __u64 pmu_format_max_value(const unsigned long *format) in pmu_format_max_value()
1327 return (1ULL << w) - 1; in pmu_format_max_value()
1328 return -1; in pmu_format_max_value()
1332 * Term is a string term, and might be a param-term. Try to look up it's value
1334 * - We have a term like "base-or-format-term=param-term",
1335 * - We need to find the value supplied for "param-term" (with param-term named
1336 * in a config string) later on in the term list.
1338 static int pmu_resolve_param_term(struct parse_events_term *term, in pmu_resolve_param_term() argument
1344 list_for_each_entry(t, &head_terms->terms, list) { in pmu_resolve_param_term()
1345 if (t->type_val == PARSE_EVENTS__TERM_TYPE_NUM && in pmu_resolve_param_term()
1346 t->config && !strcmp(t->config, term->config)) { in pmu_resolve_param_term()
1347 t->used = true; in pmu_resolve_param_term()
1348 *value = t->val.num; in pmu_resolve_param_term()
1354 printf("Required parameter '%s' not specified\n", term->config); in pmu_resolve_param_term()
1356 return -1; in pmu_resolve_param_term()
1371 if (strbuf_addf(&buf, i++ ? ",%s" : "%s", format->name) < 0) in pmu_formats_string()
1383 * user input data - term parameter.
1387 struct parse_events_term *term, in pmu_config_term() argument
1397 * If this is a parameter we've already used for parameterized-eval, in pmu_config_term()
1400 if (term->used) in pmu_config_term()
1408 if (parse_events__is_hardcoded_term(term)) { in pmu_config_term()
1417 switch (term->type_term) { in pmu_config_term()
1419 assert(term->type_val == PARSE_EVENTS__TERM_TYPE_NUM); in pmu_config_term()
1420 pmu_format_value(bits, term->val.num, &attr->config, zero); in pmu_config_term()
1423 assert(term->type_val == PARSE_EVENTS__TERM_TYPE_NUM); in pmu_config_term()
1424 pmu_format_value(bits, term->val.num, &attr->config1, zero); in pmu_config_term()
1427 assert(term->type_val == PARSE_EVENTS__TERM_TYPE_NUM); in pmu_config_term()
1428 pmu_format_value(bits, term->val.num, &attr->config2, zero); in pmu_config_term()
1431 assert(term->type_val == PARSE_EVENTS__TERM_TYPE_NUM); in pmu_config_term()
1432 pmu_format_value(bits, term->val.num, &attr->config3, zero); in pmu_config_term()
1435 return -EINVAL; in pmu_config_term()
1437 /* Skip non-config terms. */ in pmu_config_term()
1445 format = pmu_find_format(&pmu->format, term->config); in pmu_config_term()
1447 char *pmu_term = pmu_formats_string(&pmu->format); in pmu_config_term()
1452 "unknown term '%s' for pmu '%s'", in pmu_config_term()
1453 term->config, pmu->name) < 0) in pmu_config_term()
1457 parse_events_error__handle(err, term->err_term, in pmu_config_term()
1465 return -EINVAL; in pmu_config_term()
1468 switch (format->value) { in pmu_config_term()
1470 vp = &attr->config; in pmu_config_term()
1473 vp = &attr->config1; in pmu_config_term()
1476 vp = &attr->config2; in pmu_config_term()
1479 vp = &attr->config3; in pmu_config_term()
1482 return -EINVAL; in pmu_config_term()
1486 * Either directly use a numeric term, or try to translate string terms in pmu_config_term()
1489 if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM) { in pmu_config_term()
1490 if (term->no_value && in pmu_config_term()
1491 bitmap_weight(format->bits, PERF_PMU_FORMAT_BITS) > 1) { in pmu_config_term()
1493 parse_events_error__handle(err, term->err_val, in pmu_config_term()
1494 strdup("no value assigned for term"), in pmu_config_term()
1497 return -EINVAL; in pmu_config_term()
1500 val = term->val.num; in pmu_config_term()
1501 } else if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) { in pmu_config_term()
1502 if (strcmp(term->val.str, "?")) { in pmu_config_term()
1505 term->config, term->val.str); in pmu_config_term()
1508 parse_events_error__handle(err, term->err_val, in pmu_config_term()
1512 return -EINVAL; in pmu_config_term()
1515 if (pmu_resolve_param_term(term, head_terms, &val)) in pmu_config_term()
1516 return -EINVAL; in pmu_config_term()
1518 return -EINVAL; in pmu_config_term()
1520 max_val = pmu_format_max_value(format->bits); in pmu_config_term()
1527 format->name, (unsigned long long)max_val) < 0) { in pmu_config_term()
1530 parse_events_error__handle(err, term->err_val, err_str, /*help=*/NULL); in pmu_config_term()
1531 return -EINVAL; in pmu_config_term()
1539 pmu_format_value(format->bits, val, vp, zero); in pmu_config_term()
1549 struct parse_events_term *term; in perf_pmu__config_terms() local
1554 list_for_each_entry(term, &terms->terms, list) { in perf_pmu__config_terms()
1555 if (pmu_config_term(pmu, attr, term, terms, zero, apply_hardcoded, err)) in perf_pmu__config_terms()
1556 return -EINVAL; in perf_pmu__config_terms()
1564 * 1) users input - specified in terms parameter
1565 * 2) pmu format definitions - specified by pmu parameter
1572 bool zero = !!pmu->perf_event_attr_init_default; in perf_pmu__config()
1582 struct parse_events_term *term) in pmu_find_alias() argument
1587 if (parse_events__is_hardcoded_term(term)) in pmu_find_alias()
1590 if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM) { in pmu_find_alias()
1591 if (!term->no_value) in pmu_find_alias()
1593 if (pmu_find_format(&pmu->format, term->config)) in pmu_find_alias()
1595 name = term->config; in pmu_find_alias()
1597 } else if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) { in pmu_find_alias()
1598 if (strcasecmp(term->config, "event")) in pmu_find_alias()
1600 name = term->val.str; in pmu_find_alias()
1606 if (alias || pmu->cpu_aliases_added) in pmu_find_alias()
1610 if (pmu->events_table && in pmu_find_alias()
1611 pmu_events_table__find_event(pmu->events_table, pmu, name, in pmu_find_alias()
1628 * Only one term in event definition can in check_info_data()
1632 if (info->unit && alias->unit[0]) { in check_info_data()
1636 return -EINVAL; in check_info_data()
1638 if (info->scale && alias->scale) { in check_info_data()
1642 return -EINVAL; in check_info_data()
1644 if (info->snapshot && alias->snapshot) { in check_info_data()
1648 return -EINVAL; in check_info_data()
1651 if (alias->unit[0]) in check_info_data()
1652 info->unit = alias->unit; in check_info_data()
1654 if (alias->scale) in check_info_data()
1655 info->scale = alias->scale; in check_info_data()
1657 if (alias->snapshot) in check_info_data()
1658 info->snapshot = alias->snapshot; in check_info_data()
1671 struct parse_events_term *term, *h; in perf_pmu__check_alias() local
1676 info->per_pkg = false; in perf_pmu__check_alias()
1682 info->unit = NULL; in perf_pmu__check_alias()
1683 info->scale = 0.0; in perf_pmu__check_alias()
1684 info->snapshot = false; in perf_pmu__check_alias()
1695 list_for_each_entry_safe(term, h, &head_terms->terms, list) { in perf_pmu__check_alias()
1696 alias = pmu_find_alias(pmu, term); in perf_pmu__check_alias()
1699 ret = pmu_alias_terms(alias, term->err_term, &term->list); in perf_pmu__check_alias()
1701 parse_events_error__handle(err, term->err_term, in perf_pmu__check_alias()
1708 ret = check_info_data(pmu, alias, info, err, term->err_term); in perf_pmu__check_alias()
1712 if (alias->per_pkg) in perf_pmu__check_alias()
1713 info->per_pkg = true; in perf_pmu__check_alias()
1715 if (term->alternate_hw_config) in perf_pmu__check_alias()
1716 *alternate_hw_config = term->val.num; in perf_pmu__check_alias()
1718 list_del_init(&term->list); in perf_pmu__check_alias()
1719 parse_events_term__delete(term); in perf_pmu__check_alias()
1727 if (info->unit == NULL) in perf_pmu__check_alias()
1728 info->unit = ""; in perf_pmu__check_alias()
1730 if (info->scale == 0.0) in perf_pmu__check_alias()
1731 info->scale = 1.0; in perf_pmu__check_alias()
1746 if (!strcmp(args->event, info->name)) in find_event_callback()
1747 return args->cb(args->state, info); in find_event_callback()
1760 /* Sub-optimal, but function is only used by tests. */ in perf_pmu__find_event()
1770 list_del(&fmt->list); in perf_pmu__del_formats()
1771 zfree(&fmt->name); in perf_pmu__del_formats()
1780 list_for_each_entry(format, &pmu->format, list) { in perf_pmu__has_format()
1781 if (!strcmp(format->name, name)) in perf_pmu__has_format()
1799 "call-graph=(fp|dwarf|lbr)", in perf_pmu__for_each_format()
1800 "stack-size=number", in perf_pmu__for_each_format()
1801 "max-stack=number", in perf_pmu__for_each_format()
1804 "no-inherit", in perf_pmu__for_each_format()
1806 "no-overwrite", in perf_pmu__for_each_format()
1808 "aux-output", in perf_pmu__for_each_format()
1809 "aux-action=(pause|resume|start-paused)", in perf_pmu__for_each_format()
1810 "aux-sample-size=number", in perf_pmu__for_each_format()
1816 * max-events and driver-config are missing above as are the internal in perf_pmu__for_each_format()
1817 * types user, metric-id, raw, legacy cache and hardware. Assert against in perf_pmu__for_each_format()
1820 _Static_assert(ARRAY_SIZE(terms) == __PARSE_EVENTS__TERM_TYPE_NR - 6, in perf_pmu__for_each_format()
1822 list_for_each_entry(format, &pmu->format, list) { in perf_pmu__for_each_format()
1824 ret = cb(state, format->name, (int)format->value, format->bits); in perf_pmu__for_each_format()
1828 if (!pmu->is_core) in perf_pmu__for_each_format()
1851 return pmu->is_core; in perf_pmu__supports_legacy_cache()
1856 return !pmu->is_core || perf_pmus__num_core_pmus() == 1; in perf_pmu__auto_merge_stats()
1869 if (pmu->cpu_aliases_added || !pmu->events_table) in perf_pmu__have_event()
1871 return pmu_events_table__find_event(pmu->events_table, pmu, name, NULL, NULL) == 0; in perf_pmu__have_event()
1882 nr = pmu->sysfs_aliases + pmu->sys_json_aliases; in perf_pmu__num_events()
1884 if (pmu->cpu_aliases_added) in perf_pmu__num_events()
1885 nr += pmu->cpu_json_aliases; in perf_pmu__num_events()
1886 else if (pmu->events_table) in perf_pmu__num_events()
1887 nr += pmu_events_table__num_events(pmu->events_table, pmu) - in perf_pmu__num_events()
1888 pmu->cpu_common_json_aliases; in perf_pmu__num_events()
1890 assert(pmu->cpu_json_aliases == 0 && pmu->cpu_common_json_aliases == 0); in perf_pmu__num_events()
1893 nr -= tool_pmu__num_skip_events(); in perf_pmu__num_events()
1895 return pmu->selectable ? nr + 1 : nr; in perf_pmu__num_events()
1902 return a - b; in sub_non_neg()
1908 struct parse_events_term *term; in format_alias() local
1909 size_t pmu_name_len = pmu_deduped_name_len(pmu, pmu->name, in format_alias()
1911 int used = snprintf(buf, len, "%.*s/%s", (int)pmu_name_len, pmu->name, alias->name); in format_alias()
1913 list_for_each_entry(term, &alias->terms.terms, list) { in format_alias()
1914 if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) in format_alias()
1916 ",%s=%s", term->config, in format_alias()
1917 term->val.str); in format_alias()
1928 buf[len - 1] = '\0'; in format_alias()
1951 list_for_each_entry(event, &pmu->aliases, list) { in perf_pmu__for_each_event()
1954 if (perf_pmu__is_tool(pmu) && tool_pmu__skip_event(event->name)) in perf_pmu__for_each_event()
1957 info.pmu_name = event->pmu_name ?: pmu->name; in perf_pmu__for_each_event()
1961 if (event->desc) { in perf_pmu__for_each_event()
1962 info.name = event->name; in perf_pmu__for_each_event()
1967 if (pmu->is_core) { in perf_pmu__for_each_event()
1969 info.name = event->name; in perf_pmu__for_each_event()
1974 if (strlen(event->unit) || event->scale != 1.0) { in perf_pmu__for_each_event()
1976 buf_used += snprintf(buf + buf_used, sizeof(buf) - buf_used, in perf_pmu__for_each_event()
1977 "%G%s", event->scale, event->unit) + 1; in perf_pmu__for_each_event()
1979 info.desc = event->desc; in perf_pmu__for_each_event()
1980 info.long_desc = event->long_desc; in perf_pmu__for_each_event()
1982 parse_events_terms__to_strbuf(&event->terms, &sb); in perf_pmu__for_each_event()
1983 buf_used += snprintf(buf + buf_used, sizeof(buf) - buf_used, in perf_pmu__for_each_event()
1985 info.topic = event->topic; in perf_pmu__for_each_event()
1987 info.deprecated = event->deprecated; in perf_pmu__for_each_event()
1993 if (pmu->selectable) { in perf_pmu__for_each_event()
1995 snprintf(buf, sizeof(buf), "%s//", pmu->name); in perf_pmu__for_each_event()
2002 info.pmu_name = pmu->name; in perf_pmu__for_each_event()
2014 pmu->name, in perf_pmu___name_match()
2015 pmu->alias_name, in perf_pmu___name_match()
2017 if (pmu->is_core) { in perf_pmu___name_match()
2038 if (!pmu->is_uncore) { in perf_pmu___name_match()
2068 * perf_pmu__name_wildcard_match - Called by the jevents generated code to see
2079 * perf_pmu__name_no_suffix_match - Does pmu's name match to_match ignoring any
2097 if (pmu->is_core || pmu->is_uncore || pmu->auxtrace) in perf_pmu__is_software()
2099 switch (pmu->type) { in perf_pmu__is_software()
2110 if (!strcmp(pmu->name, known_sw_pmus[i])) in perf_pmu__is_software()
2120 if (!perf_pmu__pathname_scnprintf(path, sizeof(path), pmu->name, name) || in perf_pmu__open_file()
2131 fd = perf_pmu__pathname_fd(dirfd, pmu->name, name, O_RDONLY); in perf_pmu__open_file_at()
2176 if (!perf_pmu__pathname_scnprintf(path, sizeof(path), pmu->name, name)) in perf_pmu__file_exists()
2187 return -ENOMEM; in perf_pmu__new_caps()
2189 caps->name = strdup(name); in perf_pmu__new_caps()
2190 if (!caps->name) in perf_pmu__new_caps()
2192 caps->value = strndup(value, strlen(value) - 1); in perf_pmu__new_caps()
2193 if (!caps->value) in perf_pmu__new_caps()
2195 list_add_tail(&caps->list, list); in perf_pmu__new_caps()
2199 zfree(&caps->name); in perf_pmu__new_caps()
2203 return -ENOMEM; in perf_pmu__new_caps()
2210 list_for_each_entry_safe(caps, tmp, &pmu->caps, list) { in perf_pmu__del_caps()
2211 list_del(&caps->list); in perf_pmu__del_caps()
2212 zfree(&caps->name); in perf_pmu__del_caps()
2213 zfree(&caps->value); in perf_pmu__del_caps()
2231 if (pmu->caps_initialized) in perf_pmu__caps_parse()
2232 return pmu->nr_caps; in perf_pmu__caps_parse()
2234 pmu->nr_caps = 0; in perf_pmu__caps_parse()
2236 if (!perf_pmu__pathname_scnprintf(caps_path, sizeof(caps_path), pmu->name, "caps")) in perf_pmu__caps_parse()
2237 return -1; in perf_pmu__caps_parse()
2240 pmu->caps_initialized = true; in perf_pmu__caps_parse()
2246 return -EINVAL; in perf_pmu__caps_parse()
2251 char *name = evt_ent->d_name; in perf_pmu__caps_parse()
2260 if (fd == -1) in perf_pmu__caps_parse()
2269 (perf_pmu__new_caps(&pmu->caps, name, value) < 0)) { in perf_pmu__caps_parse()
2274 pmu->nr_caps++; in perf_pmu__caps_parse()
2280 pmu->caps_initialized = true; in perf_pmu__caps_parse()
2281 return pmu->nr_caps; in perf_pmu__caps_parse()
2288 if (pmu->config_masks_computed) in perf_pmu__compute_config_masks()
2291 list_for_each_entry(format, &pmu->format, list) { in perf_pmu__compute_config_masks()
2295 if (format->value >= PERF_PMU_FORMAT_VALUE_CONFIG_END) in perf_pmu__compute_config_masks()
2298 pmu->config_masks_present = true; in perf_pmu__compute_config_masks()
2299 mask = &pmu->config_masks[format->value]; in perf_pmu__compute_config_masks()
2301 for_each_set_bit(i, format->bits, PERF_PMU_FORMAT_BITS) in perf_pmu__compute_config_masks()
2304 pmu->config_masks_computed = true; in perf_pmu__compute_config_masks()
2319 if (!pmu->config_masks_present) in perf_pmu__warn_invalid_config()
2322 bits = config & ~pmu->config_masks[config_num]; in perf_pmu__warn_invalid_config()
2326 bitmap_scnprintf((unsigned long *)&bits, sizeof(bits) * 8, buf, sizeof(buf)); in perf_pmu__warn_invalid_config()
2336 pmu->name, in perf_pmu__wildcard_match()
2337 pmu->alias_name, in perf_pmu__wildcard_match()
2375 return -1; in perf_pmu__event_source_devices_fd()
2399 return scnprintf(buf + len, size - len, "%s/%s", pmu_name, filename); in perf_pmu__pathname_scnprintf()
2415 perf_pmu__del_formats(&pmu->format); in perf_pmu__delete()
2419 perf_cpu_map__put(pmu->cpus); in perf_pmu__delete()
2421 zfree(&pmu->name); in perf_pmu__delete()
2422 zfree(&pmu->alias_name); in perf_pmu__delete()
2423 zfree(&pmu->id); in perf_pmu__delete()
2436 list_for_each_entry(event, &pmu->aliases, list) { in perf_pmu__name_from_config()
2439 int ret = perf_pmu__config(pmu, &attr, &event->terms, /*apply_hardcoded=*/true, in perf_pmu__name_from_config()
2443 return event->name; in perf_pmu__name_from_config()