Lines Matching +full:max +full:- +full:counts

1 // SPDX-License-Identifier: GPL-2.0
7 #include "counts.h"
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()
158 struct perf_counts *counts; in evsel__alloc_prev_raw_counts() local
160 counts = perf_counts__new(cpu_map_nr, nthreads); in evsel__alloc_prev_raw_counts()
161 if (counts) 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()
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()
272 * For GLOBAL aggregation mode, it updates the counts for each run 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()
282 if (config->aggr_mode != AGGR_GLOBAL) in evlist__copy_res_stats()
307 struct hashmap *mask = counter->per_pkg_mask; 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()
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()
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()
390 struct perf_stat_evsel *ps = evsel->stats; 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()
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()
464 int nthreads = perf_thread_map__nr(counter->core.threads); in process_counter_maps()
471 perf_counts(counter->counts, idx, thread))) in process_counter_maps()
472 return -1; in process_counter_maps()
482 struct perf_stat_evsel *ps = counter->stats; in perf_stat_process_counter()
486 if (counter->per_pkg) in perf_stat_process_counter()
493 if (config->aggr_mode != AGGR_GLOBAL) in perf_stat_process_counter()
497 * GLOBAL aggregation mode only has a single aggr counts, 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()
544 if (evsel_a->scale != evsel_b->scale) in evsel__is_alias()
547 if (evsel_a->cgrp != evsel_b->cgrp) in evsel__is_alias()
550 if (strcmp(evsel_a->unit, evsel_b->unit)) in evsel__is_alias()
556 return !!strcmp(evsel_a->pmu_name, evsel_b->pmu_name); in evsel__is_alias()
561 struct evlist *evlist = evsel->evlist; in evsel__merge_aliases()
564 alias = list_prepare_entry(evsel, &(evlist->core.entries), core.node); in evsel__merge_aliases()
565 list_for_each_entry_continue(alias, &evlist->core.entries, core.node) { in evsel__merge_aliases()
569 alias->merged_stat = true; in evsel__merge_aliases()
577 return config->hybrid_merge && evsel__is_hybrid(evsel); in evsel__should_merge_hybrid()
583 if (evsel->merged_stat) in evsel__merge_stats()
586 if (evsel->auto_merge_stats || evsel__should_merge_hybrid(evsel, config)) in evsel__merge_stats()
595 if (config->no_merge) in perf_stat_merge_counters()
604 struct perf_stat_evsel *ps = evsel->stats; in evsel__update_percore_stats()
605 struct perf_counts_values counts = { 0, }; in evsel__update_percore_stats() local
610 /* collect per-core counts */ in evsel__update_percore_stats()
611 perf_cpu_map__for_each_cpu(cpu, idx, evsel->core.cpus) { in evsel__update_percore_stats()
612 struct perf_stat_aggr *aggr = &ps->aggr[idx]; in evsel__update_percore_stats()
618 counts.val += aggr->counts.val; in evsel__update_percore_stats()
619 counts.ena += aggr->counts.ena; in evsel__update_percore_stats()
620 counts.run += aggr->counts.run; in evsel__update_percore_stats()
623 /* update aggregated per-core counts for each CPU */ in evsel__update_percore_stats()
624 perf_cpu_map__for_each_cpu(cpu, idx, evsel->core.cpus) { in evsel__update_percore_stats()
625 struct perf_stat_aggr *aggr = &ps->aggr[idx]; in evsel__update_percore_stats()
631 aggr->counts.val = counts.val; in evsel__update_percore_stats()
632 aggr->counts.ena = counts.ena; in evsel__update_percore_stats()
633 aggr->counts.run = counts.run; in evsel__update_percore_stats()
635 aggr->used = true; in evsel__update_percore_stats()
639 /* we have an aggr_map for cpu, but want to aggregate the counters per-core */
642 struct perf_stat_evsel *ps = evsel->stats; in evsel__process_percore()
647 if (!evsel->percore) in evsel__process_percore()
650 perf_cpu_map__for_each_cpu(cpu, idx, evsel->core.cpus) { in evsel__process_percore()
651 struct perf_stat_aggr *aggr = &ps->aggr[idx]; in evsel__process_percore()
653 if (aggr->used) in evsel__process_percore()
661 /* process cpu stats on per-core events */
666 if (config->aggr_mode != AGGR_NONE) in perf_stat_process_percore()
677 struct perf_record_stat *st = &event->stat; in perf_event__process_stat_event()
681 count.val = st->val; in perf_event__process_stat_event()
682 count.ena = st->ena; in perf_event__process_stat_event()
683 count.run = st->run; in perf_event__process_stat_event()
685 counter = evlist__id2evsel(session->evlist, st->id); in perf_event__process_stat_event()
688 return -EINVAL; in perf_event__process_stat_event()
690 cpu_map_idx = perf_cpu_map__idx(evsel__cpus(counter), (struct perf_cpu){.cpu = st->cpu}); in perf_event__process_stat_event()
691 if (cpu_map_idx == -1) { in perf_event__process_stat_event()
692 pr_err("Invalid CPU %d for event %s.\n", st->cpu, evsel__name(counter)); in perf_event__process_stat_event()
693 return -EINVAL; in perf_event__process_stat_event()
695 ptr = perf_counts(counter->counts, cpu_map_idx, st->thread); in perf_event__process_stat_event()
698 st->cpu, st->thread, evsel__name(counter)); in perf_event__process_stat_event()
699 return -EINVAL; in perf_event__process_stat_event()
702 counter->supported = true; in perf_event__process_stat_event()
712 st->id, st->cpu, st->thread); in perf_event__fprintf_stat()
714 st->val, st->ena, st->run); in perf_event__fprintf_stat()
724 ret = fprintf(fp, "\n... time %" PRI_lu64 ", type %s\n", rd->time, in perf_event__fprintf_stat_round()
725 rd->type == PERF_STAT_ROUND_TYPE__FINAL ? "FINAL" : "INTERVAL"); in perf_event__fprintf_stat_round()
735 perf_event__read_stat_config(&sc, &event->stat_config); in perf_event__fprintf_stat_config()
750 struct perf_event_attr *attr = &evsel->core.attr; in create_perf_stat_counter()
753 attr->read_format = PERF_FORMAT_TOTAL_TIME_ENABLED | in create_perf_stat_counter()
761 if (leader->core.nr_members > 1) in create_perf_stat_counter()
762 attr->read_format |= PERF_FORMAT_ID|PERF_FORMAT_GROUP; in create_perf_stat_counter()
764 attr->inherit = !config->no_inherit && list_empty(&evsel->bpf_counter_list); in create_perf_stat_counter()
770 attr->sample_period = 0; in create_perf_stat_counter()
772 if (config->identifier) in create_perf_stat_counter()
773 attr->sample_type = PERF_SAMPLE_IDENTIFIER; in create_perf_stat_counter()
775 if (config->all_user) { in create_perf_stat_counter()
776 attr->exclude_kernel = 1; in create_perf_stat_counter()
777 attr->exclude_user = 0; in create_perf_stat_counter()
780 if (config->all_kernel) { in create_perf_stat_counter()
781 attr->exclude_kernel = 0; in create_perf_stat_counter()
782 attr->exclude_user = 1; in create_perf_stat_counter()
791 attr->disabled = 1; in create_perf_stat_counter()
794 attr->enable_on_exec = 1; in create_perf_stat_counter()
800 return evsel__open_per_thread(evsel, evsel->core.threads); in create_perf_stat_counter()