2017-02-13 00:44:22 +03:00
/*
* 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 ;
2019-06-04 00:11:44 +03:00
/* To silence -Wunused-but-set-variable warnings. */
printf ( " static const u32 runnable_avg_yN_inv[] __maybe_unused = { " ) ;
2017-02-13 00:44:22 +03:00
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();
}