123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- /*
- * 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();
- }
|