176d034edSYuyang Du /*
276d034edSYuyang Du * The following program is used to generate the constants for
376d034edSYuyang Du * computing sched averages.
476d034edSYuyang Du *
576d034edSYuyang Du * ==============================================================
676d034edSYuyang Du * C program (compile with -lm)
776d034edSYuyang Du * ==============================================================
876d034edSYuyang Du */
976d034edSYuyang Du
1076d034edSYuyang Du #include <math.h>
1176d034edSYuyang Du #include <stdio.h>
1276d034edSYuyang Du
1376d034edSYuyang Du #define HALFLIFE 32
1476d034edSYuyang Du #define SHIFT 32
1576d034edSYuyang Du
1676d034edSYuyang Du double y;
1776d034edSYuyang Du
calc_runnable_avg_yN_inv(void)1876d034edSYuyang Du void calc_runnable_avg_yN_inv(void)
1976d034edSYuyang Du {
2076d034edSYuyang Du int i;
2176d034edSYuyang Du unsigned int x;
2276d034edSYuyang Du
23*509466b7SQian Cai /* To silence -Wunused-but-set-variable warnings. */
24*509466b7SQian Cai printf("static const u32 runnable_avg_yN_inv[] __maybe_unused = {");
2576d034edSYuyang Du for (i = 0; i < HALFLIFE; i++) {
2676d034edSYuyang Du x = ((1UL<<32)-1)*pow(y, i);
2776d034edSYuyang Du
2876d034edSYuyang Du if (i % 6 == 0) printf("\n\t");
2976d034edSYuyang Du printf("0x%8x, ", x);
3076d034edSYuyang Du }
3176d034edSYuyang Du printf("\n};\n\n");
3276d034edSYuyang Du }
3376d034edSYuyang Du
3476d034edSYuyang Du int sum = 1024;
3576d034edSYuyang Du
calc_runnable_avg_yN_sum(void)3676d034edSYuyang Du void calc_runnable_avg_yN_sum(void)
3776d034edSYuyang Du {
3876d034edSYuyang Du int i;
3976d034edSYuyang Du
4076d034edSYuyang Du printf("static const u32 runnable_avg_yN_sum[] = {\n\t 0,");
4176d034edSYuyang Du for (i = 1; i <= HALFLIFE; i++) {
4276d034edSYuyang Du if (i == 1)
4376d034edSYuyang Du sum *= y;
4476d034edSYuyang Du else
4576d034edSYuyang Du sum = sum*y + 1024*y;
4676d034edSYuyang Du
4776d034edSYuyang Du if (i % 11 == 0)
4876d034edSYuyang Du printf("\n\t");
4976d034edSYuyang Du
5076d034edSYuyang Du printf("%5d,", sum);
5176d034edSYuyang Du }
5276d034edSYuyang Du printf("\n};\n\n");
5376d034edSYuyang Du }
5476d034edSYuyang Du
5576d034edSYuyang Du int n = -1;
5676d034edSYuyang Du /* first period */
5776d034edSYuyang Du long max = 1024;
5876d034edSYuyang Du
calc_converged_max(void)5976d034edSYuyang Du void calc_converged_max(void)
6076d034edSYuyang Du {
6176d034edSYuyang Du long last = 0, y_inv = ((1UL<<32)-1)*y;
6276d034edSYuyang Du
6376d034edSYuyang Du for (; ; n++) {
6476d034edSYuyang Du if (n > -1)
6576d034edSYuyang Du max = ((max*y_inv)>>SHIFT) + 1024;
6676d034edSYuyang Du /*
6776d034edSYuyang Du * This is the same as:
6876d034edSYuyang Du * max = max*y + 1024;
6976d034edSYuyang Du */
7076d034edSYuyang Du
7176d034edSYuyang Du if (last == max)
7276d034edSYuyang Du break;
7376d034edSYuyang Du
7476d034edSYuyang Du last = max;
7576d034edSYuyang Du }
7676d034edSYuyang Du n--;
7776d034edSYuyang Du printf("#define LOAD_AVG_PERIOD %d\n", HALFLIFE);
7876d034edSYuyang Du printf("#define LOAD_AVG_MAX %ld\n", max);
7976d034edSYuyang Du // printf("#define LOAD_AVG_MAX_N %d\n\n", n);
8076d034edSYuyang Du }
8176d034edSYuyang Du
calc_accumulated_sum_32(void)8276d034edSYuyang Du void calc_accumulated_sum_32(void)
8376d034edSYuyang Du {
8476d034edSYuyang Du int i, x = sum;
8576d034edSYuyang Du
8676d034edSYuyang Du printf("static const u32 __accumulated_sum_N32[] = {\n\t 0,");
8776d034edSYuyang Du for (i = 1; i <= n/HALFLIFE+1; i++) {
8876d034edSYuyang Du if (i > 1)
8976d034edSYuyang Du x = x/2 + sum;
9076d034edSYuyang Du
9176d034edSYuyang Du if (i % 6 == 0)
9276d034edSYuyang Du printf("\n\t");
9376d034edSYuyang Du
9476d034edSYuyang Du printf("%6d,", x);
9576d034edSYuyang Du }
9676d034edSYuyang Du printf("\n};\n\n");
9776d034edSYuyang Du }
9876d034edSYuyang Du
main(void)9976d034edSYuyang Du void main(void)
10076d034edSYuyang Du {
10176d034edSYuyang Du printf("/* Generated by Documentation/scheduler/sched-pelt; do not modify. */\n\n");
10276d034edSYuyang Du
10376d034edSYuyang Du y = pow(0.5, 1/(double)HALFLIFE);
10476d034edSYuyang Du
10576d034edSYuyang Du calc_runnable_avg_yN_inv();
10676d034edSYuyang Du // calc_runnable_avg_yN_sum();
10776d034edSYuyang Du calc_converged_max();
10876d034edSYuyang Du // calc_accumulated_sum_32();
10976d034edSYuyang Du }
110