aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/time/tick-sched.c41
1 files changed, 35 insertions, 6 deletions
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index 7ab44bca6546..664c4a365439 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -198,7 +198,8 @@ static ktime_t tick_nohz_start_idle(int cpu, struct tick_sched *ts)
198/** 198/**
199 * get_cpu_idle_time_us - get the total idle time of a cpu 199 * get_cpu_idle_time_us - get the total idle time of a cpu
200 * @cpu: CPU number to query 200 * @cpu: CPU number to query
201 * @last_update_time: variable to store update time in 201 * @last_update_time: variable to store update time in. Do not update
202 * counters if NULL.
202 * 203 *
203 * Return the cummulative idle time (since boot) for a given 204 * Return the cummulative idle time (since boot) for a given
204 * CPU, in microseconds. 205 * CPU, in microseconds.
@@ -211,20 +212,35 @@ static ktime_t tick_nohz_start_idle(int cpu, struct tick_sched *ts)
211u64 get_cpu_idle_time_us(int cpu, u64 *last_update_time) 212u64 get_cpu_idle_time_us(int cpu, u64 *last_update_time)
212{ 213{
213 struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu); 214 struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);
215 ktime_t now, idle;
214 216
215 if (!tick_nohz_enabled) 217 if (!tick_nohz_enabled)
216 return -1; 218 return -1;
217 219
218 update_ts_time_stats(cpu, ts, ktime_get(), last_update_time); 220 now = ktime_get();
221 if (last_update_time) {
222 update_ts_time_stats(cpu, ts, now, last_update_time);
223 idle = ts->idle_sleeptime;
224 } else {
225 if (ts->idle_active && !nr_iowait_cpu(cpu)) {
226 ktime_t delta = ktime_sub(now, ts->idle_entrytime);
227
228 idle = ktime_add(ts->idle_sleeptime, delta);
229 } else {
230 idle = ts->idle_sleeptime;
231 }
232 }
233
234 return ktime_to_us(idle);
219 235
220 return ktime_to_us(ts->idle_sleeptime);
221} 236}
222EXPORT_SYMBOL_GPL(get_cpu_idle_time_us); 237EXPORT_SYMBOL_GPL(get_cpu_idle_time_us);
223 238
224/** 239/**
225 * get_cpu_iowait_time_us - get the total iowait time of a cpu 240 * get_cpu_iowait_time_us - get the total iowait time of a cpu
226 * @cpu: CPU number to query 241 * @cpu: CPU number to query
227 * @last_update_time: variable to store update time in 242 * @last_update_time: variable to store update time in. Do not update
243 * counters if NULL.
228 * 244 *
229 * Return the cummulative iowait time (since boot) for a given 245 * Return the cummulative iowait time (since boot) for a given
230 * CPU, in microseconds. 246 * CPU, in microseconds.
@@ -237,13 +253,26 @@ EXPORT_SYMBOL_GPL(get_cpu_idle_time_us);
237u64 get_cpu_iowait_time_us(int cpu, u64 *last_update_time) 253u64 get_cpu_iowait_time_us(int cpu, u64 *last_update_time)
238{ 254{
239 struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu); 255 struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);
256 ktime_t now, iowait;
240 257
241 if (!tick_nohz_enabled) 258 if (!tick_nohz_enabled)
242 return -1; 259 return -1;
243 260
244 update_ts_time_stats(cpu, ts, ktime_get(), last_update_time); 261 now = ktime_get();
262 if (last_update_time) {
263 update_ts_time_stats(cpu, ts, now, last_update_time);
264 iowait = ts->iowait_sleeptime;
265 } else {
266 if (ts->idle_active && nr_iowait_cpu(cpu) > 0) {
267 ktime_t delta = ktime_sub(now, ts->idle_entrytime);
268
269 iowait = ktime_add(ts->iowait_sleeptime, delta);
270 } else {
271 iowait = ts->iowait_sleeptime;
272 }
273 }
245 274
246 return ktime_to_us(ts->iowait_sleeptime); 275 return ktime_to_us(iowait);
247} 276}
248EXPORT_SYMBOL_GPL(get_cpu_iowait_time_us); 277EXPORT_SYMBOL_GPL(get_cpu_iowait_time_us);
249 278