| /* | 
 |  * The following program is used to generate the constants for | 
 |  * computing sched averages. | 
 |  * | 
 |  * ============================================================== | 
 |  *		C program (compile with -lm) | 
 |  * ============================================================== | 
 |  */ | 
 |  | 
 | #include <math.h> | 
 | #include <stdio.h> | 
 |  | 
 | #define HALFLIFE 32 | 
 | #define SHIFT 32 | 
 |  | 
 | double y; | 
 |  | 
 | void calc_runnable_avg_yN_inv(void) | 
 | { | 
 | 	int i; | 
 | 	unsigned int x; | 
 |  | 
 | 	/* To silence -Wunused-but-set-variable warnings. */ | 
 | 	printf("static const u32 runnable_avg_yN_inv[] __maybe_unused = {"); | 
 | 	for (i = 0; i < HALFLIFE; i++) { | 
 | 		x = ((1UL<<32)-1)*pow(y, i); | 
 |  | 
 | 		if (i % 6 == 0) printf("\n\t"); | 
 | 		printf("0x%8x, ", x); | 
 | 	} | 
 | 	printf("\n};\n\n"); | 
 | } | 
 |  | 
 | int sum = 1024; | 
 |  | 
 | void calc_runnable_avg_yN_sum(void) | 
 | { | 
 | 	int i; | 
 |  | 
 | 	printf("static const u32 runnable_avg_yN_sum[] = {\n\t    0,"); | 
 | 	for (i = 1; i <= HALFLIFE; i++) { | 
 | 		if (i == 1) | 
 | 			sum *= y; | 
 | 		else | 
 | 			sum = sum*y + 1024*y; | 
 |  | 
 | 		if (i % 11 == 0) | 
 | 			printf("\n\t"); | 
 |  | 
 | 		printf("%5d,", sum); | 
 | 	} | 
 | 	printf("\n};\n\n"); | 
 | } | 
 |  | 
 | int n = -1; | 
 | /* first period */ | 
 | long max = 1024; | 
 |  | 
 | void calc_converged_max(void) | 
 | { | 
 | 	long last = 0, y_inv = ((1UL<<32)-1)*y; | 
 |  | 
 | 	for (; ; n++) { | 
 | 		if (n > -1) | 
 | 			max = ((max*y_inv)>>SHIFT) + 1024; | 
 | 			/* | 
 | 			 * This is the same as: | 
 | 			 * max = max*y + 1024; | 
 | 			 */ | 
 |  | 
 | 		if (last == max) | 
 | 			break; | 
 |  | 
 | 		last = max; | 
 | 	} | 
 | 	n--; | 
 | 	printf("#define LOAD_AVG_PERIOD %d\n", HALFLIFE); | 
 | 	printf("#define LOAD_AVG_MAX %ld\n", max); | 
 | //	printf("#define LOAD_AVG_MAX_N %d\n\n", n); | 
 | } | 
 |  | 
 | void calc_accumulated_sum_32(void) | 
 | { | 
 | 	int i, x = sum; | 
 |  | 
 | 	printf("static const u32 __accumulated_sum_N32[] = {\n\t     0,"); | 
 | 	for (i = 1; i <= n/HALFLIFE+1; i++) { | 
 | 		if (i > 1) | 
 | 			x = x/2 + sum; | 
 |  | 
 | 		if (i % 6 == 0) | 
 | 			printf("\n\t"); | 
 |  | 
 | 		printf("%6d,", x); | 
 | 	} | 
 | 	printf("\n};\n\n"); | 
 | } | 
 |  | 
 | void main(void) | 
 | { | 
 | 	printf("/* Generated by Documentation/scheduler/sched-pelt; do not modify. */\n\n"); | 
 |  | 
 | 	y = pow(0.5, 1/(double)HALFLIFE); | 
 |  | 
 | 	calc_runnable_avg_yN_inv(); | 
 | //	calc_runnable_avg_yN_sum(); | 
 | 	calc_converged_max(); | 
 | //	calc_accumulated_sum_32(); | 
 | } |