@@ -225,24 +225,23 @@ static void genpd_debug_remove(struct generic_pm_domain *genpd)
225225
226226static void genpd_update_accounting (struct generic_pm_domain * genpd )
227227{
228- ktime_t delta , now ;
228+ u64 delta , now ;
229229
230- now = ktime_get ();
231- delta = ktime_sub (now , genpd -> accounting_time );
230+ now = ktime_get_mono_fast_ns ();
231+ if (now <= genpd -> accounting_time )
232+ return ;
233+
234+ delta = now - genpd -> accounting_time ;
232235
233236 /*
234237 * If genpd->status is active, it means we are just
235238 * out of off and so update the idle time and vice
236239 * versa.
237240 */
238- if (genpd -> status == GENPD_STATE_ON ) {
239- int state_idx = genpd -> state_idx ;
240-
241- genpd -> states [state_idx ].idle_time =
242- ktime_add (genpd -> states [state_idx ].idle_time , delta );
243- } else {
244- genpd -> on_time = ktime_add (genpd -> on_time , delta );
245- }
241+ if (genpd -> status == GENPD_STATE_ON )
242+ genpd -> states [genpd -> state_idx ].idle_time += delta ;
243+ else
244+ genpd -> on_time += delta ;
246245
247246 genpd -> accounting_time = now ;
248247}
@@ -1999,7 +1998,7 @@ int pm_genpd_init(struct generic_pm_domain *genpd,
19991998 genpd -> max_off_time_changed = true;
20001999 genpd -> provider = NULL ;
20012000 genpd -> has_provider = false;
2002- genpd -> accounting_time = ktime_get ();
2001+ genpd -> accounting_time = ktime_get_mono_fast_ns ();
20032002 genpd -> domain .ops .runtime_suspend = genpd_runtime_suspend ;
20042003 genpd -> domain .ops .runtime_resume = genpd_runtime_resume ;
20052004 genpd -> domain .ops .prepare = genpd_prepare ;
@@ -3163,6 +3162,7 @@ static int sub_domains_show(struct seq_file *s, void *data)
31633162static int idle_states_show (struct seq_file * s , void * data )
31643163{
31653164 struct generic_pm_domain * genpd = s -> private ;
3165+ u64 now , delta , idle_time = 0 ;
31663166 unsigned int i ;
31673167 int ret = 0 ;
31683168
@@ -3173,17 +3173,19 @@ static int idle_states_show(struct seq_file *s, void *data)
31733173 seq_puts (s , "State Time Spent(ms) Usage Rejected\n" );
31743174
31753175 for (i = 0 ; i < genpd -> state_count ; i ++ ) {
3176- ktime_t delta = 0 ;
3177- s64 msecs ;
3176+ idle_time += genpd -> states [i ].idle_time ;
31783177
3179- if ((genpd -> status == GENPD_STATE_OFF ) &&
3180- (genpd -> state_idx == i ))
3181- delta = ktime_sub (ktime_get (), genpd -> accounting_time );
3178+ if (genpd -> status == GENPD_STATE_OFF && genpd -> state_idx == i ) {
3179+ now = ktime_get_mono_fast_ns ();
3180+ if (now > genpd -> accounting_time ) {
3181+ delta = now - genpd -> accounting_time ;
3182+ idle_time += delta ;
3183+ }
3184+ }
31823185
3183- msecs = ktime_to_ms (
3184- ktime_add (genpd -> states [i ].idle_time , delta ));
3185- seq_printf (s , "S%-13i %-14lld %-14llu %llu\n" , i , msecs ,
3186- genpd -> states [i ].usage , genpd -> states [i ].rejected );
3186+ do_div (idle_time , NSEC_PER_MSEC );
3187+ seq_printf (s , "S%-13i %-14llu %-14llu %llu\n" , i , idle_time ,
3188+ genpd -> states [i ].usage , genpd -> states [i ].rejected );
31873189 }
31883190
31893191 genpd_unlock (genpd );
@@ -3193,18 +3195,22 @@ static int idle_states_show(struct seq_file *s, void *data)
31933195static int active_time_show (struct seq_file * s , void * data )
31943196{
31953197 struct generic_pm_domain * genpd = s -> private ;
3196- ktime_t delta = 0 ;
3198+ u64 now , on_time , delta = 0 ;
31973199 int ret = 0 ;
31983200
31993201 ret = genpd_lock_interruptible (genpd );
32003202 if (ret )
32013203 return - ERESTARTSYS ;
32023204
3203- if (genpd -> status == GENPD_STATE_ON )
3204- delta = ktime_sub (ktime_get (), genpd -> accounting_time );
3205+ if (genpd -> status == GENPD_STATE_ON ) {
3206+ now = ktime_get_mono_fast_ns ();
3207+ if (now > genpd -> accounting_time )
3208+ delta = now - genpd -> accounting_time ;
3209+ }
32053210
3206- seq_printf (s , "%lld ms\n" , ktime_to_ms (
3207- ktime_add (genpd -> on_time , delta )));
3211+ on_time = genpd -> on_time + delta ;
3212+ do_div (on_time , NSEC_PER_MSEC );
3213+ seq_printf (s , "%llu ms\n" , on_time );
32083214
32093215 genpd_unlock (genpd );
32103216 return ret ;
@@ -3213,7 +3219,7 @@ static int active_time_show(struct seq_file *s, void *data)
32133219static int total_idle_time_show (struct seq_file * s , void * data )
32143220{
32153221 struct generic_pm_domain * genpd = s -> private ;
3216- ktime_t delta = 0 , total = 0 ;
3222+ u64 now , delta , total = 0 ;
32173223 unsigned int i ;
32183224 int ret = 0 ;
32193225
@@ -3222,16 +3228,19 @@ static int total_idle_time_show(struct seq_file *s, void *data)
32223228 return - ERESTARTSYS ;
32233229
32243230 for (i = 0 ; i < genpd -> state_count ; i ++ ) {
3231+ total += genpd -> states [i ].idle_time ;
32253232
3226- if ((genpd -> status == GENPD_STATE_OFF ) &&
3227- (genpd -> state_idx == i ))
3228- delta = ktime_sub (ktime_get (), genpd -> accounting_time );
3229-
3230- total = ktime_add (total , genpd -> states [i ].idle_time );
3233+ if (genpd -> status == GENPD_STATE_OFF && genpd -> state_idx == i ) {
3234+ now = ktime_get_mono_fast_ns ();
3235+ if (now > genpd -> accounting_time ) {
3236+ delta = now - genpd -> accounting_time ;
3237+ total += delta ;
3238+ }
3239+ }
32313240 }
3232- total = ktime_add (total , delta );
32333241
3234- seq_printf (s , "%lld ms\n" , ktime_to_ms (total ));
3242+ do_div (total , NSEC_PER_MSEC );
3243+ seq_printf (s , "%llu ms\n" , total );
32353244
32363245 genpd_unlock (genpd );
32373246 return ret ;
0 commit comments