Commit 8c8b73c4 authored by Frederic Weisbecker's avatar Frederic Weisbecker Committed by Ingo Molnar

sched/cputime, powerpc: Prepare accounting structure for cputime flush on tick

In order to prepare for CONFIG_VIRT_CPU_ACCOUNTING_NATIVE=y to delay
cputime accounting to the tick, provide finegrained accumulators to
powerpc in order to store the cputime until flushing.

While at it, normalize the name of several fields according to common
cputime naming.
Signed-off-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
Acked-by: default avatarThomas Gleixner <tglx@linutronix.de>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Christian Borntraeger <borntraeger@de.ibm.com>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Rik van Riel <riel@redhat.com>
Cc: Stanislaw Gruszka <sgruszka@redhat.com>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Wanpeng Li <wanpeng.li@hotmail.com>
Link: http://lkml.kernel.org/r/1483636310-6557-6-git-send-email-fweisbec@gmail.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 1213699a
...@@ -12,9 +12,17 @@ ...@@ -12,9 +12,17 @@
/* Stuff for accurate time accounting */ /* Stuff for accurate time accounting */
struct cpu_accounting_data { struct cpu_accounting_data {
unsigned long user_time; /* accumulated usermode TB ticks */ /* Accumulated cputime values to flush on ticks*/
unsigned long system_time; /* accumulated system TB ticks */ unsigned long utime;
unsigned long user_time_scaled; /* accumulated usermode SPURR ticks */ unsigned long stime;
unsigned long utime_scaled;
unsigned long stime_scaled;
unsigned long gtime;
unsigned long hardirq_time;
unsigned long softirq_time;
unsigned long steal_time;
unsigned long idle_time;
/* Internal counters */
unsigned long starttime; /* TB value snapshot */ unsigned long starttime; /* TB value snapshot */
unsigned long starttime_user; /* TB value on exit to usermode */ unsigned long starttime_user; /* TB value on exit to usermode */
unsigned long startspurr; /* SPURR value snapshot */ unsigned long startspurr; /* SPURR value snapshot */
......
...@@ -252,9 +252,9 @@ int main(void) ...@@ -252,9 +252,9 @@ int main(void)
DEFINE(ACCOUNT_STARTTIME_USER, DEFINE(ACCOUNT_STARTTIME_USER,
offsetof(struct paca_struct, accounting.starttime_user)); offsetof(struct paca_struct, accounting.starttime_user));
DEFINE(ACCOUNT_USER_TIME, DEFINE(ACCOUNT_USER_TIME,
offsetof(struct paca_struct, accounting.user_time)); offsetof(struct paca_struct, accounting.utime));
DEFINE(ACCOUNT_SYSTEM_TIME, DEFINE(ACCOUNT_SYSTEM_TIME,
offsetof(struct paca_struct, accounting.system_time)); offsetof(struct paca_struct, accounting.stime));
DEFINE(PACA_TRAP_SAVE, offsetof(struct paca_struct, trap_save)); DEFINE(PACA_TRAP_SAVE, offsetof(struct paca_struct, trap_save));
DEFINE(PACA_NAPSTATELOST, offsetof(struct paca_struct, nap_state_lost)); DEFINE(PACA_NAPSTATELOST, offsetof(struct paca_struct, nap_state_lost));
DEFINE(PACA_SPRG_VDSO, offsetof(struct paca_struct, sprg_vdso)); DEFINE(PACA_SPRG_VDSO, offsetof(struct paca_struct, sprg_vdso));
...@@ -265,9 +265,9 @@ int main(void) ...@@ -265,9 +265,9 @@ int main(void)
DEFINE(ACCOUNT_STARTTIME_USER, DEFINE(ACCOUNT_STARTTIME_USER,
offsetof(struct thread_info, accounting.starttime_user)); offsetof(struct thread_info, accounting.starttime_user));
DEFINE(ACCOUNT_USER_TIME, DEFINE(ACCOUNT_USER_TIME,
offsetof(struct thread_info, accounting.user_time)); offsetof(struct thread_info, accounting.utime));
DEFINE(ACCOUNT_SYSTEM_TIME, DEFINE(ACCOUNT_SYSTEM_TIME,
offsetof(struct thread_info, accounting.system_time)); offsetof(struct thread_info, accounting.stime));
#endif #endif
#endif /* CONFIG_PPC64 */ #endif /* CONFIG_PPC64 */
......
...@@ -271,8 +271,8 @@ void accumulate_stolen_time(void) ...@@ -271,8 +271,8 @@ void accumulate_stolen_time(void)
sst = scan_dispatch_log(acct->starttime_user); sst = scan_dispatch_log(acct->starttime_user);
ust = scan_dispatch_log(acct->starttime); ust = scan_dispatch_log(acct->starttime);
acct->system_time -= sst; acct->stime -= sst;
acct->user_time -= ust; acct->utime -= ust;
local_paca->stolen_time += ust + sst; local_paca->stolen_time += ust + sst;
local_paca->soft_enabled = save_soft_enabled; local_paca->soft_enabled = save_soft_enabled;
...@@ -281,10 +281,11 @@ void accumulate_stolen_time(void) ...@@ -281,10 +281,11 @@ void accumulate_stolen_time(void)
static inline u64 calculate_stolen_time(u64 stop_tb) static inline u64 calculate_stolen_time(u64 stop_tb)
{ {
u64 stolen = 0; u64 stolen = 0;
struct cpu_accounting_data *acct = &local_paca->accounting;
if (get_paca()->dtl_ridx != be64_to_cpu(get_lppaca()->dtl_idx)) { if (get_paca()->dtl_ridx != be64_to_cpu(get_lppaca()->dtl_idx)) {
stolen = scan_dispatch_log(stop_tb); stolen = scan_dispatch_log(stop_tb);
get_paca()->accounting.system_time -= stolen; acct->stime -= stolen;
} }
stolen += get_paca()->stolen_time; stolen += get_paca()->stolen_time;
...@@ -316,17 +317,17 @@ static unsigned long vtime_delta(struct task_struct *tsk, ...@@ -316,17 +317,17 @@ static unsigned long vtime_delta(struct task_struct *tsk,
now = mftb(); now = mftb();
nowscaled = read_spurr(now); nowscaled = read_spurr(now);
acct->system_time += now - acct->starttime; acct->stime += now - acct->starttime;
acct->starttime = now; acct->starttime = now;
deltascaled = nowscaled - acct->startspurr; deltascaled = nowscaled - acct->startspurr;
acct->startspurr = nowscaled; acct->startspurr = nowscaled;
*stolen = calculate_stolen_time(now); *stolen = calculate_stolen_time(now);
delta = acct->system_time; delta = acct->stime;
acct->system_time = 0; acct->stime = 0;
udelta = acct->user_time - acct->utime_sspurr; udelta = acct->utime - acct->utime_sspurr;
acct->utime_sspurr = acct->user_time; acct->utime_sspurr = acct->utime;
/* /*
* Because we don't read the SPURR on every kernel entry/exit, * Because we don't read the SPURR on every kernel entry/exit,
...@@ -348,7 +349,7 @@ static unsigned long vtime_delta(struct task_struct *tsk, ...@@ -348,7 +349,7 @@ static unsigned long vtime_delta(struct task_struct *tsk,
*sys_scaled = deltascaled; *sys_scaled = deltascaled;
} }
} }
acct->user_time_scaled += user_scaled; acct->utime_scaled += user_scaled;
return delta; return delta;
} }
...@@ -387,10 +388,10 @@ void vtime_account_user(struct task_struct *tsk) ...@@ -387,10 +388,10 @@ void vtime_account_user(struct task_struct *tsk)
cputime_t utime, utimescaled; cputime_t utime, utimescaled;
struct cpu_accounting_data *acct = get_accounting(tsk); struct cpu_accounting_data *acct = get_accounting(tsk);
utime = acct->user_time; utime = acct->utime;
utimescaled = acct->user_time_scaled; utimescaled = acct->utime_scaled;
acct->user_time = 0; acct->utime = 0;
acct->user_time_scaled = 0; acct->utime_scaled = 0;
acct->utime_sspurr = 0; acct->utime_sspurr = 0;
account_user_time(tsk, utime); account_user_time(tsk, utime);
tsk->utimescaled += utimescaled; tsk->utimescaled += utimescaled;
...@@ -408,8 +409,8 @@ void arch_vtime_task_switch(struct task_struct *prev) ...@@ -408,8 +409,8 @@ void arch_vtime_task_switch(struct task_struct *prev)
acct->starttime = get_accounting(prev)->starttime; acct->starttime = get_accounting(prev)->starttime;
acct->startspurr = get_accounting(prev)->startspurr; acct->startspurr = get_accounting(prev)->startspurr;
acct->system_time = 0; acct->stime = 0;
acct->user_time = 0; acct->utime = 0;
} }
#endif /* CONFIG_PPC32 */ #endif /* CONFIG_PPC32 */
......
...@@ -2287,9 +2287,9 @@ static void dump_one_paca(int cpu) ...@@ -2287,9 +2287,9 @@ static void dump_one_paca(int cpu)
DUMP(p, subcore_sibling_mask, "x"); DUMP(p, subcore_sibling_mask, "x");
#endif #endif
DUMP(p, accounting.user_time, "llx"); DUMP(p, accounting.utime, "llx");
DUMP(p, accounting.system_time, "llx"); DUMP(p, accounting.stime, "llx");
DUMP(p, accounting.user_time_scaled, "llx"); DUMP(p, accounting.utime_scaled, "llx");
DUMP(p, accounting.starttime, "llx"); DUMP(p, accounting.starttime, "llx");
DUMP(p, accounting.starttime_user, "llx"); DUMP(p, accounting.starttime_user, "llx");
DUMP(p, accounting.startspurr, "llx"); DUMP(p, accounting.startspurr, "llx");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment