Lines Matching +full:average +full:- +full:samples
1 // SPDX-License-Identifier: GPL-2.0-only
8 #include <subcmd/run-command.h>
10 #include "intel-tpebs.h"
31 #define PERF_DATA "-"
84 return -ENOMEM; in evsel__tpebs_start_perf_record()
88 record_argv[i++] = "-W"; in evsel__tpebs_start_perf_record()
89 record_argv[i++] = "--synth=no"; in evsel__tpebs_start_perf_record()
91 scnprintf(control_fd_buf, sizeof(control_fd_buf), "--control=fd:%d,%d", in evsel__tpebs_start_perf_record()
95 record_argv[i++] = "-o"; in evsel__tpebs_start_perf_record()
98 if (!perf_cpu_map__is_any_cpu_or_is_empty(evsel->evlist->core.user_requested_cpus)) { in evsel__tpebs_start_perf_record()
99 cpu_map__snprint(evsel->evlist->core.user_requested_cpus, cpumap_buf, in evsel__tpebs_start_perf_record()
101 record_argv[i++] = "-C"; in evsel__tpebs_start_perf_record()
106 record_argv[i++] = "-e"; in evsel__tpebs_start_perf_record()
107 record_argv[i++] = t->event; in evsel__tpebs_start_perf_record()
115 tpebs_cmd.out = -1; in evsel__tpebs_start_perf_record()
119 t->started = true; in evsel__tpebs_start_perf_record()
165 pid_t workload_pid, sample_pid = sample->pid; in should_ignore_sample()
170 * tpebs_mtx. Avoid a segfault by ignoring samples in this case. in should_ignore_sample()
172 if (t->evsel->evlist == NULL) in should_ignore_sample()
175 workload_pid = t->evsel->evlist->workload.pid; in should_ignore_sample()
179 if (!t->evsel->core.attr.inherit) in should_ignore_sample()
202 return -EINVAL; in process_sample_event()
209 * Need to handle per core results? We are assuming average retire in process_sample_event()
210 * latency value will be used. Save the number of samples and the sum of in process_sample_event()
213 t->last = sample->weight3; in process_sample_event()
214 update_stats(&t->stats, sample->weight3); in process_sample_event()
222 if (event->feat.feat_id < HEADER_LAST_FEATURE) in process_feature_event()
272 ret = -EPIPE; in tpebs_send_record_cmd()
299 ret = -ETIMEDOUT; in tpebs_send_record_cmd()
310 ret = -EPIPE; in tpebs_send_record_cmd()
320 /* Re-take lock as expected by caller. */ in tpebs_send_record_cmd()
326 * tpebs_stop - stop the sample data read thread and the perf record process.
346 if (ret == -ERR_RUN_COMMAND_WAITPID_SIGNAL) in tpebs_stop()
353 * evsel__tpebs_event() - Create string event encoding to pass to `perf record`.
360 name = strdup(evsel->name); in evsel__tpebs_event()
362 return -ENOMEM; in evsel__tpebs_event()
366 ret = -EINVAL; in evsel__tpebs_event()
374 ret = -EINVAL; in evsel__tpebs_event()
381 ret = -ENOMEM; in evsel__tpebs_event()
384 pr_err("Tpebs event modifier broken '%s'\n", evsel->name); in evsel__tpebs_event()
397 ret = evsel__tpebs_event(evsel, &result->event); in tpebs_retire_lat__new()
402 result->evsel = evsel; in tpebs_retire_lat__new()
408 zfree(&r->event); in tpebs_retire_lat__delete()
425 if (t->evsel == evsel) in tpebs_retire_lat__find()
430 evsel_name = strstr(evsel->name, "tpebs_event_"); in tpebs_retire_lat__find()
438 pr_err("Bad evsel for tpebs find '%s'\n", evsel->name); in tpebs_retire_lat__find()
442 if ((unsigned long)t->evsel == num) in tpebs_retire_lat__find()
449 * evsel__tpebs_prepare - create tpebs data structures ready for opening.
467 return -ENOMEM; in evsel__tpebs_prepare()
469 list_add_tail(&tpebs_event->nd, &tpebs_results); in evsel__tpebs_prepare()
476 evlist__for_each_entry(evsel->evlist, pos) { in evsel__tpebs_prepare()
479 if (pos == evsel || !pos->retire_lat) in evsel__tpebs_prepare()
490 * evsel__tpebs_open - starts tpebs execution.
492 * evsel is sampled to get the average retire_latency value.
509 valid = t && t->started; in evsel__tpebs_open()
512 return valid ? 0 : -EBUSY; in evsel__tpebs_open()
522 /*Create control and ack fd for --control*/ in evsel__tpebs_open()
525 ret = -1; in evsel__tpebs_open()
530 ret = -1; in evsel__tpebs_open()
543 ret = -1; in evsel__tpebs_open()
552 list_del_init(&t->nd); in evsel__tpebs_open()
570 if (evsel->prev_raw_counts) in evsel__tpebs_read()
571 old_count = perf_counts(evsel->prev_raw_counts, cpu_map_idx, thread); in evsel__tpebs_read()
573 count = perf_counts(evsel->counts, cpu_map_idx, thread); in evsel__tpebs_read()
582 if (t && &t->nd == tpebs_results.next) { in evsel__tpebs_read()
589 if (t == NULL || t->stats.n == 0) { in evsel__tpebs_read()
593 "Using precomputed retirement latency data as no samples\n"); in evsel__tpebs_read()
598 val = rint(evsel->retirement_latency.min); in evsel__tpebs_read()
601 val = rint(evsel->retirement_latency.max); in evsel__tpebs_read()
606 val = rint(evsel->retirement_latency.mean); in evsel__tpebs_read()
612 val = t->stats.min; in evsel__tpebs_read()
615 val = t->stats.max; in evsel__tpebs_read()
618 val = t->last; in evsel__tpebs_read()
622 val = rint(t->stats.mean); in evsel__tpebs_read()
629 count->val = old_count->val + val; in evsel__tpebs_read()
630 count->run = old_count->run + 1; in evsel__tpebs_read()
631 count->ena = old_count->ena + 1; in evsel__tpebs_read()
633 count->val = val; in evsel__tpebs_read()
634 count->run++; in evsel__tpebs_read()
635 count->ena++; in evsel__tpebs_read()
641 * evsel__tpebs_close() - delete tpebs related data. If the last event, stop the
654 list_del_init(&t->nd); in evsel__tpebs_close()