Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

sched/Documentation: Add 'sched-pelt' tool

Add a user-space program to compute/generate the PELT constants.

The kernel/sched/sched-pelt.h header will contain the output of
this program.

Signed-off-by: Yuyang Du <yuyang.du@intel.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: bsegall@google.com
Cc: dietmar.eggemann@arm.com
Cc: matt@codeblueprint.co.uk
Cc: morten.rasmussen@arm.com
Cc: pjt@google.com
Cc: umgwanakikbuti@gmail.com
Cc: vincent.guittot@linaro.org
Link: http://lkml.kernel.org/r/1486935863-25251-2-git-send-email-yuyang.du@intel.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>

authored by

Yuyang Du and committed by
Ingo Molnar
76d034ed 05296e75

+108
+108
Documentation/scheduler/sched-pelt.c
··· 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 + 18 + void calc_runnable_avg_yN_inv(void) 19 + { 20 + int i; 21 + unsigned int x; 22 + 23 + printf("static const u32 runnable_avg_yN_inv[] = {"); 24 + for (i = 0; i < HALFLIFE; i++) { 25 + x = ((1UL<<32)-1)*pow(y, i); 26 + 27 + if (i % 6 == 0) printf("\n\t"); 28 + printf("0x%8x, ", x); 29 + } 30 + printf("\n};\n\n"); 31 + } 32 + 33 + int sum = 1024; 34 + 35 + void calc_runnable_avg_yN_sum(void) 36 + { 37 + int i; 38 + 39 + printf("static const u32 runnable_avg_yN_sum[] = {\n\t 0,"); 40 + for (i = 1; i <= HALFLIFE; i++) { 41 + if (i == 1) 42 + sum *= y; 43 + else 44 + sum = sum*y + 1024*y; 45 + 46 + if (i % 11 == 0) 47 + printf("\n\t"); 48 + 49 + printf("%5d,", sum); 50 + } 51 + printf("\n};\n\n"); 52 + } 53 + 54 + int n = -1; 55 + /* first period */ 56 + long max = 1024; 57 + 58 + void calc_converged_max(void) 59 + { 60 + long last = 0, y_inv = ((1UL<<32)-1)*y; 61 + 62 + for (; ; n++) { 63 + if (n > -1) 64 + max = ((max*y_inv)>>SHIFT) + 1024; 65 + /* 66 + * This is the same as: 67 + * max = max*y + 1024; 68 + */ 69 + 70 + if (last == max) 71 + break; 72 + 73 + last = max; 74 + } 75 + n--; 76 + printf("#define LOAD_AVG_PERIOD %d\n", HALFLIFE); 77 + printf("#define LOAD_AVG_MAX %ld\n", max); 78 + // printf("#define LOAD_AVG_MAX_N %d\n\n", n); 79 + } 80 + 81 + void calc_accumulated_sum_32(void) 82 + { 83 + int i, x = sum; 84 + 85 + printf("static const u32 __accumulated_sum_N32[] = {\n\t 0,"); 86 + for (i = 1; i <= n/HALFLIFE+1; i++) { 87 + if (i > 1) 88 + x = x/2 + sum; 89 + 90 + if (i % 6 == 0) 91 + printf("\n\t"); 92 + 93 + printf("%6d,", x); 94 + } 95 + printf("\n};\n\n"); 96 + } 97 + 98 + void main(void) 99 + { 100 + printf("/* Generated by Documentation/scheduler/sched-pelt; do not modify. */\n\n"); 101 + 102 + y = pow(0.5, 1/(double)HALFLIFE); 103 + 104 + calc_runnable_avg_yN_inv(); 105 + // calc_runnable_avg_yN_sum(); 106 + calc_converged_max(); 107 + // calc_accumulated_sum_32(); 108 + }