Lines Matching +full:skip +full:- +full:config
1 // SPDX-License-Identifier: GPL-2.0
24 stats->n++; in update_stats()
25 delta = val - stats->mean; in update_stats()
26 stats->mean += delta / stats->n; in update_stats()
27 stats->M2 += delta*(val - stats->mean); in update_stats()
29 if (val > stats->max) in update_stats()
30 stats->max = val; in update_stats()
32 if (val < stats->min) in update_stats()
33 stats->min = val; in update_stats()
38 return stats->mean; in avg_stats()
44 * (\Sum n_i^2) - ((\Sum n_i)^2)/n
45 * s^2 = -------------------------------
46 * n - 1
53 * s_mean = -------
61 if (stats->n < 2) in stddev_stats()
64 variance = stats->M2 / (stats->n - 1); in stddev_stats()
65 variance_mean = variance / stats->n; in stddev_stats()
82 struct perf_stat_evsel *ps = evsel->stats; in evsel__reset_aggr_stats()
83 struct perf_stat_aggr *aggr = ps->aggr; in evsel__reset_aggr_stats()
86 memset(aggr, 0, sizeof(*aggr) * ps->nr_aggr); in evsel__reset_aggr_stats()
91 struct perf_stat_evsel *ps = evsel->stats; in evsel__reset_stat_priv()
93 init_stats(&ps->res_stats); in evsel__reset_stat_priv()
99 struct perf_stat_evsel *ps = evsel->stats; in evsel__alloc_aggr_stats()
104 ps->nr_aggr = nr_aggr; in evsel__alloc_aggr_stats()
105 ps->aggr = calloc(nr_aggr, sizeof(*ps->aggr)); in evsel__alloc_aggr_stats()
106 if (ps->aggr == NULL) in evsel__alloc_aggr_stats()
107 return -ENOMEM; in evsel__alloc_aggr_stats()
118 return -1; in evlist__alloc_aggr_stats()
129 return -ENOMEM; in evsel__alloc_stat_priv()
131 evsel->stats = ps; in evsel__alloc_stat_priv()
134 evsel->stats = NULL; in evsel__alloc_stat_priv()
136 return -ENOMEM; in evsel__alloc_stat_priv()
145 struct perf_stat_evsel *ps = evsel->stats; in evsel__free_stat_priv()
148 zfree(&ps->aggr); in evsel__free_stat_priv()
149 zfree(&ps->group_data); in evsel__free_stat_priv()
151 zfree(&evsel->stats); in evsel__free_stat_priv()
157 int nthreads = perf_thread_map__nr(evsel->core.threads); in evsel__alloc_prev_raw_counts()
162 evsel->prev_raw_counts = counts; in evsel__alloc_prev_raw_counts()
164 return counts ? 0 : -ENOMEM; in evsel__alloc_prev_raw_counts()
169 perf_counts__delete(evsel->prev_raw_counts); in evsel__free_prev_raw_counts()
170 evsel->prev_raw_counts = NULL; in evsel__free_prev_raw_counts()
175 if (evsel->prev_raw_counts) in evsel__reset_prev_raw_counts()
176 perf_counts__reset(evsel->prev_raw_counts); in evsel__reset_prev_raw_counts()
184 return -ENOMEM; in evsel__alloc_stats()
189 int evlist__alloc_stats(struct perf_stat_config *config, in evlist__alloc_stats() argument
195 if (config && config->aggr_map) in evlist__alloc_stats()
196 nr_aggr = config->aggr_map->nr; in evlist__alloc_stats()
207 return -1; in evlist__alloc_stats()
249 int idx, nthreads = perf_thread_map__nr(evsel->core.threads); in evsel__copy_prev_raw_counts()
253 *perf_counts(evsel->counts, idx, thread) = in evsel__copy_prev_raw_counts()
254 *perf_counts(evsel->prev_raw_counts, idx, thread); in evsel__copy_prev_raw_counts()
269 struct perf_stat_evsel *ps = evsel->stats; in evsel__copy_res_stats()
273 * in the evsel->stats.res_stats. See perf_stat_process_counter(). in evsel__copy_res_stats()
275 *ps->aggr[0].counts.values = avg_stats(&ps->res_stats); in evsel__copy_res_stats()
278 void evlist__copy_res_stats(struct perf_stat_config *config, struct evlist *evlist) in evlist__copy_res_stats() argument
282 if (config->aggr_mode != AGGR_GLOBAL) in evlist__copy_res_stats()
305 int cpu_map_idx, bool *skip) in check_per_pkg() argument
307 struct hashmap *mask = counter->per_pkg_mask; in check_per_pkg()
313 *skip = false; in check_per_pkg()
315 if (!counter->per_pkg) in check_per_pkg()
324 return -ENOMEM; in check_per_pkg()
326 counter->per_pkg_mask = mask; in check_per_pkg()
331 * instance to mark a package as used (skip=1). Otherwise in check_per_pkg()
337 if (!(vals->run && vals->ena)) in check_per_pkg()
342 return -1; in check_per_pkg()
345 * On multi-die system, die_id > 0. On no-die system, die_id = 0. in check_per_pkg()
350 return -1; in check_per_pkg()
354 return -ENOMEM; in check_per_pkg()
358 *skip = true; in check_per_pkg()
368 struct perf_stat_config *config) in evsel__count_has_error() argument
371 if (evsel->err || evsel->counts->scaled == -1) in evsel__count_has_error()
375 if (config->aggr_mode == AGGR_GLOBAL) in evsel__count_has_error()
379 if (count->ena != 0 && count->run != 0) in evsel__count_has_error()
386 process_counter_values(struct perf_stat_config *config, struct evsel *evsel, in process_counter_values() argument
390 struct perf_stat_evsel *ps = evsel->stats; in process_counter_values()
392 bool skip = false; in process_counter_values() local
394 if (check_per_pkg(evsel, count, cpu_map_idx, &skip)) { in process_counter_values()
395 pr_err("failed to read per-pkg counter\n"); in process_counter_values()
396 return -1; in process_counter_values()
399 if (skip) in process_counter_values()
402 if (!evsel->snapshot) in process_counter_values()
404 perf_counts_values__scale(count, config->scale, NULL); in process_counter_values()
406 if (config->aggr_mode == AGGR_THREAD) { in process_counter_values()
407 struct perf_counts_values *aggr_counts = &ps->aggr[thread].counts; in process_counter_values()
410 * Skip value 0 when enabling --per-thread globally, in process_counter_values()
413 if (count->val == 0 && config->system_wide) in process_counter_values()
416 ps->aggr[thread].nr++; in process_counter_values()
418 aggr_counts->val += count->val; in process_counter_values()
419 aggr_counts->ena += count->ena; in process_counter_values()
420 aggr_counts->run += count->run; in process_counter_values()
424 if (ps->aggr) { in process_counter_values()
425 struct perf_cpu cpu = perf_cpu_map__cpu(evsel->core.cpus, cpu_map_idx); in process_counter_values()
426 struct aggr_cpu_id aggr_id = config->aggr_get_id(config, cpu); in process_counter_values()
430 for (i = 0; i < ps->nr_aggr; i++) { in process_counter_values()
431 if (!aggr_cpu_id__equal(&aggr_id, &config->aggr_map->map[i])) in process_counter_values()
434 ps_aggr = &ps->aggr[i]; in process_counter_values()
435 ps_aggr->nr++; in process_counter_values()
439 * in interval mode. But per-task counters can have 0 enabled time in process_counter_values()
442 if (evsel__count_has_error(evsel, count, config) && !ps_aggr->failed) { in process_counter_values()
443 ps_aggr->counts.val = 0; in process_counter_values()
444 ps_aggr->counts.ena = 0; in process_counter_values()
445 ps_aggr->counts.run = 0; in process_counter_values()
446 ps_aggr->failed = true; in process_counter_values()
449 if (!ps_aggr->failed) { in process_counter_values()
450 ps_aggr->counts.val += count->val; in process_counter_values()
451 ps_aggr->counts.ena += count->ena; in process_counter_values()
452 ps_aggr->counts.run += count->run; in process_counter_values()
461 static int process_counter_maps(struct perf_stat_config *config, in process_counter_maps() argument
464 int nthreads = perf_thread_map__nr(counter->core.threads); in process_counter_maps()
470 if (process_counter_values(config, counter, idx, thread, in process_counter_maps()
471 perf_counts(counter->counts, idx, thread))) in process_counter_maps()
472 return -1; in process_counter_maps()
479 int perf_stat_process_counter(struct perf_stat_config *config, in perf_stat_process_counter() argument
482 struct perf_stat_evsel *ps = counter->stats; in perf_stat_process_counter()
486 if (counter->per_pkg) in perf_stat_process_counter()
489 ret = process_counter_maps(config, counter); in perf_stat_process_counter()
493 if (config->aggr_mode != AGGR_GLOBAL) in perf_stat_process_counter()
498 * so we can use ps->aggr[0] as the actual output. in perf_stat_process_counter()
500 count = ps->aggr[0].counts.values; in perf_stat_process_counter()
501 update_stats(&ps->res_stats, *count); in perf_stat_process_counter()
504 fprintf(config->output, "%s: %" PRIu64 " %" PRIu64 " %" PRIu64 "\n", in perf_stat_process_counter()
513 struct perf_stat_evsel *ps_a = evsel->stats; in evsel__merge_aggr_counters()
514 struct perf_stat_evsel *ps_b = alias->stats; in evsel__merge_aggr_counters()
517 if (ps_a->aggr == NULL && ps_b->aggr == NULL) in evsel__merge_aggr_counters()
520 if (ps_a->nr_aggr != ps_b->nr_aggr) { in evsel__merge_aggr_counters()
522 return -1; in evsel__merge_aggr_counters()
525 for (i = 0; i < ps_a->nr_aggr; i++) { in evsel__merge_aggr_counters()
526 struct perf_counts_values *aggr_counts_a = &ps_a->aggr[i].counts; in evsel__merge_aggr_counters()
527 struct perf_counts_values *aggr_counts_b = &ps_b->aggr[i].counts; in evsel__merge_aggr_counters()
531 aggr_counts_a->val += aggr_counts_b->val; in evsel__merge_aggr_counters()
532 aggr_counts_a->ena += aggr_counts_b->ena; in evsel__merge_aggr_counters()
533 aggr_counts_a->run += aggr_counts_b->run; in evsel__merge_aggr_counters()
547 if (evsel_a->scale != evsel_b->scale) in evsel__is_alias()
550 if (evsel_a->cgrp != evsel_b->cgrp) in evsel__is_alias()
553 if (strcmp(evsel_a->unit, evsel_b->unit)) in evsel__is_alias()
559 if (evsel_a->pmu == evsel_b->pmu || evsel_a->pmu == NULL || evsel_b->pmu == NULL) in evsel__is_alias()
562 if (evsel_a->pmu->is_core) in evsel__is_alias()
563 return evsel_b->pmu->is_core; in evsel__is_alias()
565 return perf_pmu__name_no_suffix_match(evsel_a->pmu, evsel_b->pmu->name); in evsel__is_alias()
570 struct evlist *evlist = evsel->evlist; in evsel__merge_aliases()
573 alias = list_prepare_entry(evsel, &(evlist->core.entries), core.node); in evsel__merge_aliases()
574 list_for_each_entry_continue(alias, &evlist->core.entries, core.node) { in evsel__merge_aliases()
578 alias->merged_stat = true; in evsel__merge_aliases()
584 const struct perf_stat_config *config) in evsel__should_merge_hybrid() argument
586 return config->hybrid_merge && evsel__is_hybrid(evsel); in evsel__should_merge_hybrid()
589 static void evsel__merge_stats(struct evsel *evsel, struct perf_stat_config *config) in evsel__merge_stats() argument
592 if (evsel->merged_stat) in evsel__merge_stats()
595 if (evsel->auto_merge_stats || evsel__should_merge_hybrid(evsel, config)) in evsel__merge_stats()
600 void perf_stat_merge_counters(struct perf_stat_config *config, struct evlist *evlist) in perf_stat_merge_counters() argument
604 if (config->aggr_mode == AGGR_NONE) in perf_stat_merge_counters()
608 evsel__merge_stats(evsel, config); in perf_stat_merge_counters()
613 struct perf_stat_evsel *ps = evsel->stats; in evsel__update_percore_stats()
619 /* collect per-core counts */ in evsel__update_percore_stats()
620 perf_cpu_map__for_each_cpu(cpu, idx, evsel->core.cpus) { in evsel__update_percore_stats()
621 struct perf_stat_aggr *aggr = &ps->aggr[idx]; in evsel__update_percore_stats()
627 counts.val += aggr->counts.val; in evsel__update_percore_stats()
628 counts.ena += aggr->counts.ena; in evsel__update_percore_stats()
629 counts.run += aggr->counts.run; in evsel__update_percore_stats()
632 /* update aggregated per-core counts for each CPU */ in evsel__update_percore_stats()
633 perf_cpu_map__for_each_cpu(cpu, idx, evsel->core.cpus) { in evsel__update_percore_stats()
634 struct perf_stat_aggr *aggr = &ps->aggr[idx]; in evsel__update_percore_stats()
640 aggr->counts.val = counts.val; in evsel__update_percore_stats()
641 aggr->counts.ena = counts.ena; in evsel__update_percore_stats()
642 aggr->counts.run = counts.run; in evsel__update_percore_stats()
644 aggr->used = true; in evsel__update_percore_stats()
648 /* we have an aggr_map for cpu, but want to aggregate the counters per-core */
651 struct perf_stat_evsel *ps = evsel->stats; in evsel__process_percore()
656 if (!evsel->percore) in evsel__process_percore()
659 perf_cpu_map__for_each_cpu(cpu, idx, evsel->core.cpus) { in evsel__process_percore()
660 struct perf_stat_aggr *aggr = &ps->aggr[idx]; in evsel__process_percore()
662 if (aggr->used) in evsel__process_percore()
670 /* process cpu stats on per-core events */
671 void perf_stat_process_percore(struct perf_stat_config *config, struct evlist *evlist) in perf_stat_process_percore() argument
675 if (config->aggr_mode != AGGR_NONE) in perf_stat_process_percore()
686 struct perf_record_stat *st = &event->stat; in perf_event__process_stat_event()
690 count.val = st->val; in perf_event__process_stat_event()
691 count.ena = st->ena; in perf_event__process_stat_event()
692 count.run = st->run; in perf_event__process_stat_event()
694 counter = evlist__id2evsel(session->evlist, st->id); in perf_event__process_stat_event()
697 return -EINVAL; in perf_event__process_stat_event()
699 cpu_map_idx = perf_cpu_map__idx(evsel__cpus(counter), (struct perf_cpu){.cpu = st->cpu}); in perf_event__process_stat_event()
700 if (cpu_map_idx == -1) { in perf_event__process_stat_event()
701 pr_err("Invalid CPU %d for event %s.\n", st->cpu, evsel__name(counter)); in perf_event__process_stat_event()
702 return -EINVAL; in perf_event__process_stat_event()
704 ptr = perf_counts(counter->counts, cpu_map_idx, st->thread); in perf_event__process_stat_event()
707 st->cpu, st->thread, evsel__name(counter)); in perf_event__process_stat_event()
708 return -EINVAL; in perf_event__process_stat_event()
711 counter->supported = true; in perf_event__process_stat_event()
721 st->id, st->cpu, st->thread); in perf_event__fprintf_stat()
723 st->val, st->ena, st->run); in perf_event__fprintf_stat()
733 ret = fprintf(fp, "\n... time %" PRI_lu64 ", type %s\n", rd->time, in perf_event__fprintf_stat_round()
734 rd->type == PERF_STAT_ROUND_TYPE__FINAL ? "FINAL" : "INTERVAL"); in perf_event__fprintf_stat_round()
744 perf_event__read_stat_config(&sc, &event->stat_config); in perf_event__fprintf_stat_config()
755 struct perf_stat_config *config, in create_perf_stat_counter() argument
759 struct perf_event_attr *attr = &evsel->core.attr; in create_perf_stat_counter()
762 attr->read_format = PERF_FORMAT_TOTAL_TIME_ENABLED | in create_perf_stat_counter()
770 if (leader->core.nr_members > 1) in create_perf_stat_counter()
771 attr->read_format |= PERF_FORMAT_ID|PERF_FORMAT_GROUP; in create_perf_stat_counter()
773 attr->inherit = !config->no_inherit && list_empty(&evsel->bpf_counter_list); in create_perf_stat_counter()
779 attr->sample_period = 0; in create_perf_stat_counter()
781 if (config->identifier) in create_perf_stat_counter()
782 attr->sample_type = PERF_SAMPLE_IDENTIFIER; in create_perf_stat_counter()
784 if (config->all_user) { in create_perf_stat_counter()
785 attr->exclude_kernel = 1; in create_perf_stat_counter()
786 attr->exclude_user = 0; in create_perf_stat_counter()
789 if (config->all_kernel) { in create_perf_stat_counter()
790 attr->exclude_kernel = 0; in create_perf_stat_counter()
791 attr->exclude_user = 1; in create_perf_stat_counter()
800 attr->disabled = 1; in create_perf_stat_counter()
803 attr->enable_on_exec = 1; in create_perf_stat_counter()
809 return evsel__open_per_thread(evsel, evsel->core.threads); in create_perf_stat_counter()