Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3)  * syscall.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5)  * syscall: Benchmark for system call performance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7) #include "../perf.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8) #include "../util/util.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9) #include <subcmd/parse-options.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include "../builtin.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include "bench.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <stdio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <sys/time.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <sys/syscall.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <sys/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <unistd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <stdlib.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define LOOPS_DEFAULT 10000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) static	int loops = LOOPS_DEFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) static const struct option options[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) 	OPT_INTEGER('l', "loop",	&loops,		"Specify number of loops"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) 	OPT_END()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) static const char * const bench_syscall_usage[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) 	"perf bench syscall <options>",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) 	NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) int bench_syscall_basic(int argc, const char **argv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) 	struct timeval start, stop, diff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) 	unsigned long long result_usec = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) 	argc = parse_options(argc, argv, options, bench_syscall_usage, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) 	gettimeofday(&start, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) 	for (i = 0; i < loops; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) 		getppid();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) 	gettimeofday(&stop, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) 	timersub(&stop, &start, &diff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) 	switch (bench_format) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) 	case BENCH_FORMAT_DEFAULT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) 		printf("# Executed %'d getppid() calls\n", loops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) 		result_usec = diff.tv_sec * 1000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) 		result_usec += diff.tv_usec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) 		printf(" %14s: %lu.%03lu [sec]\n\n", "Total time",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) 		       diff.tv_sec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) 		       (unsigned long) (diff.tv_usec/1000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) 		printf(" %14lf usecs/op\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) 		       (double)result_usec / (double)loops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) 		printf(" %'14d ops/sec\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) 		       (int)((double)loops /
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) 			     ((double)result_usec / (double)1000000)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) 	case BENCH_FORMAT_SIMPLE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) 		printf("%lu.%03lu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) 		       diff.tv_sec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) 		       (unsigned long) (diff.tv_usec / 1000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) 		/* reaching here is something disaster */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) 		fprintf(stderr, "Unknown format:%d\n", bench_format);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) 		exit(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) }