Skip to content

Commit bd40cbb

Browse files
Ulf Hanssonrafaeljw
authored andcommitted
PM: domains: Move genpd's time-accounting to ktime_get_mono_fast_ns()
To move towards a more consistent behaviour between genpd and the runtime PM core, let's start by converting genpd's time-accounting from ktime_get() into ktime_get_mono_fast_ns(). Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
1 parent eefa861 commit bd40cbb

2 files changed

Lines changed: 46 additions & 37 deletions

File tree

drivers/base/power/domain.c

Lines changed: 43 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -225,24 +225,23 @@ static void genpd_debug_remove(struct generic_pm_domain *genpd)
225225

226226
static 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)
31633162
static 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)
31933195
static 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)
32133219
static 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;

include/linux/pm_domain.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ struct genpd_power_state {
9898
u64 usage;
9999
u64 rejected;
100100
struct fwnode_handle *fwnode;
101-
ktime_t idle_time;
101+
u64 idle_time;
102102
void *data;
103103
};
104104

@@ -149,8 +149,8 @@ struct generic_pm_domain {
149149
unsigned int state_count);
150150
unsigned int state_count; /* number of states */
151151
unsigned int state_idx; /* state that genpd will go to when off */
152-
ktime_t on_time;
153-
ktime_t accounting_time;
152+
u64 on_time;
153+
u64 accounting_time;
154154
const struct genpd_lock_ops *lock_ops;
155155
union {
156156
struct mutex mlock;

0 commit comments

Comments
 (0)