Skip to content

Commit

Permalink
sched/cputime: Push time to account_system_time() in nsecs
Browse files Browse the repository at this point in the history
This is one more step toward converting cputime accounting to pure nsecs.

Signed-off-by: Frederic Weisbecker <[email protected]>
Cc: Benjamin Herrenschmidt <[email protected]>
Cc: Fenghua Yu <[email protected]>
Cc: Heiko Carstens <[email protected]>
Cc: Linus Torvalds <[email protected]>
Cc: Martin Schwidefsky <[email protected]>
Cc: Michael Ellerman <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Rik van Riel <[email protected]>
Cc: Stanislaw Gruszka <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: Tony Luck <[email protected]>
Cc: Wanpeng Li <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Ingo Molnar <[email protected]>
  • Loading branch information
fweisbec authored and Ingo Molnar committed Feb 1, 2017
1 parent 18b43a9 commit fb8b049
Show file tree
Hide file tree
Showing 6 changed files with 40 additions and 40 deletions.
11 changes: 6 additions & 5 deletions arch/ia64/kernel/time.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include <linux/timex.h>
#include <linux/timekeeper_internal.h>
#include <linux/platform_device.h>
#include <linux/cputime.h>

#include <asm/machvec.h>
#include <asm/delay.h>
Expand Down Expand Up @@ -64,29 +65,29 @@ extern cputime_t cycle_to_cputime(u64 cyc);
void vtime_flush(struct task_struct *tsk)
{
struct thread_info *ti = task_thread_info(tsk);
cputime_t delta;
u64 delta;

if (ti->utime)
account_user_time(tsk, cputime_to_nsecs(cycle_to_cputime(ti->utime)));

if (ti->gtime)
account_guest_time(tsk, cycle_to_cputime(ti->gtime));
account_guest_time(tsk, cputime_to_nsecs(cycle_to_cputime(ti->gtime)));

if (ti->idle_time)
account_idle_time(cputime_to_nsecs(cycle_to_cputime(ti->idle_time)));

if (ti->stime) {
delta = cycle_to_cputime(ti->stime);
delta = cputime_to_nsecs(cycle_to_cputime(ti->stime));
account_system_index_time(tsk, delta, CPUTIME_SYSTEM);
}

if (ti->hardirq_time) {
delta = cycle_to_cputime(ti->hardirq_time);
delta = cputime_to_nsecs(cycle_to_cputime(ti->hardirq_time));
account_system_index_time(tsk, delta, CPUTIME_IRQ);
}

if (ti->softirq_time) {
delta = cycle_to_cputime(ti->softirq_time);
delta = cputime_to_nsecs(cycle_to_cputime(ti->softirq_time));
account_system_index_time(tsk, delta, CPUTIME_SOFTIRQ);
}

Expand Down
15 changes: 8 additions & 7 deletions arch/powerpc/kernel/time.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
#include <linux/clk-provider.h>
#include <linux/suspend.h>
#include <linux/rtc.h>
#include <linux/cputime.h>
#include <asm/trace.h>

#include <asm/io.h>
Expand All @@ -72,7 +73,6 @@
#include <asm/smp.h>
#include <asm/vdso_datapage.h>
#include <asm/firmware.h>
#include <asm/cputime.h>
#include <asm/asm-prototypes.h>

/* powerpc clocksource/clockevent code */
Expand Down Expand Up @@ -399,7 +399,7 @@ void vtime_flush(struct task_struct *tsk)
tsk->utimescaled += cputime_to_nsecs(acct->utime_scaled);

if (acct->gtime)
account_guest_time(tsk, acct->gtime);
account_guest_time(tsk, cputime_to_nsecs(acct->gtime));

if (acct->steal_time)
account_steal_time(cputime_to_nsecs(acct->steal_time));
Expand All @@ -408,16 +408,17 @@ void vtime_flush(struct task_struct *tsk)
account_idle_time(cputime_to_nsecs(acct->idle_time));

if (acct->stime)
account_system_index_time(tsk, acct->stime, CPUTIME_SYSTEM);

account_system_index_time(tsk, cputime_to_nsecs(acct->stime),
CPUTIME_SYSTEM);
if (acct->stime_scaled)
tsk->stimescaled += cputime_to_nsecs(acct->stime_scaled);

if (acct->hardirq_time)
account_system_index_time(tsk, acct->hardirq_time, CPUTIME_IRQ);

account_system_index_time(tsk, cputime_to_nsecs(acct->hardirq_time),
CPUTIME_IRQ);
if (acct->softirq_time)
account_system_index_time(tsk, acct->softirq_time, CPUTIME_SOFTIRQ);
account_system_index_time(tsk, cputime_to_nsecs(acct->softirq_time),
CPUTIME_SOFTIRQ);

acct->utime = 0;
acct->utime_scaled = 0;
Expand Down
2 changes: 1 addition & 1 deletion arch/s390/kernel/idle.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
#include <linux/notifier.h>
#include <linux/init.h>
#include <linux/cpu.h>
#include <asm/cputime.h>
#include <linux/cputime.h>
#include <asm/nmi.h>
#include <asm/smp.h>
#include "entry.h"
Expand Down
6 changes: 3 additions & 3 deletions arch/s390/kernel/vtime.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@
*/

#include <linux/kernel_stat.h>
#include <linux/cputime.h>
#include <linux/export.h>
#include <linux/kernel.h>
#include <linux/timex.h>
#include <linux/types.h>
#include <linux/time.h>

#include <asm/cputime.h>
#include <asm/vtimer.h>
#include <asm/vtime.h>
#include <asm/cpu_mf.h>
Expand Down Expand Up @@ -115,7 +115,7 @@ static void account_system_index_scaled(struct task_struct *p,
enum cpu_usage_stat index)
{
p->stimescaled += cputime_to_nsecs(scaled);
account_system_index_time(p, cputime, index);
account_system_index_time(p, cputime_to_nsecs(cputime), index);
}

/*
Expand Down Expand Up @@ -171,7 +171,7 @@ static int do_account_vtime(struct task_struct *tsk)
}

if (guest) {
account_guest_time(tsk, guest);
account_guest_time(tsk, cputime_to_nsecs(guest));
tsk->utimescaled += cputime_to_nsecs(scale_vtime(guest));
}

Expand Down
7 changes: 3 additions & 4 deletions include/linux/kernel_stat.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
#include <linux/sched.h>
#include <linux/vtime.h>
#include <asm/irq.h>
#include <linux/cputime.h>

/*
* 'kernel_stat.h' contains the definitions needed for doing
Expand Down Expand Up @@ -79,9 +78,9 @@ static inline unsigned int kstat_cpu_irqs_sum(unsigned int cpu)
}

extern void account_user_time(struct task_struct *, u64);
extern void account_guest_time(struct task_struct *, cputime_t);
extern void account_system_time(struct task_struct *, int, cputime_t);
extern void account_system_index_time(struct task_struct *, cputime_t,
extern void account_guest_time(struct task_struct *, u64);
extern void account_system_time(struct task_struct *, int, u64);
extern void account_system_index_time(struct task_struct *, u64,
enum cpu_usage_stat);
extern void account_steal_time(u64);
extern void account_idle_time(u64);
Expand Down
39 changes: 19 additions & 20 deletions kernel/sched/cputime.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include <linux/kernel_stat.h>
#include <linux/static_key.h>
#include <linux/context_tracking.h>
#include <linux/cputime.h>
#include "sched.h"
#ifdef CONFIG_PARAVIRT
#include <asm/paravirt.h>
Expand Down Expand Up @@ -138,22 +139,22 @@ void account_user_time(struct task_struct *p, u64 cputime)
* @p: the process that the cpu time gets accounted to
* @cputime: the cpu time spent in virtual machine since the last update
*/
void account_guest_time(struct task_struct *p, cputime_t cputime)
void account_guest_time(struct task_struct *p, u64 cputime)
{
u64 *cpustat = kcpustat_this_cpu->cpustat;

/* Add guest time to process. */
p->utime += cputime_to_nsecs(cputime);
account_group_user_time(p, cputime_to_nsecs(cputime));
p->gtime += cputime_to_nsecs(cputime);
p->utime += cputime;
account_group_user_time(p, cputime);
p->gtime += cputime;

/* Add guest time to cpustat. */
if (task_nice(p) > 0) {
cpustat[CPUTIME_NICE] += cputime_to_nsecs(cputime);
cpustat[CPUTIME_GUEST_NICE] += cputime_to_nsecs(cputime);
cpustat[CPUTIME_NICE] += cputime;
cpustat[CPUTIME_GUEST_NICE] += cputime;
} else {
cpustat[CPUTIME_USER] += cputime_to_nsecs(cputime);
cpustat[CPUTIME_GUEST] += cputime_to_nsecs(cputime);
cpustat[CPUTIME_USER] += cputime;
cpustat[CPUTIME_GUEST] += cputime;
}
}

Expand All @@ -164,14 +165,14 @@ void account_guest_time(struct task_struct *p, cputime_t cputime)
* @index: pointer to cpustat field that has to be updated
*/
void account_system_index_time(struct task_struct *p,
cputime_t cputime, enum cpu_usage_stat index)
u64 cputime, enum cpu_usage_stat index)
{
/* Add system time to process. */
p->stime += cputime_to_nsecs(cputime);
account_group_system_time(p, cputime_to_nsecs(cputime));
p->stime += cputime;
account_group_system_time(p, cputime);

/* Add system time to cpustat. */
task_group_account_field(p, index, cputime_to_nsecs(cputime));
task_group_account_field(p, index, cputime);

/* Account for system time used */
acct_account_cputime(p);
Expand All @@ -183,8 +184,7 @@ void account_system_index_time(struct task_struct *p,
* @hardirq_offset: the offset to subtract from hardirq_count()
* @cputime: the cpu time spent in kernel space since the last update
*/
void account_system_time(struct task_struct *p, int hardirq_offset,
cputime_t cputime)
void account_system_time(struct task_struct *p, int hardirq_offset, u64 cputime)
{
int index;

Expand Down Expand Up @@ -388,16 +388,15 @@ static void irqtime_account_process_tick(struct task_struct *p, int user_tick,
* So, we have to handle it separately here.
* Also, p->stime needs to be updated for ksoftirqd.
*/
account_system_index_time(p, old_cputime, CPUTIME_SOFTIRQ);
account_system_index_time(p, cputime, CPUTIME_SOFTIRQ);
} else if (user_tick) {
account_user_time(p, cputime);
} else if (p == rq->idle) {
account_idle_time(cputime);
} else if (p->flags & PF_VCPU) { /* System time or guest time */

account_guest_time(p, old_cputime);
account_guest_time(p, cputime);
} else {
account_system_index_time(p, old_cputime, CPUTIME_SYSTEM);
account_system_index_time(p, cputime, CPUTIME_SYSTEM);
}
}

Expand Down Expand Up @@ -502,7 +501,7 @@ void account_process_tick(struct task_struct *p, int user_tick)
if (user_tick)
account_user_time(p, cputime);
else if ((p != rq->idle) || (irq_count() != HARDIRQ_OFFSET))
account_system_time(p, HARDIRQ_OFFSET, old_cputime);
account_system_time(p, HARDIRQ_OFFSET, cputime);
else
account_idle_time(cputime);
}
Expand Down Expand Up @@ -722,7 +721,7 @@ static void __vtime_account_system(struct task_struct *tsk)
{
cputime_t delta_cpu = get_vtime_delta(tsk);

account_system_time(tsk, irq_count(), delta_cpu);
account_system_time(tsk, irq_count(), cputime_to_nsecs(delta_cpu));
}

void vtime_account_system(struct task_struct *tsk)
Expand Down

0 comments on commit fb8b049

Please sign in to comment.