File Index
Files and directories
Sign in
FILE

stat.c

File preview with syntax highlighting.

linux-6.19.14/tools/perf/tests/stat.c C
  1// SPDX-License-Identifier: GPL-2.0
  2#include <linux/compiler.h>
  3#include "event.h"
  4#include "tests.h"
  5#include "stat.h"
  6#include "counts.h"
  7#include "debug.h"
  8#include "util/synthetic-events.h"
  9
 10static bool has_term(struct perf_record_stat_config *config,
 11		     u64 tag, u64 val)
 12{
 13	unsigned i;
 14
 15	for (i = 0; i < config->nr; i++) {
 16		if ((config->data[i].tag == tag) &&
 17		    (config->data[i].val == val))
 18			return true;
 19	}
 20
 21	return false;
 22}
 23
 24static int process_stat_config_event(const struct perf_tool *tool __maybe_unused,
 25				     union perf_event *event,
 26				     struct perf_sample *sample __maybe_unused,
 27				     struct machine *machine __maybe_unused)
 28{
 29	struct perf_record_stat_config *config = &event->stat_config;
 30	struct perf_stat_config test_stat_config = {};
 31
 32#define HAS(term, val) \
 33	has_term(config, PERF_STAT_CONFIG_TERM__##term, val)
 34
 35	TEST_ASSERT_VAL("wrong nr",        config->nr == PERF_STAT_CONFIG_TERM__MAX);
 36	TEST_ASSERT_VAL("wrong aggr_mode", HAS(AGGR_MODE, AGGR_CORE));
 37	TEST_ASSERT_VAL("wrong scale",     HAS(SCALE, 1));
 38	TEST_ASSERT_VAL("wrong interval",  HAS(INTERVAL, 1));
 39
 40#undef HAS
 41
 42	perf_event__read_stat_config(&test_stat_config, config);
 43
 44	TEST_ASSERT_VAL("wrong aggr_mode", test_stat_config.aggr_mode == AGGR_CORE);
 45	TEST_ASSERT_VAL("wrong scale",     test_stat_config.scale == 1);
 46	TEST_ASSERT_VAL("wrong interval",  test_stat_config.interval == 1);
 47	return 0;
 48}
 49
 50static int test__synthesize_stat_config(struct test_suite *test __maybe_unused,
 51					int subtest __maybe_unused)
 52{
 53	struct perf_stat_config test_stat_config = {
 54		.aggr_mode	= AGGR_CORE,
 55		.scale		= 1,
 56		.interval	= 1,
 57	};
 58
 59	TEST_ASSERT_VAL("failed to synthesize stat_config",
 60		!perf_event__synthesize_stat_config(NULL, &test_stat_config,
 61						    process_stat_config_event,
 62						    NULL));
 63
 64	return 0;
 65}
 66
 67static int process_stat_event(const struct perf_tool *tool __maybe_unused,
 68			      union perf_event *event,
 69			      struct perf_sample *sample __maybe_unused,
 70			      struct machine *machine __maybe_unused)
 71{
 72	struct perf_record_stat *st = &event->stat;
 73
 74	TEST_ASSERT_VAL("wrong cpu",    st->cpu    == 1);
 75	TEST_ASSERT_VAL("wrong thread", st->thread == 2);
 76	TEST_ASSERT_VAL("wrong id",     st->id     == 3);
 77	TEST_ASSERT_VAL("wrong val",    st->val    == 100);
 78	TEST_ASSERT_VAL("wrong run",    st->ena    == 200);
 79	TEST_ASSERT_VAL("wrong ena",    st->run    == 300);
 80	return 0;
 81}
 82
 83static int test__synthesize_stat(struct test_suite *test __maybe_unused, int subtest __maybe_unused)
 84{
 85	struct perf_counts_values count;
 86
 87	count.val = 100;
 88	count.ena = 200;
 89	count.run = 300;
 90
 91	TEST_ASSERT_VAL("failed to synthesize stat_config",
 92			!perf_event__synthesize_stat(NULL, (struct perf_cpu){.cpu = 1}, 2, 3,
 93						     &count, process_stat_event, NULL));
 94
 95	return 0;
 96}
 97
 98static int process_stat_round_event(const struct perf_tool *tool __maybe_unused,
 99				    union perf_event *event,
100				    struct perf_sample *sample __maybe_unused,
101				    struct machine *machine __maybe_unused)
102{
103	struct perf_record_stat_round *stat_round = &event->stat_round;
104
105	TEST_ASSERT_VAL("wrong time", stat_round->time == 0xdeadbeef);
106	TEST_ASSERT_VAL("wrong type", stat_round->type == PERF_STAT_ROUND_TYPE__INTERVAL);
107	return 0;
108}
109
110static int test__synthesize_stat_round(struct test_suite *test __maybe_unused, int subtest __maybe_unused)
111{
112	TEST_ASSERT_VAL("failed to synthesize stat_config",
113		!perf_event__synthesize_stat_round(NULL, 0xdeadbeef, PERF_STAT_ROUND_TYPE__INTERVAL,
114						   process_stat_round_event, NULL));
115
116	return 0;
117}
118
119DEFINE_SUITE("Synthesize stat config", synthesize_stat_config);
120DEFINE_SUITE("Synthesize stat", synthesize_stat);
121DEFINE_SUITE("Synthesize stat round", synthesize_stat_round);
~/ Read-only file preview.