tools/perf/util/stat-display.c

Source file repositories/reference/linux-study-clean/tools/perf/util/stat-display.c

File Facts

System
Linux kernel
Corpus path
tools/perf/util/stat-display.c
Extension
.c
Size
41992 bytes
Lines
1604
Domain
Support Tooling And Documentation
Bucket
tools
Inferred role
Support Tooling And Documentation: implementation source
Status
source implementation candidate

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

struct outstate {
	/* Std mode: insert a newline before the next metric */
	bool newline;
	/* JSON mode: track need for comma for a previous field or not */
	bool first;
	/* Num CSV separators remaining to pad out when not all fields are printed */
	int  csv_col_pad;

	/*
	 * The following don't track state across fields, but are here as a shortcut to
	 * pass data to the print functions. The alternative would be to update the
	 * function signatures of the entire print stack to pass them through.
	 */
	/* Place to output to */
	FILE * const fh;
	/* Lines are timestamped in --interval-print mode */
	char timestamp[64];
	/* Num items aggregated in current line. See struct perf_stat_aggr.nr */
	int aggr_nr;
	/* Core/socket/die etc ID for the current line */
	struct aggr_cpu_id id;
	/* Event for current line */
	struct evsel *evsel;
	/* Cgroup for current line */
	struct cgroup *cgrp;
};

static const char *json_sep(struct outstate *os)
{
	const char *sep = os->first ? "" : ", ";

	os->first = false;
	return sep;
}

#define json_out(os, format, ...) fprintf((os)->fh, "%s" format, json_sep(os), ##__VA_ARGS__)

static void print_running_json(struct outstate *os, u64 run, u64 ena)
{
	double enabled_percent = 100;

	if (run != ena)
		enabled_percent = 100 * run / ena;
	json_out(os, "\"event-runtime\" : %" PRIu64 ", \"pcnt-running\" : %.2f",
		 run, enabled_percent);
}

static void print_running(struct perf_stat_config *config, struct outstate *os,
			  u64 run, u64 ena, bool before_metric)
{
	if (config->json_output) {
		if (before_metric)
			print_running_json(os, run, ena);
	} else if (config->csv_output) {
		if (before_metric)
			print_running_csv(config, run, ena);
	} else {
		if (!before_metric)
			print_running_std(config, run, ena);
	}
}

static void print_noise_pct_std(struct perf_stat_config *config,
				double pct)
{
	if (pct)
		fprintf(config->output, "  ( +-%6.2f%% )", pct);
}

static void print_noise_pct_csv(struct perf_stat_config *config,
				double pct)
{
	fprintf(config->output, "%s%.2f%%", config->csv_sep, pct);
}

static void print_noise_pct_json(struct outstate *os,
				 double pct)
{
	json_out(os, "\"variance\" : %.2f", pct);
}

static void print_noise_pct(struct perf_stat_config *config, struct outstate *os,
			    double total, double avg, bool before_metric)
{
	double pct = rel_stddev_stats(total, avg);

	if (config->json_output) {
		if (before_metric)
			print_noise_pct_json(os, pct);
	} else if (config->csv_output) {

Annotation

Implementation Notes