Lines Matching +full:ref +full:- +full:clock +full:- +full:period +full:- +full:ns

1 // SPDX-License-Identifier: GPL-2.0
12 #include <subcmd/parse-options.h>
13 #include "parse-events.h"
16 #include "bpf-loader.h"
20 #include "parse-events-bison.h"
21 #include "parse-events-flex.h"
24 #include "util/parse-branch-options.h"
28 #include "util/parse-events-hybrid.h"
29 #include "util/pmu-hybrid.h"
54 * -1 means failed to init, don't try anymore
61 .symbol = "cpu-cycles",
69 .symbol = "cache-references",
73 .symbol = "cache-misses",
77 .symbol = "branch-instructions",
81 .symbol = "branch-misses",
85 .symbol = "bus-cycles",
89 .symbol = "stalled-cycles-frontend",
90 .alias = "idle-cycles-frontend",
93 .symbol = "stalled-cycles-backend",
94 .alias = "idle-cycles-backend",
97 .symbol = "ref-cycles",
104 .symbol = "cpu-clock",
108 .symbol = "task-clock",
112 .symbol = "page-faults",
116 .symbol = "context-switches",
120 .symbol = "cpu-migrations",
124 .symbol = "minor-faults",
128 .symbol = "major-faults",
132 .symbol = "alignment-faults",
136 .symbol = "emulation-faults",
144 .symbol = "bpf-output",
148 .symbol = "cgroup-switches",
173 if (open_return == -EACCES) { in is_event_supported()
177 * Re-run with exclude_kernel set; we don't do that in is_event_supported()
181 evsel->core.attr.exclude_kernel = 1; in is_event_supported()
204 return "hardware-cache"; in event_type()
221 if (term->type_term == type_term) in get_config_str()
222 return term->val.str; in get_config_str()
246 struct perf_cpu_map *cpus = pmu ? perf_cpu_map__get(pmu->cpus) : in __add_event()
252 if (pmu && attr->type == PERF_TYPE_RAW) in __add_event()
253 perf_pmu__warn_invalid_config(pmu, attr->config, name); in __add_event()
265 evsel->core.cpus = cpus; in __add_event()
266 evsel->core.own_cpus = perf_cpu_map__get(cpus); in __add_event()
267 evsel->core.requires_cpu = pmu ? pmu->is_uncore : false; in __add_event()
268 evsel->auto_merge_stats = auto_merge_stats; in __add_event()
271 evsel->name = strdup(name); in __add_event()
274 evsel->metric_id = strdup(metric_id); in __add_event()
277 list_splice_init(config_terms, &evsel->config_terms); in __add_event()
280 list_add_tail(&evsel->core.node, list); in __add_event()
300 /*auto_merge_stats=*/false, /*cpu_list=*/NULL) ? 0 : -ENOMEM; in add_event()
317 return -ENOMEM; in add_event_tool()
318 evsel->tool_event = tool_event; in add_event_tool()
322 free((char *)evsel->unit); in add_event_tool()
323 evsel->unit = strdup("ns"); in add_event_tool()
331 int n, longest = -1; in parse_aliases()
343 return -1; in parse_aliases()
367 int cache_type = -1, cache_op = -1, cache_result = -1; in parse_events_add_cache()
373 * No fallback - if we cannot get a clear cache type in parse_events_add_cache()
377 if (cache_type == -1) in parse_events_add_cache()
378 return -EINVAL; in parse_events_add_cache()
386 n += snprintf(name + n, MAX_NAME_LEN - n, "-%s", str); in parse_events_add_cache()
388 if (cache_op == -1) { in parse_events_add_cache()
393 return -EINVAL; in parse_events_add_cache()
398 if (cache_result == -1) { in parse_events_add_cache()
409 if (cache_op == -1) in parse_events_add_cache()
415 if (cache_result == -1) in parse_events_add_cache()
425 return -EINVAL; in parse_events_add_cache()
428 return -ENOMEM; in parse_events_add_cache()
494 return -ENOMEM; in add_tracepoint()
495 list_splice(&config_terms, &evsel->config_terms); in add_tracepoint()
498 list_add_tail(&evsel->core.node, list); in add_tracepoint()
515 return -1; in add_tracepoint_multi_event()
521 return -1; in add_tracepoint_multi_event()
525 if (!strcmp(evt_ent->d_name, ".") in add_tracepoint_multi_event()
526 || !strcmp(evt_ent->d_name, "..") in add_tracepoint_multi_event()
527 || !strcmp(evt_ent->d_name, "enable") in add_tracepoint_multi_event()
528 || !strcmp(evt_ent->d_name, "filter")) in add_tracepoint_multi_event()
531 if (!strglobmatch(evt_ent->d_name, evt_name)) in add_tracepoint_multi_event()
536 ret = add_tracepoint(list, idx, sys_name, evt_ent->d_name, in add_tracepoint_multi_event()
542 ret = -1; in add_tracepoint_multi_event()
574 return -1; in add_tracepoint_multi_sys()
578 if (!strcmp(events_ent->d_name, ".") in add_tracepoint_multi_sys()
579 || !strcmp(events_ent->d_name, "..") in add_tracepoint_multi_sys()
580 || !strcmp(events_ent->d_name, "enable") in add_tracepoint_multi_sys()
581 || !strcmp(events_ent->d_name, "header_event") in add_tracepoint_multi_sys()
582 || !strcmp(events_ent->d_name, "header_page")) in add_tracepoint_multi_sys()
585 if (!strglobmatch(events_ent->d_name, sys_name)) in add_tracepoint_multi_sys()
588 ret = add_tracepoint_event(list, idx, events_ent->d_name, in add_tracepoint_multi_sys()
608 struct parse_events_state *parse_state = param->parse_state; in add_bpf_event()
609 struct list_head *list = param->list; in add_bpf_event()
625 err = parse_events_add_tracepoint(&new_evsels, &parse_state->idx, group, in add_bpf_event()
626 event, parse_state->error, in add_bpf_event()
627 param->head_config); in add_bpf_event()
634 list_del_init(&evsel->core.node); in add_bpf_event()
644 pos->bpf_fd = fd; in add_bpf_event()
645 pos->bpf_obj = obj; in add_bpf_event()
664 err = -EINVAL; in parse_events_load_bpf_obj()
699 parse_events_error__handle(parse_state->error, 0, in parse_events_load_bpf_obj()
700 strdup(errbuf), strdup("(add -v to see detail)")); in parse_events_load_bpf_obj()
718 if (term->type_term != PARSE_EVENTS__TERM_TYPE_USER) { in parse_events_config_bpf()
719 parse_events_error__handle(parse_state->error, term->err_term, in parse_events_config_bpf()
722 return -EINVAL; in parse_events_config_bpf()
725 err = bpf__config_obj(obj, term, parse_state->evlist, &error_pos); in parse_events_config_bpf()
730 bpf__strerror_config_obj(obj, term, parse_state->evlist, in parse_events_config_bpf()
734 if (err == -BPF_LOADER_ERRNO__OBJCONF_MAP_VALUE) in parse_events_config_bpf()
735 idx = term->err_val; in parse_events_config_bpf()
737 idx = term->err_term + error_pos; in parse_events_config_bpf()
739 parse_events_error__handle(parse_state->error, idx, in parse_events_config_bpf()
747 " \t(add -v to see detail)")); in parse_events_config_bpf()
756 * perf record -e bpf.c/call-graph=fp,map:array.value[0]=1/ ...
757 * 'call-graph=fp' is 'evt config', should be applied to each
780 list_move_tail(&term->list, obj_head_config); in split_bpf_config_terms()
802 if (err == -ENOTSUP) in parse_events_load_bpf()
808 -err, errbuf, in parse_events_load_bpf()
811 parse_events_error__handle(parse_state->error, 0, in parse_events_load_bpf()
812 strdup(errbuf), strdup("(add -v to see detail)")); in parse_events_load_bpf()
835 parse_events_error__handle(parse_state->error, 0, in parse_events_load_bpf_obj()
837 strdup("Make sure libbpf-devel is available at build time.")); in parse_events_load_bpf_obj()
838 return -ENOTSUP; in parse_events_load_bpf_obj()
847 parse_events_error__handle(parse_state->error, 0, in parse_events_load_bpf()
849 strdup("Make sure libbpf-devel is available at build time.")); in parse_events_load_bpf()
850 return -ENOTSUP; in parse_events_load_bpf()
865 if (attr->bp_type & bit) \ in parse_breakpoint_type()
866 return -EINVAL; \ in parse_breakpoint_type()
868 attr->bp_type |= bit; \ in parse_breakpoint_type()
882 return -EINVAL; in parse_breakpoint_type()
888 if (!attr->bp_type) /* Default */ in parse_breakpoint_type()
889 attr->bp_type = HW_BREAKPOINT_R | HW_BREAKPOINT_W; in parse_breakpoint_type()
903 return -EINVAL; in parse_events_add_breakpoint()
926 if (type == term->type_val) in check_type_val()
930 parse_events_error__handle(err, term->err_val, in check_type_val()
936 return -EINVAL; in check_type_val()
940 * Update according to parse-events.l
948 [PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD] = "period",
952 [PARSE_EVENTS__TERM_TYPE_CALLGRAPH] = "call-graph",
953 [PARSE_EVENTS__TERM_TYPE_STACKSIZE] = "stack-size",
954 [PARSE_EVENTS__TERM_TYPE_NOINHERIT] = "no-inherit",
956 [PARSE_EVENTS__TERM_TYPE_MAX_STACK] = "max-stack",
959 [PARSE_EVENTS__TERM_TYPE_NOOVERWRITE] = "no-overwrite",
960 [PARSE_EVENTS__TERM_TYPE_DRV_CFG] = "driver-config",
962 [PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT] = "aux-output",
963 [PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE] = "aux-sample-size",
964 [PARSE_EVENTS__TERM_TYPE_METRIC_ID] = "metric-id",
975 parse_events_error__handle(err, -1, in config_term_avail()
998 parse_events_error__handle(err, -1, err_str, NULL); in config_term_avail()
1015 return -EINVAL; \ in config_term_common()
1018 switch (term->type_term) { in config_term_common()
1021 attr->config = term->val.num; in config_term_common()
1025 attr->config1 = term->val.num; in config_term_common()
1029 attr->config2 = term->val.num; in config_term_common()
1039 if (strcmp(term->val.str, "no") && in config_term_common()
1040 parse_branch_str(term->val.str, in config_term_common()
1041 &attr->branch_sample_type)) { in config_term_common()
1042 parse_events_error__handle(err, term->err_val, in config_term_common()
1045 return -EINVAL; in config_term_common()
1050 if (term->val.num > 1) { in config_term_common()
1051 parse_events_error__handle(err, term->err_val, in config_term_common()
1054 return -EINVAL; in config_term_common()
1089 if ((unsigned int)term->val.num > 1) { in config_term_common()
1090 parse_events_error__handle(err, term->err_val, in config_term_common()
1093 return -EINVAL; in config_term_common()
1101 if (term->val.num > UINT_MAX) { in config_term_common()
1102 parse_events_error__handle(err, term->err_val, in config_term_common()
1105 return -EINVAL; in config_term_common()
1109 parse_events_error__handle(err, term->err_term, in config_term_common()
1112 return -EINVAL; in config_term_common()
1124 if (!config_term_avail(term->type_term, err)) in config_term_common()
1125 return -EINVAL; in config_term_common()
1134 if (term->type_term == PARSE_EVENTS__TERM_TYPE_USER || in config_term_pmu()
1135 term->type_term == PARSE_EVENTS__TERM_TYPE_DRV_CFG) in config_term_pmu()
1149 switch (term->type_term) { in config_term_tracepoint()
1163 parse_events_error__handle(err, term->err_term, in config_term_tracepoint()
1165 strdup("valid terms: call-graph,stack-size\n")); in config_term_tracepoint()
1167 return -EINVAL; in config_term_tracepoint()
1182 return -EINVAL; in config_attr()
1195 return -ENOMEM; \ in get_config_terms()
1197 INIT_LIST_HEAD(&__t->list); \ in get_config_terms()
1198 __t->type = EVSEL__CONFIG_TERM_ ## __type; \ in get_config_terms()
1199 __t->weak = __weak; \ in get_config_terms()
1200 list_add_tail(&__t->list, head_terms) in get_config_terms()
1205 __t->val.__name = __val; \ in get_config_terms()
1211 __t->val.str = strdup(__val); \ in get_config_terms()
1212 if (!__t->val.str) { \ in get_config_terms()
1214 return -ENOMEM; \ in get_config_terms()
1216 __t->free_str = true; \ in get_config_terms()
1222 switch (term->type_term) { in get_config_terms()
1224 ADD_CONFIG_TERM_VAL(PERIOD, period, term->val.num, term->weak); in get_config_terms()
1227 ADD_CONFIG_TERM_VAL(FREQ, freq, term->val.num, term->weak); in get_config_terms()
1230 ADD_CONFIG_TERM_VAL(TIME, time, term->val.num, term->weak); in get_config_terms()
1233 ADD_CONFIG_TERM_STR(CALLGRAPH, term->val.str, term->weak); in get_config_terms()
1236 ADD_CONFIG_TERM_STR(BRANCH, term->val.str, term->weak); in get_config_terms()
1240 term->val.num, term->weak); in get_config_terms()
1244 term->val.num ? 1 : 0, term->weak); in get_config_terms()
1248 term->val.num ? 0 : 1, term->weak); in get_config_terms()
1252 term->val.num, term->weak); in get_config_terms()
1256 term->val.num, term->weak); in get_config_terms()
1260 term->val.num ? 1 : 0, term->weak); in get_config_terms()
1264 term->val.num ? 0 : 1, term->weak); in get_config_terms()
1267 ADD_CONFIG_TERM_STR(DRV_CFG, term->val.str, term->weak); in get_config_terms()
1271 term->val.num ? true : false, term->weak); in get_config_terms()
1275 term->val.num ? 1 : 0, term->weak); in get_config_terms()
1279 term->val.num, term->weak); in get_config_terms()
1290 * each bit of attr->config that the user has changed.
1300 switch (term->type_term) { in get_config_chgs()
1302 type = perf_pmu__format_type(&pmu->format, term->config); in get_config_chgs()
1305 bits |= perf_pmu__format_bits(&pmu->format, term->config); in get_config_chgs()
1332 return -EINVAL; in parse_events_add_tracepoint()
1359 if (config_attr(&attr, head_config, parse_state->error, in parse_events_add_numeric()
1361 return -EINVAL; in parse_events_add_numeric()
1364 return -ENOMEM; in parse_events_add_numeric()
1375 ret = add_event(list, &parse_state->idx, &attr, name, metric_id, in parse_events_add_numeric()
1386 return add_event_tool(list, &parse_state->idx, tool_event); in parse_events_add_tool()
1394 if (term->type == EVSEL__CONFIG_TERM_PERCORE) in config_term_percore()
1395 return term->val.percore; in config_term_percore()
1406 int ret = -1; in parse_events__inside_hybrid_pmu()
1408 if (parse_state->fake_pmu || !head_config || list_empty(head_config) || in parse_events__inside_hybrid_pmu()
1410 return -1; in parse_events__inside_hybrid_pmu()
1416 if (head_config->next && head_config->next->next != head_config) in parse_events__inside_hybrid_pmu()
1417 return -1; in parse_events__inside_hybrid_pmu()
1420 if (term && term->config && strcmp(term->config, "event")) { in parse_events__inside_hybrid_pmu()
1421 ret = parse_events__with_hybrid_pmu(parse_state, term->config, in parse_events__inside_hybrid_pmu()
1438 struct parse_events_error *err = parse_state->error; in parse_events_add_pmu()
1442 pmu = parse_state->fake_pmu ?: perf_pmu__find(name); in parse_events_add_pmu()
1444 if (verbose > 1 && !(pmu && pmu->selectable)) { in parse_events_add_pmu()
1451 fprintf(stderr, "%s,", term->config); in parse_events_add_pmu()
1454 fprintf(stderr, "' that may result in non-fatal errors\n"); in parse_events_add_pmu()
1464 return -EINVAL; in parse_events_add_pmu()
1467 if (pmu->default_config) { in parse_events_add_pmu()
1468 memcpy(&attr, pmu->default_config, in parse_events_add_pmu()
1474 use_uncore_alias = (pmu->is_uncore && use_alias); in parse_events_add_pmu()
1477 attr.type = pmu->type; in parse_events_add_pmu()
1478 evsel = __add_event(list, &parse_state->idx, &attr, in parse_events_add_pmu()
1484 evsel->pmu_name = name ? strdup(name) : NULL; in parse_events_add_pmu()
1485 evsel->use_uncore_alias = use_uncore_alias; in parse_events_add_pmu()
1488 return -ENOMEM; in parse_events_add_pmu()
1492 if (!parse_state->fake_pmu && perf_pmu__check_alias(pmu, head_config, &info)) in parse_events_add_pmu()
1493 return -EINVAL; in parse_events_add_pmu()
1502 fprintf(stderr, "%s,", term->config); in parse_events_add_pmu()
1505 fprintf(stderr, "' that may result in non-fatal errors\n"); in parse_events_add_pmu()
1512 if (config_attr(&attr, head_config, parse_state->error, config_term_pmu)) in parse_events_add_pmu()
1513 return -EINVAL; in parse_events_add_pmu()
1516 return -ENOMEM; in parse_events_add_pmu()
1519 * When using default config, record which bits of attr->config were in parse_events_add_pmu()
1522 if (pmu->default_config && get_config_chgs(pmu, head_config, &config_terms)) in parse_events_add_pmu()
1523 return -ENOMEM; in parse_events_add_pmu()
1530 if (!parse_state->fake_pmu && perf_pmu__config(pmu, &attr, head_config, parse_state->error)) { in parse_events_add_pmu()
1532 return -EINVAL; in parse_events_add_pmu()
1535 evsel = __add_event(list, &parse_state->idx, &attr, /*init_attr=*/true, in parse_events_add_pmu()
1540 return -ENOMEM; in parse_events_add_pmu()
1542 if (evsel->name) in parse_events_add_pmu()
1543 evsel->use_config_name = true; in parse_events_add_pmu()
1545 evsel->pmu_name = name ? strdup(name) : NULL; in parse_events_add_pmu()
1546 evsel->use_uncore_alias = use_uncore_alias; in parse_events_add_pmu()
1547 evsel->percore = config_term_percore(&evsel->config_terms); in parse_events_add_pmu()
1549 if (parse_state->fake_pmu) in parse_events_add_pmu()
1552 free((char *)evsel->unit); in parse_events_add_pmu()
1553 evsel->unit = strdup(info.unit); in parse_events_add_pmu()
1554 evsel->scale = info.scale; in parse_events_add_pmu()
1555 evsel->per_pkg = info.per_pkg; in parse_events_add_pmu()
1556 evsel->snapshot = info.snapshot; in parse_events_add_pmu()
1557 evsel->metric_expr = info.metric_expr; in parse_events_add_pmu()
1558 evsel->metric_name = info.metric_name; in parse_events_add_pmu()
1593 list_add_tail(&term->list, head); in parse_events_multi_pmu_add()
1605 list_for_each_entry(alias, &pmu->aliases, list) { in parse_events_multi_pmu_add()
1606 if (!strcasecmp(alias->name, str)) { in parse_events_multi_pmu_add()
1609 pmu->name, orig_head, in parse_events_multi_pmu_add()
1611 pr_debug("%s -> %s/%s/\n", str, in parse_events_multi_pmu_add()
1612 pmu->name, alias->str); in parse_events_multi_pmu_add()
1620 if (parse_state->fake_pmu) { in parse_events_multi_pmu_add()
1623 pr_debug("%s -> %s/%s/\n", str, "fake_pmu", str); in parse_events_multi_pmu_add()
1635 return ok ? 0 : -1; in parse_events_multi_pmu_add()
1658 if ((end_a - pmu_name_a) != (end_b - pmu_name_b)) in is_same_uncore_block()
1661 return (strncmp(pmu_name_a, pmu_name_b, end_a - pmu_name_a) == 0); in is_same_uncore_block()
1675 total_members = evsel->core.idx - leader->core.idx + 1; in parse_events__set_leader_for_uncore_aliase()
1689 if (!evsel->use_uncore_alias) in parse_events__set_leader_for_uncore_aliase()
1693 if (!is_same_uncore_block(leader->pmu_name, evsel->pmu_name)) in parse_events__set_leader_for_uncore_aliase()
1704 !strcmp(leader->pmu_name, evsel->pmu_name)) { in parse_events__set_leader_for_uncore_aliase()
1715 parse_state->nr_groups--; in parse_events__set_leader_for_uncore_aliase()
1741 evsel->core.nr_members = total_members / nr_pmu; in parse_events__set_leader_for_uncore_aliase()
1742 evsel->group_name = name ? strdup(name) : NULL; in parse_events__set_leader_for_uncore_aliase()
1746 parse_state->nr_groups += nr_pmu - 1; in parse_events__set_leader_for_uncore_aliase()
1774 __perf_evlist__set_leader(list, &leader->core); in parse_events__set_leader()
1775 leader->group_name = name ? strdup(name) : NULL; in parse_events__set_leader()
1776 list_move(&leader->core.node, list); in parse_events__set_leader()
1812 int eu = evsel ? evsel->core.attr.exclude_user : 0; in get_event_modifier()
1813 int ek = evsel ? evsel->core.attr.exclude_kernel : 0; in get_event_modifier()
1814 int eh = evsel ? evsel->core.attr.exclude_hv : 0; in get_event_modifier()
1815 int eH = evsel ? evsel->core.attr.exclude_host : 0; in get_event_modifier()
1816 int eG = evsel ? evsel->core.attr.exclude_guest : 0; in get_event_modifier()
1817 int eI = evsel ? evsel->core.attr.exclude_idle : 0; in get_event_modifier()
1818 int precise = evsel ? evsel->core.attr.precise_ip : 0; in get_event_modifier()
1821 int pinned = evsel ? evsel->core.attr.pinned : 0; in get_event_modifier()
1822 int exclusive = evsel ? evsel->core.attr.exclusive : 0; in get_event_modifier()
1825 int exclude_GH = evsel ? evsel->exclude_GH : 0; in get_event_modifier()
1882 * 0 - SAMPLE_IP can have arbitrary skid in get_event_modifier()
1883 * 1 - SAMPLE_IP must have constant skid in get_event_modifier()
1884 * 2 - SAMPLE_IP requested to have 0 skid in get_event_modifier()
1885 * 3 - SAMPLE_IP must have 0 skid in get_event_modifier()
1890 return -EINVAL; in get_event_modifier()
1892 mod->eu = eu; in get_event_modifier()
1893 mod->ek = ek; in get_event_modifier()
1894 mod->eh = eh; in get_event_modifier()
1895 mod->eH = eH; in get_event_modifier()
1896 mod->eG = eG; in get_event_modifier()
1897 mod->eI = eI; in get_event_modifier()
1898 mod->precise = precise; in get_event_modifier()
1899 mod->precise_max = precise_max; in get_event_modifier()
1900 mod->exclude_GH = exclude_GH; in get_event_modifier()
1901 mod->sample_read = sample_read; in get_event_modifier()
1902 mod->pinned = pinned; in get_event_modifier()
1903 mod->weak = weak; in get_event_modifier()
1904 mod->bpf_counter = bpf_counter; in get_event_modifier()
1905 mod->exclusive = exclusive; in get_event_modifier()
1919 if (strlen(str) > (sizeof("ukhGHpppPSDIWeb") - 1)) in check_modifier()
1920 return -1; in check_modifier()
1924 return -1; in check_modifier()
1940 return -EINVAL; in parse_events__modifier_event()
1943 return -EINVAL; in parse_events__modifier_event()
1947 return -EINVAL; in parse_events__modifier_event()
1949 evsel->core.attr.exclude_user = mod.eu; in parse_events__modifier_event()
1950 evsel->core.attr.exclude_kernel = mod.ek; in parse_events__modifier_event()
1951 evsel->core.attr.exclude_hv = mod.eh; in parse_events__modifier_event()
1952 evsel->core.attr.precise_ip = mod.precise; in parse_events__modifier_event()
1953 evsel->core.attr.exclude_host = mod.eH; in parse_events__modifier_event()
1954 evsel->core.attr.exclude_guest = mod.eG; in parse_events__modifier_event()
1955 evsel->core.attr.exclude_idle = mod.eI; in parse_events__modifier_event()
1956 evsel->exclude_GH = mod.exclude_GH; in parse_events__modifier_event()
1957 evsel->sample_read = mod.sample_read; in parse_events__modifier_event()
1958 evsel->precise_max = mod.precise_max; in parse_events__modifier_event()
1959 evsel->weak_group = mod.weak; in parse_events__modifier_event()
1960 evsel->bpf_counter = mod.bpf_counter; in parse_events__modifier_event()
1963 evsel->core.attr.pinned = mod.pinned; in parse_events__modifier_event()
1964 evsel->core.attr.exclusive = mod.exclusive; in parse_events__modifier_event()
1976 if (!evsel->name) in parse_events_name()
1977 evsel->name = strdup(name); in parse_events_name()
1989 return strcasecmp(pmu1->symbol, pmu2->symbol); in comp_pmu()
2000 zfree(&p->symbol); in perf_pmu__parse_cleanup()
2009 p->symbol = str; \
2010 if (!p->symbol) \
2012 p->type = stype; \
2028 list_for_each_entry(alias, &pmu->aliases, list) { in perf_pmu__parse_init()
2029 char *tmp = strchr(alias->name, '-'); in perf_pmu__parse_init()
2034 tmp2 = strchr(tmp + 1, '-'); in perf_pmu__parse_init()
2045 perf_pmu_events_list_num = -1; in perf_pmu__parse_init()
2056 list_for_each_entry(alias, &pmu->aliases, list) { in perf_pmu__parse_init()
2058 char *tmp = strchr(alias->name, '-'); in perf_pmu__parse_init()
2062 tmp2 = strchr(tmp + 1, '-'); in perf_pmu__parse_init()
2064 SET_SYMBOL(strndup(alias->name, tmp - alias->name), in perf_pmu__parse_init()
2068 SET_SYMBOL(strndup(tmp, tmp2 - tmp), PMU_EVENT_SYMBOL_SUFFIX); in perf_pmu__parse_init()
2073 SET_SYMBOL(strndup(alias->name, tmp - alias->name), in perf_pmu__parse_init()
2079 SET_SYMBOL(strdup(alias->name), PMU_EVENT_SYMBOL); in perf_pmu__parse_init()
2110 return -ENOMEM; in perf_pmu__test_parse_init()
2113 tmp->type = symbols[i].type; in perf_pmu__test_parse_init()
2114 tmp->symbol = strdup(symbols[i].symbol); in perf_pmu__test_parse_init()
2115 if (!tmp->symbol) in perf_pmu__test_parse_init()
2128 free(tmp->symbol); in perf_pmu__test_parse_init()
2130 return -ENOMEM; in perf_pmu__test_parse_init()
2142 * name "cpu" could be prefix of cpu-cycles or cpu// events. in perf_pmu__parse_check()
2143 * cpu-cycles has been handled by hardcode. in perf_pmu__parse_check()
2154 return r ? r->type : PMU_EVENT_SYMBOL_ERR; in perf_pmu__parse_check()
2214 .idx = parse_state->idx, in parse_events__with_hybrid_pmu()
2224 parse_state->idx = ps.idx; in parse_events__with_hybrid_pmu()
2227 return -1; in parse_events__with_hybrid_pmu()
2238 .idx = evlist->core.nr_entries, in __parse_events()
2251 return -1; in __parse_events()
2262 evlist->core.nr_groups += parse_state.nr_groups; in __parse_events()
2264 last->cmdline_group_boundary = true; in __parse_events()
2270 * There are 2 users - builtin-record and builtin-test objects. in __parse_events()
2295 zfree(&err->str); in parse_events_error__exit()
2296 zfree(&err->help); in parse_events_error__exit()
2297 zfree(&err->first_str); in parse_events_error__exit()
2298 zfree(&err->first_help); in parse_events_error__exit()
2306 switch (err->num_errors) { in parse_events_error__handle()
2308 err->idx = idx; in parse_events_error__handle()
2309 err->str = str; in parse_events_error__handle()
2310 err->help = help; in parse_events_error__handle()
2313 err->first_idx = err->idx; in parse_events_error__handle()
2314 err->idx = idx; in parse_events_error__handle()
2315 err->first_str = err->str; in parse_events_error__handle()
2316 err->str = str; in parse_events_error__handle()
2317 err->first_help = err->help; in parse_events_error__handle()
2318 err->help = help; in parse_events_error__handle()
2322 err->str, err->help); in parse_events_error__handle()
2323 free(err->str); in parse_events_error__handle()
2324 err->str = str; in parse_events_error__handle()
2325 free(err->help); in parse_events_error__handle()
2326 err->help = help; in parse_events_error__handle()
2329 err->num_errors++; in parse_events_error__handle()
2354 /* -2 for extra '' in the final fprintf */ in __parse_events_error__print()
2355 int width = get_term_width() - 2; in __parse_events_error__print()
2371 max_len = width - len_str; in __parse_events_error__print()
2377 cut = err_idx - max_err_idx; in __parse_events_error__print()
2385 if ((len_event - cut) > max_len) { in __parse_events_error__print()
2386 buf[max_len - 1] = buf[max_len - 2] = '.'; in __parse_events_error__print()
2390 idx = len_str + err_idx - cut; in __parse_events_error__print()
2404 if (!err->num_errors) in parse_events_error__print()
2407 __parse_events_error__print(err->idx, err->str, err->help, event); in parse_events_error__print()
2409 if (err->num_errors > 1) { in parse_events_error__print()
2411 __parse_events_error__print(err->first_idx, err->first_str, in parse_events_error__print()
2412 err->first_help, event); in parse_events_error__print()
2421 struct evlist *evlist = *(struct evlist **)opt->value; in parse_events_option()
2439 struct evlist **evlistp = opt->value; in parse_events_option_new_evlist()
2447 return -1; in parse_events_option_new_evlist()
2475 if (evlist->core.nr_entries > 0) in foreach_evsel_in_last_glob()
2481 return -1; in foreach_evsel_in_last_glob()
2485 if (last->core.node.prev == &evlist->core.entries) in foreach_evsel_in_last_glob()
2487 last = list_entry(last->core.node.prev, struct evsel, core.node); in foreach_evsel_in_last_glob()
2488 } while (!last->cmdline_group_boundary); in foreach_evsel_in_last_glob()
2502 "--filter option should follow a -e tracepoint or HW tracer option\n"); in set_filter()
2503 return -1; in set_filter()
2506 if (evsel->core.attr.type == PERF_TYPE_TRACEPOINT) { in set_filter()
2510 return -1; in set_filter()
2517 if (pmu->type == evsel->core.attr.type) { in set_filter()
2529 return -1; in set_filter()
2535 return -1; in set_filter()
2544 struct evlist *evlist = *(struct evlist **)opt->value; in parse_filter()
2555 if (evsel == NULL || evsel->core.attr.type != PERF_TYPE_TRACEPOINT) { in add_exclude_perf_filter()
2557 "--exclude-perf option should follow a -e tracepoint option\n"); in add_exclude_perf_filter()
2558 return -1; in add_exclude_perf_filter()
2566 return -1; in add_exclude_perf_filter()
2576 struct evlist *evlist = *(struct evlist **)opt->value; in exclude_perf()
2584 return term->type_term != PARSE_EVENTS__TERM_TYPE_USER; in parse_events__is_hardcoded_term()
2595 return -ENOMEM; in new_term()
2598 INIT_LIST_HEAD(&term->list); in new_term()
2599 term->weak = false; in new_term()
2601 switch (term->type_val) { in new_term()
2603 term->val.num = num; in new_term()
2606 term->val.str = str; in new_term()
2610 return -EINVAL; in new_term()
2630 .err_term = loc_term ? loc_term->first_column : 0, in parse_events_term__num()
2631 .err_val = loc_val ? loc_val->first_column : 0, in parse_events_term__num()
2648 .err_term = loc_term ? loc_term->first_column : 0, in parse_events_term__str()
2649 .err_val = loc_val ? loc_val->first_column : 0, in parse_events_term__str()
2669 return -ENOMEM; in parse_events_term__sym_hw()
2674 str = strdup(sym->symbol); in parse_events_term__sym_hw()
2676 return -ENOMEM; in parse_events_term__sym_hw()
2685 .type_val = term->type_val, in parse_events_term__clone()
2686 .type_term = term->type_term, in parse_events_term__clone()
2688 .err_term = term->err_term, in parse_events_term__clone()
2689 .err_val = term->err_val, in parse_events_term__clone()
2692 if (term->config) { in parse_events_term__clone()
2693 temp.config = strdup(term->config); in parse_events_term__clone()
2695 return -ENOMEM; in parse_events_term__clone()
2697 if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM) in parse_events_term__clone()
2698 return new_term(new, &temp, NULL, term->val.num); in parse_events_term__clone()
2700 str = strdup(term->val.str); in parse_events_term__clone()
2702 return -ENOMEM; in parse_events_term__clone()
2708 if (term->array.nr_ranges) in parse_events_term__delete()
2709 zfree(&term->array.ranges); in parse_events_term__delete()
2711 if (term->type_val != PARSE_EVENTS__TERM_TYPE_NUM) in parse_events_term__delete()
2712 zfree(&term->val.str); in parse_events_term__delete()
2714 zfree(&term->config); in parse_events_term__delete()
2731 return -ENOMEM; in parse_events_copy_term_list()
2738 list_add_tail(&n->list, *new); in parse_events_copy_term_list()
2748 list_del_init(&term->list); in parse_events_terms__purge()
2763 zfree(&a->ranges); in parse_events__clear_array()
2769 if (!parse_state->error) in parse_events_evlist_error()
2772 parse_events_error__handle(parse_state->error, idx, strdup(str), NULL); in parse_events_evlist_error()
2809 /* "no-overwrite" is the longest name */ in parse_events_formats_error_string()
2811 (sizeof("no-overwrite") - 1)]; in parse_events_formats_error_string()