2019-01-10 18:33:17 +03:00
// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
/*
* Copyright ( c ) 2019 , Mellanox Technologies inc . All rights reserved .
*/
# include <linux/dim.h>
bool dim_on_top ( struct dim * dim )
{
switch ( dim - > tune_state ) {
case DIM_PARKING_ON_TOP :
case DIM_PARKING_TIRED :
return true ;
case DIM_GOING_RIGHT :
return ( dim - > steps_left > 1 ) & & ( dim - > steps_right = = 1 ) ;
default : /* DIM_GOING_LEFT */
return ( dim - > steps_right > 1 ) & & ( dim - > steps_left = = 1 ) ;
}
}
EXPORT_SYMBOL ( dim_on_top ) ;
void dim_turn ( struct dim * dim )
{
switch ( dim - > tune_state ) {
case DIM_PARKING_ON_TOP :
case DIM_PARKING_TIRED :
break ;
case DIM_GOING_RIGHT :
dim - > tune_state = DIM_GOING_LEFT ;
dim - > steps_left = 0 ;
break ;
case DIM_GOING_LEFT :
dim - > tune_state = DIM_GOING_RIGHT ;
dim - > steps_right = 0 ;
break ;
}
}
EXPORT_SYMBOL ( dim_turn ) ;
void dim_park_on_top ( struct dim * dim )
{
dim - > steps_right = 0 ;
dim - > steps_left = 0 ;
dim - > tired = 0 ;
dim - > tune_state = DIM_PARKING_ON_TOP ;
}
EXPORT_SYMBOL ( dim_park_on_top ) ;
void dim_park_tired ( struct dim * dim )
{
dim - > steps_right = 0 ;
dim - > steps_left = 0 ;
dim - > tune_state = DIM_PARKING_TIRED ;
}
EXPORT_SYMBOL ( dim_park_tired ) ;
void dim_calc_stats ( struct dim_sample * start , struct dim_sample * end ,
struct dim_stats * curr_stats )
{
/* u32 holds up to 71 minutes, should be enough */
u32 delta_us = ktime_us_delta ( end - > time , start - > time ) ;
u32 npkts = BIT_GAP ( BITS_PER_TYPE ( u32 ) , end - > pkt_ctr , start - > pkt_ctr ) ;
u32 nbytes = BIT_GAP ( BITS_PER_TYPE ( u32 ) , end - > byte_ctr ,
start - > byte_ctr ) ;
2018-11-22 10:51:17 +03:00
u32 ncomps = BIT_GAP ( BITS_PER_TYPE ( u32 ) , end - > comp_ctr ,
start - > comp_ctr ) ;
2019-01-10 18:33:17 +03:00
if ( ! delta_us )
return ;
curr_stats - > ppms = DIV_ROUND_UP ( npkts * USEC_PER_MSEC , delta_us ) ;
curr_stats - > bpms = DIV_ROUND_UP ( nbytes * USEC_PER_MSEC , delta_us ) ;
curr_stats - > epms = DIV_ROUND_UP ( DIM_NEVENTS * USEC_PER_MSEC ,
delta_us ) ;
2018-11-22 10:51:17 +03:00
curr_stats - > cpms = DIV_ROUND_UP ( ncomps * USEC_PER_MSEC , delta_us ) ;
if ( curr_stats - > epms ! = 0 )
2019-07-23 10:22:47 +03:00
curr_stats - > cpe_ratio = DIV_ROUND_DOWN_ULL (
curr_stats - > cpms * 100 , curr_stats - > epms ) ;
2018-11-22 10:51:17 +03:00
else
curr_stats - > cpe_ratio = 0 ;
2019-01-10 18:33:17 +03:00
}
EXPORT_SYMBOL ( dim_calc_stats ) ;