| // SPDX-License-Identifier: GPL-2.0 | 
 | /* | 
 |  * Benchmark of /proc/kallsyms parsing. | 
 |  * | 
 |  * Copyright 2020 Google LLC. | 
 |  */ | 
 | #include <stdlib.h> | 
 | #include "bench.h" | 
 | #include "../util/stat.h" | 
 | #include <linux/time64.h> | 
 | #include <subcmd/parse-options.h> | 
 | #include <symbol/kallsyms.h> | 
 |  | 
 | static unsigned int iterations = 100; | 
 |  | 
 | static const struct option options[] = { | 
 | 	OPT_UINTEGER('i', "iterations", &iterations, | 
 | 		"Number of iterations used to compute average"), | 
 | 	OPT_END() | 
 | }; | 
 |  | 
 | static const char *const bench_usage[] = { | 
 | 	"perf bench internals kallsyms-parse <options>", | 
 | 	NULL | 
 | }; | 
 |  | 
 | static int bench_process_symbol(void *arg __maybe_unused, | 
 | 				const char *name __maybe_unused, | 
 | 				char type __maybe_unused, | 
 | 				u64 start __maybe_unused) | 
 | { | 
 | 	return 0; | 
 | } | 
 |  | 
 | static int do_kallsyms_parse(void) | 
 | { | 
 | 	struct timeval start, end, diff; | 
 | 	u64 runtime_us; | 
 | 	unsigned int i; | 
 | 	double time_average, time_stddev; | 
 | 	int err; | 
 | 	struct stats time_stats; | 
 |  | 
 | 	init_stats(&time_stats); | 
 |  | 
 | 	for (i = 0; i < iterations; i++) { | 
 | 		gettimeofday(&start, NULL); | 
 | 		err = kallsyms__parse("/proc/kallsyms", NULL, | 
 | 				bench_process_symbol); | 
 | 		if (err) | 
 | 			return err; | 
 |  | 
 | 		gettimeofday(&end, NULL); | 
 | 		timersub(&end, &start, &diff); | 
 | 		runtime_us = diff.tv_sec * USEC_PER_SEC + diff.tv_usec; | 
 | 		update_stats(&time_stats, runtime_us); | 
 | 	} | 
 |  | 
 | 	time_average = avg_stats(&time_stats) / USEC_PER_MSEC; | 
 | 	time_stddev = stddev_stats(&time_stats) / USEC_PER_MSEC; | 
 | 	printf("  Average kallsyms__parse took: %.3f ms (+- %.3f ms)\n", | 
 | 		time_average, time_stddev); | 
 | 	return 0; | 
 | } | 
 |  | 
 | int bench_kallsyms_parse(int argc, const char **argv) | 
 | { | 
 | 	argc = parse_options(argc, argv, options, bench_usage, 0); | 
 | 	if (argc) { | 
 | 		usage_with_options(bench_usage, options); | 
 | 		exit(EXIT_FAILURE); | 
 | 	} | 
 |  | 
 | 	return do_kallsyms_parse(); | 
 | } |