xref: /linux/Documentation/scheduler/sched-pelt.c (revision 0898782247ae533d1f4e47a06bc5d4870931b284)
1 /*
2  * The following program is used to generate the constants for
3  * computing sched averages.
4  *
5  * ==============================================================
6  *		C program (compile with -lm)
7  * ==============================================================
8  */
9 
10 #include <math.h>
11 #include <stdio.h>
12 
13 #define HALFLIFE 32
14 #define SHIFT 32
15 
16 double y;
17 
calc_runnable_avg_yN_inv(void)18 void calc_runnable_avg_yN_inv(void)
19 {
20 	int i;
21 	unsigned int x;
22 
23 	/* To silence -Wunused-but-set-variable warnings. */
24 	printf("static const u32 runnable_avg_yN_inv[] __maybe_unused = {");
25 	for (i = 0; i < HALFLIFE; i++) {
26 		x = ((1UL<<32)-1)*pow(y, i);
27 
28 		if (i % 6 == 0) printf("\n\t");
29 		printf("0x%8x, ", x);
30 	}
31 	printf("\n};\n\n");
32 }
33 
34 int sum = 1024;
35 
calc_runnable_avg_yN_sum(void)36 void calc_runnable_avg_yN_sum(void)
37 {
38 	int i;
39 
40 	printf("static const u32 runnable_avg_yN_sum[] = {\n\t    0,");
41 	for (i = 1; i <= HALFLIFE; i++) {
42 		if (i == 1)
43 			sum *= y;
44 		else
45 			sum = sum*y + 1024*y;
46 
47 		if (i % 11 == 0)
48 			printf("\n\t");
49 
50 		printf("%5d,", sum);
51 	}
52 	printf("\n};\n\n");
53 }
54 
55 int n = -1;
56 /* first period */
57 long max = 1024;
58 
calc_converged_max(void)59 void calc_converged_max(void)
60 {
61 	long last = 0, y_inv = ((1UL<<32)-1)*y;
62 
63 	for (; ; n++) {
64 		if (n > -1)
65 			max = ((max*y_inv)>>SHIFT) + 1024;
66 			/*
67 			 * This is the same as:
68 			 * max = max*y + 1024;
69 			 */
70 
71 		if (last == max)
72 			break;
73 
74 		last = max;
75 	}
76 	n--;
77 	printf("#define LOAD_AVG_PERIOD %d\n", HALFLIFE);
78 	printf("#define LOAD_AVG_MAX %ld\n", max);
79 //	printf("#define LOAD_AVG_MAX_N %d\n\n", n);
80 }
81 
calc_accumulated_sum_32(void)82 void calc_accumulated_sum_32(void)
83 {
84 	int i, x = sum;
85 
86 	printf("static const u32 __accumulated_sum_N32[] = {\n\t     0,");
87 	for (i = 1; i <= n/HALFLIFE+1; i++) {
88 		if (i > 1)
89 			x = x/2 + sum;
90 
91 		if (i % 6 == 0)
92 			printf("\n\t");
93 
94 		printf("%6d,", x);
95 	}
96 	printf("\n};\n\n");
97 }
98 
main(void)99 void main(void)
100 {
101 	printf("/* Generated by Documentation/scheduler/sched-pelt; do not modify. */\n\n");
102 
103 	y = pow(0.5, 1/(double)HALFLIFE);
104 
105 	calc_runnable_avg_yN_inv();
106 //	calc_runnable_avg_yN_sum();
107 	calc_converged_max();
108 //	calc_accumulated_sum_32();
109 }
110