162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * The following program is used to generate the constants for 362306a36Sopenharmony_ci * computing sched averages. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * ============================================================== 662306a36Sopenharmony_ci * C program (compile with -lm) 762306a36Sopenharmony_ci * ============================================================== 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <math.h> 1162306a36Sopenharmony_ci#include <stdio.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#define HALFLIFE 32 1462306a36Sopenharmony_ci#define SHIFT 32 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_cidouble y; 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_civoid calc_runnable_avg_yN_inv(void) 1962306a36Sopenharmony_ci{ 2062306a36Sopenharmony_ci int i; 2162306a36Sopenharmony_ci unsigned int x; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci /* To silence -Wunused-but-set-variable warnings. */ 2462306a36Sopenharmony_ci printf("static const u32 runnable_avg_yN_inv[] __maybe_unused = {"); 2562306a36Sopenharmony_ci for (i = 0; i < HALFLIFE; i++) { 2662306a36Sopenharmony_ci x = ((1UL<<32)-1)*pow(y, i); 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci if (i % 6 == 0) printf("\n\t"); 2962306a36Sopenharmony_ci printf("0x%8x, ", x); 3062306a36Sopenharmony_ci } 3162306a36Sopenharmony_ci printf("\n};\n\n"); 3262306a36Sopenharmony_ci} 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ciint sum = 1024; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_civoid calc_runnable_avg_yN_sum(void) 3762306a36Sopenharmony_ci{ 3862306a36Sopenharmony_ci int i; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci printf("static const u32 runnable_avg_yN_sum[] = {\n\t 0,"); 4162306a36Sopenharmony_ci for (i = 1; i <= HALFLIFE; i++) { 4262306a36Sopenharmony_ci if (i == 1) 4362306a36Sopenharmony_ci sum *= y; 4462306a36Sopenharmony_ci else 4562306a36Sopenharmony_ci sum = sum*y + 1024*y; 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci if (i % 11 == 0) 4862306a36Sopenharmony_ci printf("\n\t"); 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci printf("%5d,", sum); 5162306a36Sopenharmony_ci } 5262306a36Sopenharmony_ci printf("\n};\n\n"); 5362306a36Sopenharmony_ci} 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ciint n = -1; 5662306a36Sopenharmony_ci/* first period */ 5762306a36Sopenharmony_cilong max = 1024; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_civoid calc_converged_max(void) 6062306a36Sopenharmony_ci{ 6162306a36Sopenharmony_ci long last = 0, y_inv = ((1UL<<32)-1)*y; 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci for (; ; n++) { 6462306a36Sopenharmony_ci if (n > -1) 6562306a36Sopenharmony_ci max = ((max*y_inv)>>SHIFT) + 1024; 6662306a36Sopenharmony_ci /* 6762306a36Sopenharmony_ci * This is the same as: 6862306a36Sopenharmony_ci * max = max*y + 1024; 6962306a36Sopenharmony_ci */ 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci if (last == max) 7262306a36Sopenharmony_ci break; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci last = max; 7562306a36Sopenharmony_ci } 7662306a36Sopenharmony_ci n--; 7762306a36Sopenharmony_ci printf("#define LOAD_AVG_PERIOD %d\n", HALFLIFE); 7862306a36Sopenharmony_ci printf("#define LOAD_AVG_MAX %ld\n", max); 7962306a36Sopenharmony_ci// printf("#define LOAD_AVG_MAX_N %d\n\n", n); 8062306a36Sopenharmony_ci} 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_civoid calc_accumulated_sum_32(void) 8362306a36Sopenharmony_ci{ 8462306a36Sopenharmony_ci int i, x = sum; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci printf("static const u32 __accumulated_sum_N32[] = {\n\t 0,"); 8762306a36Sopenharmony_ci for (i = 1; i <= n/HALFLIFE+1; i++) { 8862306a36Sopenharmony_ci if (i > 1) 8962306a36Sopenharmony_ci x = x/2 + sum; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci if (i % 6 == 0) 9262306a36Sopenharmony_ci printf("\n\t"); 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci printf("%6d,", x); 9562306a36Sopenharmony_ci } 9662306a36Sopenharmony_ci printf("\n};\n\n"); 9762306a36Sopenharmony_ci} 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_civoid main(void) 10062306a36Sopenharmony_ci{ 10162306a36Sopenharmony_ci printf("/* Generated by Documentation/scheduler/sched-pelt; do not modify. */\n\n"); 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci y = pow(0.5, 1/(double)HALFLIFE); 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci calc_runnable_avg_yN_inv(); 10662306a36Sopenharmony_ci// calc_runnable_avg_yN_sum(); 10762306a36Sopenharmony_ci calc_converged_max(); 10862306a36Sopenharmony_ci// calc_accumulated_sum_32(); 10962306a36Sopenharmony_ci} 110