0f0abbace3
Each struct hists have events_stats but most of the fields were not used. It's to count number of samples and periods whether filtered or not. And other fields are used only by evlist. So it'd be better to split hists_stats and events_stats to reduce wasted memory in the struct hists. This makes the output of event statistics in the perf report compact by skipping 0 events in each evsel/hists. Reviewed-by: Andi Kleen <ak@linux.intel.com> Signed-off-by: Namhyung Kim <namhyung@kernel.org> Acked-by: Jiri Olsa <jolsa@redhat.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Ian Rogers <irogers@google.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Peter Zijlstra <peterz@infradead.org> Link: https://lore.kernel.org/r/20210427013717.1651674-3-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
56 lines
1.9 KiB
C
56 lines
1.9 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __PERF_EVENTS_STATS_
|
|
#define __PERF_EVENTS_STATS_
|
|
|
|
#include <stdio.h>
|
|
#include <perf/event.h>
|
|
#include <linux/types.h>
|
|
#include "auxtrace.h"
|
|
|
|
/*
|
|
* The kernel collects the number of events it couldn't send in a stretch and
|
|
* when possible sends this number in a PERF_RECORD_LOST event. The number of
|
|
* such "chunks" of lost events is stored in .nr_events[PERF_EVENT_LOST] while
|
|
* total_lost tells exactly how many events the kernel in fact lost, i.e. it is
|
|
* the sum of all struct perf_record_lost.lost fields reported.
|
|
*
|
|
* The kernel discards mixed up samples and sends the number in a
|
|
* PERF_RECORD_LOST_SAMPLES event. The number of lost-samples events is stored
|
|
* in .nr_events[PERF_RECORD_LOST_SAMPLES] while total_lost_samples tells
|
|
* exactly how many samples the kernel in fact dropped, i.e. it is the sum of
|
|
* all struct perf_record_lost_samples.lost fields reported.
|
|
*
|
|
* The total_period is needed because by default auto-freq is used, so
|
|
* multiplying nr_events[PERF_EVENT_SAMPLE] by a frequency isn't possible to get
|
|
* the total number of low level events, it is necessary to to sum all struct
|
|
* perf_record_sample.period and stash the result in total_period.
|
|
*/
|
|
struct events_stats {
|
|
u64 total_lost;
|
|
u64 total_lost_samples;
|
|
u64 total_aux_lost;
|
|
u64 total_aux_partial;
|
|
u64 total_invalid_chains;
|
|
u32 nr_events[PERF_RECORD_HEADER_MAX];
|
|
u32 nr_lost_warned;
|
|
u32 nr_unknown_events;
|
|
u32 nr_invalid_chains;
|
|
u32 nr_unknown_id;
|
|
u32 nr_unprocessable_samples;
|
|
u32 nr_auxtrace_errors[PERF_AUXTRACE_ERROR_MAX];
|
|
u32 nr_proc_map_timeout;
|
|
};
|
|
|
|
struct hists_stats {
|
|
u64 total_period;
|
|
u64 total_non_filtered_period;
|
|
u32 nr_samples;
|
|
u32 nr_non_filtered_samples;
|
|
};
|
|
|
|
void events_stats__inc(struct events_stats *stats, u32 type);
|
|
|
|
size_t events_stats__fprintf(struct events_stats *stats, FILE *fp);
|
|
|
|
#endif /* __PERF_EVENTS_STATS_ */
|