Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.15.
 1// SPDX-License-Identifier: GPL-2.0
 2/*
 3 * Benchmark of /proc/kallsyms parsing.
 4 *
 5 * Copyright 2020 Google LLC.
 6 */
 7#include <stdlib.h>
 8#include "bench.h"
 9#include "../util/stat.h"
10#include <linux/time64.h>
11#include <subcmd/parse-options.h>
12#include <symbol/kallsyms.h>
13
14static unsigned int iterations = 100;
15
16static const struct option options[] = {
17	OPT_UINTEGER('i', "iterations", &iterations,
18		"Number of iterations used to compute average"),
19	OPT_END()
20};
21
22static const char *const bench_usage[] = {
23	"perf bench internals kallsyms-parse <options>",
24	NULL
25};
26
27static int bench_process_symbol(void *arg __maybe_unused,
28				const char *name __maybe_unused,
29				char type __maybe_unused,
30				u64 start __maybe_unused)
31{
32	return 0;
33}
34
35static int do_kallsyms_parse(void)
36{
37	struct timeval start, end, diff;
38	u64 runtime_us;
39	unsigned int i;
40	double time_average, time_stddev;
41	int err;
42	struct stats time_stats;
43
44	init_stats(&time_stats);
45
46	for (i = 0; i < iterations; i++) {
47		gettimeofday(&start, NULL);
48		err = kallsyms__parse("/proc/kallsyms", NULL,
49				bench_process_symbol);
50		if (err)
51			return err;
52
53		gettimeofday(&end, NULL);
54		timersub(&end, &start, &diff);
55		runtime_us = diff.tv_sec * USEC_PER_SEC + diff.tv_usec;
56		update_stats(&time_stats, runtime_us);
57	}
58
59	time_average = avg_stats(&time_stats) / USEC_PER_MSEC;
60	time_stddev = stddev_stats(&time_stats) / USEC_PER_MSEC;
61	printf("  Average kallsyms__parse took: %.3f ms (+- %.3f ms)\n",
62		time_average, time_stddev);
63	return 0;
64}
65
66int bench_kallsyms_parse(int argc, const char **argv)
67{
68	argc = parse_options(argc, argv, options, bench_usage, 0);
69	if (argc) {
70		usage_with_options(bench_usage, options);
71		exit(EXIT_FAILURE);
72	}
73
74	return do_kallsyms_parse();
75}