diff options
-rw-r--r-- | kernel/sched/cputime.c | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c index a95097cb4591..72fdf06ef865 100644 --- a/kernel/sched/cputime.c +++ b/kernel/sched/cputime.c | |||
@@ -332,50 +332,50 @@ out: | |||
332 | * softirq as those do not count in task exec_runtime any more. | 332 | * softirq as those do not count in task exec_runtime any more. |
333 | */ | 333 | */ |
334 | static void irqtime_account_process_tick(struct task_struct *p, int user_tick, | 334 | static void irqtime_account_process_tick(struct task_struct *p, int user_tick, |
335 | struct rq *rq) | 335 | struct rq *rq, int ticks) |
336 | { | 336 | { |
337 | cputime_t one_jiffy_scaled = cputime_to_scaled(cputime_one_jiffy); | 337 | cputime_t scaled = cputime_to_scaled(cputime_one_jiffy); |
338 | u64 cputime = (__force u64) cputime_one_jiffy; | ||
338 | u64 *cpustat = kcpustat_this_cpu->cpustat; | 339 | u64 *cpustat = kcpustat_this_cpu->cpustat; |
339 | 340 | ||
340 | if (steal_account_process_tick()) | 341 | if (steal_account_process_tick()) |
341 | return; | 342 | return; |
342 | 343 | ||
344 | cputime *= ticks; | ||
345 | scaled *= ticks; | ||
346 | |||
343 | if (irqtime_account_hi_update()) { | 347 | if (irqtime_account_hi_update()) { |
344 | cpustat[CPUTIME_IRQ] += (__force u64) cputime_one_jiffy; | 348 | cpustat[CPUTIME_IRQ] += cputime; |
345 | } else if (irqtime_account_si_update()) { | 349 | } else if (irqtime_account_si_update()) { |
346 | cpustat[CPUTIME_SOFTIRQ] += (__force u64) cputime_one_jiffy; | 350 | cpustat[CPUTIME_SOFTIRQ] += cputime; |
347 | } else if (this_cpu_ksoftirqd() == p) { | 351 | } else if (this_cpu_ksoftirqd() == p) { |
348 | /* | 352 | /* |
349 | * ksoftirqd time do not get accounted in cpu_softirq_time. | 353 | * ksoftirqd time do not get accounted in cpu_softirq_time. |
350 | * So, we have to handle it separately here. | 354 | * So, we have to handle it separately here. |
351 | * Also, p->stime needs to be updated for ksoftirqd. | 355 | * Also, p->stime needs to be updated for ksoftirqd. |
352 | */ | 356 | */ |
353 | __account_system_time(p, cputime_one_jiffy, one_jiffy_scaled, | 357 | __account_system_time(p, cputime, scaled, CPUTIME_SOFTIRQ); |
354 | CPUTIME_SOFTIRQ); | ||
355 | } else if (user_tick) { | 358 | } else if (user_tick) { |
356 | account_user_time(p, cputime_one_jiffy, one_jiffy_scaled); | 359 | account_user_time(p, cputime, scaled); |
357 | } else if (p == rq->idle) { | 360 | } else if (p == rq->idle) { |
358 | account_idle_time(cputime_one_jiffy); | 361 | account_idle_time(cputime); |
359 | } else if (p->flags & PF_VCPU) { /* System time or guest time */ | 362 | } else if (p->flags & PF_VCPU) { /* System time or guest time */ |
360 | account_guest_time(p, cputime_one_jiffy, one_jiffy_scaled); | 363 | account_guest_time(p, cputime, scaled); |
361 | } else { | 364 | } else { |
362 | __account_system_time(p, cputime_one_jiffy, one_jiffy_scaled, | 365 | __account_system_time(p, cputime, scaled, CPUTIME_SYSTEM); |
363 | CPUTIME_SYSTEM); | ||
364 | } | 366 | } |
365 | } | 367 | } |
366 | 368 | ||
367 | static void irqtime_account_idle_ticks(int ticks) | 369 | static void irqtime_account_idle_ticks(int ticks) |
368 | { | 370 | { |
369 | int i; | ||
370 | struct rq *rq = this_rq(); | 371 | struct rq *rq = this_rq(); |
371 | 372 | ||
372 | for (i = 0; i < ticks; i++) | 373 | irqtime_account_process_tick(current, 0, rq, ticks); |
373 | irqtime_account_process_tick(current, 0, rq); | ||
374 | } | 374 | } |
375 | #else /* CONFIG_IRQ_TIME_ACCOUNTING */ | 375 | #else /* CONFIG_IRQ_TIME_ACCOUNTING */ |
376 | static inline void irqtime_account_idle_ticks(int ticks) {} | 376 | static inline void irqtime_account_idle_ticks(int ticks) {} |
377 | static inline void irqtime_account_process_tick(struct task_struct *p, int user_tick, | 377 | static inline void irqtime_account_process_tick(struct task_struct *p, int user_tick, |
378 | struct rq *rq) {} | 378 | struct rq *rq, int nr_ticks) {} |
379 | #endif /* CONFIG_IRQ_TIME_ACCOUNTING */ | 379 | #endif /* CONFIG_IRQ_TIME_ACCOUNTING */ |
380 | 380 | ||
381 | /* | 381 | /* |
@@ -464,7 +464,7 @@ void account_process_tick(struct task_struct *p, int user_tick) | |||
464 | return; | 464 | return; |
465 | 465 | ||
466 | if (sched_clock_irqtime) { | 466 | if (sched_clock_irqtime) { |
467 | irqtime_account_process_tick(p, user_tick, rq); | 467 | irqtime_account_process_tick(p, user_tick, rq, 1); |
468 | return; | 468 | return; |
469 | } | 469 | } |
470 | 470 | ||