vtime: Delay cputime accounting to tick / context switch
cover vtime: Delay cputime accounting to tick / context switch
This version is a rebase on top of latest Linus tree which includes the fix 8f2b468aadc ("s390/vtime: correct system time accounting").
Also a small change: I have moved account_system_index_scaled() to s390 in patch "s390/cputime: delayed accounting of system time" because it is the only user of the function.
git://git.kernel.org/pub/scm/linux/kernel/git/frederic/linux-dynticks.git
vtime/acc-v2
Thanks,
Frederic
---
Frederic Weisbecker (9):
powerpc32: Fix stale scaled stime on context switch
ia64: Fix wrong start cputime assignment on task switch
cputime: Allow accounting system time using cpustat index
cputime: Export account_guest_time
powerpc: Prepare accounting structure for cputime flush on tick
powerpc: Migrate stolen_time field to accounting structure powerpc/vtime: Accumulate cputime and account only on tick/task switch
ia64: Accumulate cputime and account only on tick/task switch
vtime: Rename vtime_account_user() to vtime_flush()
Martin Schwidefsky (1):
s390/cputime: delayed accounting of system time
arch/ia64/include/asm/thread_info.h | 6 ++ arch/ia64/kernel/time.c | 66 +++++++++++----- arch/powerpc/include/asm/accounting.h | 14 +++- arch/powerpc/include/asm/paca.h | 1 - arch/powerpc/kernel/asm-offsets.c | 8 +- arch/powerpc/kernel/time.c | 138 +++++++++++++++++++++------------- arch/powerpc/xmon/xmon.c | 8 +- arch/s390/include/asm/lowcore.h | 65 ++++++++-------- arch/s390/include/asm/processor.h | 3 + arch/s390/kernel/vtime.c | 138 ++++++++++++++++++++++------------ include/linux/kernel_stat.h | 5 +- include/linux/vtime.h | 7 +- kernel/sched/cputime.c | 16 ++-- 13 files changed, 302 insertions(+), 173 deletions(-)
PATCH 1/10 powerpc32: Fix stale scaled stime on context switch
On context switch with powerpc32, the cputime is accumulated in the thread_info struct. So the switching-in task must move forward its start time snapshot to the current time in order to later compute the delta spent in system mode.
This is what we do for the normal cputime by initializing the starttime field to the value of the previous task's starttime which got freshly updated.
But we are missing the update of the scaled cputime start time. As a result we may be accounting too much scaled cputime later.
Fix this by initializing the scaled cputime the same way we do for normal cputime.
--- arch/powerpc/kernel/time.c | 1 + 1 file changed, 1 insertion(+)
arch/powerpc/kernel/time.c +1 -0
@@ -407,6 +407,7 @@ void arch_vtime_task_switch(struct task_struct *prev)struct cpu_accounting_data *acct =get_accounting (current); acct->starttime =get_accounting (prev)->starttime; + acct->startspurr =get_accounting (prev)->startspurr; acct->system_time =0 ; acct->user_time =0 ; }
Signature · 1 line
2.7.4
tip-bot for Frederic Weisbecker
merge bot[tip:sched/core] sched/cputime, powerpc32: Fix stale scaled stime on context switch
sched/cputime, powerpc32: Fix stale scaled stime on context switch
Commit-ID: 90d08ba2b9b4be4aeca6a5b5a4b09fbcde30194d Gitweb: http://git.kernel.org/tip/90d08ba2b9b4be4aeca6a5b5a4b09fbcde30194d Author: Frederic Weisbecker <[email protected]> AuthorDate: Thu, 5 Jan 2017 18:11:41 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Sat, 14 Jan 2017 09:54:11 +0100
sched/cputime, powerpc32: Fix stale scaled stime on context switch
On context switch with powerpc32, the cputime is accumulated in the thread_info struct. So the switching-in task must move forward its start time snapshot to the current time in order to later compute the delta spent in system mode.
This is what we do for the normal cputime by initializing the starttime field to the value of the previous task's starttime which got freshly updated.
But we are missing the update of the scaled cputime start time. As a result we may be accounting too much scaled cputime later.
Fix this by initializing the scaled cputime the same way we do for normal cputime.
--- arch/powerpc/kernel/time.c | 1 + 1 file changed, 1 insertion(+)
arch/powerpc/kernel/time.c +1 -0
@@ -407,6 +407,7 @@ void arch_vtime_task_switch(struct task_struct *prev)struct cpu_accounting_data *acct =get_accounting (current); acct->starttime =get_accounting (prev)->starttime; + acct->startspurr =get_accounting (prev)->startspurr; acct->system_time =0 ; acct->user_time =0 ; }
PATCH 2/10 ia64: Fix wrong start cputime assignment on task switch
In reply to Frederic WeisbeckerOn task switch we must initialize the current cputime of the next task using the value of the previous task which got freshly updated.
But we are confusing that with doing the opposite, which should result in wrong cputime accounting.
--- arch/ia64/kernel/time.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/ia64/kernel/time.c +1 -1
@@ -83,7 +83,7 @@ void arch_vtime_task_switch(struct task_struct *prev)struct thread_info *pi =task_thread_info (prev);struct thread_info *ni =task_thread_info (current); - pi->ac_stamp = ni->ac_stamp; + ni->ac_stamp = pi->ac_stamp; ni->ac_stime = ni->ac_utime =0 ; }
Signature · 1 line
2.7.4
tip-bot for Frederic Weisbecker
merge bot[tip:sched/core] sched/cputime, ia64: Fix incorrect start cputime assignment on task switch
sched/cputime, ia64: Fix incorrect start cputime assignment on task switch
Commit-ID: 8388d21468e7e7656867b67ab2ec98a78c9ad799 Gitweb: http://git.kernel.org/tip/8388d21468e7e7656867b67ab2ec98a78c9ad799 Author: Frederic Weisbecker <[email protected]> AuthorDate: Thu, 5 Jan 2017 18:11:42 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Sat, 14 Jan 2017 09:54:11 +0100
sched/cputime, ia64: Fix incorrect start cputime assignment on task switch
On task switch we must initialize the current cputime of the next task using the value of the previous task which got freshly updated.
But we are confusing that with doing the opposite, which should result in incorrect cputime accounting.
--- arch/ia64/kernel/time.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/ia64/kernel/time.c +1 -1
@@ -83,7 +83,7 @@ void arch_vtime_task_switch(struct task_struct *prev)struct thread_info *pi =task_thread_info (prev);struct thread_info *ni =task_thread_info (current); - pi->ac_stamp = ni->ac_stamp; + ni->ac_stamp = pi->ac_stamp; ni->ac_stime = ni->ac_utime =0 ; }
PATCH 3/10 cputime: Allow accounting system time using cpustat index
In reply to Frederic WeisbeckerIn order to prepare for CONFIG_VIRT_CPU_ACCOUNTING_NATIVE to delay cputime accounting to the tick, let's provide APIs to account system time to precise contexts: hardirq, softirq, pure system, ...
--- include/linux/kernel_stat.h | 2 ++ kernel/sched/cputime.c | 10 +++++----- 2 files changed, 7 insertions(+), 5 deletions(-)
include/linux/kernel_stat.h +2 -0
@@ -80,6 +80,8 @@ static inline unsigned int kstat_cpu_irqs_sum(unsigned int cpu)extern void account_user_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 , +enum cpu_usage_stat );extern void account_steal_time (cputime_t );extern void account_idle_time (cputime_t );
kernel/sched/cputime.c +5 -5
@@ -176,8 +176,8 @@ static void account_guest_time(struct task_struct *p, cputime_t cputime)* @cputime: the cpu time spent in kernel space since the last update * @index: pointer to cpustat field that has to be updated */ -static inline -void __account_system_time (struct task_struct *p,cputime_t cputime,int index) +void account_system_index_time (struct task_struct *p, +cputime_t cputime,enum cpu_usage_stat index) {/* Add system time to process. */ p->stime += cputime;
@@ -213,7 +213,7 @@ void account_system_time(struct task_struct *p, int hardirq_offset,else index =CPUTIME_SYSTEM ; -__account_system_time (p, cputime, index); +account_system_index_time (p, cputime, index); }/*
@@ -400,7 +400,7 @@ 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_time (p, 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) {
@@ -408,7 +408,7 @@ static void irqtime_account_process_tick(struct task_struct *p, int user_tick, }else if (p->flags &PF_VCPU ) {/* System time or guest time */ account_guest_time (p, cputime); }else { -__account_system_time (p, cputime,CPUTIME_SYSTEM ); +account_system_index_time (p, cputime,CPUTIME_SYSTEM ); } }
Signature · 1 line
2.7.4
tip-bot for Frederic Weisbecker
merge bot[tip:sched/core] sched/cputime: Allow accounting system time using cpustat index
sched/cputime: Allow accounting system time using cpustat index
Commit-ID: c31cc6a5187e8b09ccee34f81728a90f80e872e7 Gitweb: http://git.kernel.org/tip/c31cc6a5187e8b09ccee34f81728a90f80e872e7 Author: Frederic Weisbecker <[email protected]> AuthorDate: Thu, 5 Jan 2017 18:11:43 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Sat, 14 Jan 2017 09:54:11 +0100
sched/cputime: Allow accounting system time using cpustat index
In order to prepare for CONFIG_VIRT_CPU_ACCOUNTING_NATIVE=y to delay cputime accounting to the tick, let's provide APIs to account system time to precise contexts: hardirq, softirq, pure system, ...
--- include/linux/kernel_stat.h | 2 ++ kernel/sched/cputime.c | 10 +++++----- 2 files changed, 7 insertions(+), 5 deletions(-)
include/linux/kernel_stat.h +2 -0
@@ -80,6 +80,8 @@ static inline unsigned int kstat_cpu_irqs_sum(unsigned int cpu)extern void account_user_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 , +enum cpu_usage_stat );extern void account_steal_time (cputime_t );extern void account_idle_time (cputime_t );
kernel/sched/cputime.c +5 -5
@@ -176,8 +176,8 @@ static void account_guest_time(struct task_struct *p, cputime_t cputime)* @cputime: the cpu time spent in kernel space since the last update * @index: pointer to cpustat field that has to be updated */ -static inline -void __account_system_time (struct task_struct *p,cputime_t cputime,int index) +void account_system_index_time (struct task_struct *p, +cputime_t cputime,enum cpu_usage_stat index) {/* Add system time to process. */ p->stime += cputime;
@@ -213,7 +213,7 @@ void account_system_time(struct task_struct *p, int hardirq_offset,else index =CPUTIME_SYSTEM ; -__account_system_time (p, cputime, index); +account_system_index_time (p, cputime, index); }/*
@@ -400,7 +400,7 @@ 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_time (p, 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) {
@@ -408,7 +408,7 @@ static void irqtime_account_process_tick(struct task_struct *p, int user_tick, }else if (p->flags &PF_VCPU ) {/* System time or guest time */ account_guest_time (p, cputime); }else { -__account_system_time (p, cputime,CPUTIME_SYSTEM ); +account_system_index_time (p, cputime,CPUTIME_SYSTEM ); } }
PATCH 4/10 cputime: Export account_guest_time
In reply to Frederic WeisbeckerIn order to prepare for CONFIG_VIRT_CPU_ACCOUNTING_NATIVE to delay cputime accounting to the tick, let's allow archs to account cputime directly to gtime.
--- include/linux/kernel_stat.h | 1 + kernel/sched/cputime.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-)
include/linux/kernel_stat.h +1 -0
@@ -79,6 +79,7 @@ static inline unsigned int kstat_cpu_irqs_sum(unsigned int cpu) }extern void account_user_time (struct task_struct *,cputime_t ); +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 ,enum cpu_usage_stat );
kernel/sched/cputime.c +1 -1
@@ -151,7 +151,7 @@ void account_user_time(struct task_struct *p, cputime_t cputime)* @p: the process that the cpu time gets accounted to * @cputime: the cpu time spent in virtual machine since the last update */ -static void account_guest_time (struct task_struct *p,cputime_t cputime) +void account_guest_time (struct task_struct *p,cputime_t cputime) {u64 *cpustat = kcpustat_this_cpu->cpustat;
Signature · 1 line
2.7.4
tip-bot for Frederic Weisbecker
merge bot[tip:sched/core] sched/cputime: Export account_guest_time()
sched/cputime: Export account_guest_time()
Commit-ID: 1213699ab426608ff1925ab263dd6925102bb92a Gitweb: http://git.kernel.org/tip/1213699ab426608ff1925ab263dd6925102bb92a Author: Frederic Weisbecker <[email protected]> AuthorDate: Thu, 5 Jan 2017 18:11:44 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Sat, 14 Jan 2017 09:54:11 +0100
sched/cputime: Export account_guest_time()
In order to prepare for CONFIG_VIRT_CPU_ACCOUNTING_NATIVE=y to delay cputime accounting to the tick, let's allow archs to account cputime directly to gtime.
--- include/linux/kernel_stat.h | 1 + kernel/sched/cputime.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-)
include/linux/kernel_stat.h +1 -0
@@ -79,6 +79,7 @@ static inline unsigned int kstat_cpu_irqs_sum(unsigned int cpu) }extern void account_user_time (struct task_struct *,cputime_t ); +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 ,enum cpu_usage_stat );
kernel/sched/cputime.c +1 -1
@@ -151,7 +151,7 @@ void account_user_time(struct task_struct *p, cputime_t cputime)* @p: the process that the cpu time gets accounted to * @cputime: the cpu time spent in virtual machine since the last update */ -static void account_guest_time (struct task_struct *p,cputime_t cputime) +void account_guest_time (struct task_struct *p,cputime_t cputime) {u64 *cpustat = kcpustat_this_cpu->cpustat;
PATCH 5/10 powerpc: Prepare accounting structure for cputime flush on tick
In reply to Frederic WeisbeckerIn order to prepare for CONFIG_VIRT_CPU_ACCOUNTING_NATIVE 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.
--- arch/powerpc/include/asm/accounting.h | 14 +++++++++++--- arch/powerpc/kernel/asm-offsets.c | 8 ++++---- arch/powerpc/kernel/time.c | 31 ++++++++++++++++--------------- arch/powerpc/xmon/xmon.c | 6 +++--- 4 files changed, 34 insertions(+), 25 deletions(-)
arch/powerpc/include/asm/accounting.h +11 -3
@@ -12,9 +12,17 @@/* Stuff for accurate time accounting */ struct cpu_accounting_data { -unsigned long user_time;/* accumulated usermode TB ticks */ -unsigned long system_time;/* accumulated system TB ticks */ -unsigned long user_time_scaled;/* accumulated usermode SPURR ticks */ +/* Accumulated cputime values to flush on ticks*/ +unsigned long utime; +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_user;/* TB value on exit to usermode */ unsigned long startspurr;/* SPURR value snapshot */
arch/powerpc/kernel/asm-offsets.c +4 -4
@@ -252,9 +252,9 @@ int main(void)DEFINE (ACCOUNT_STARTTIME_USER , offsetof(struct paca_struct, accounting.starttime_user));DEFINE (ACCOUNT_USER_TIME , - offsetof(struct paca_struct, accounting.user_time)); + offsetof(struct paca_struct, accounting.utime));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_NAPSTATELOST , offsetof(struct paca_struct , nap_state_lost));DEFINE (PACA_SPRG_VDSO , offsetof(struct paca_struct , sprg_vdso));
@@ -265,9 +265,9 @@ int main(void)DEFINE (ACCOUNT_STARTTIME_USER , offsetof(struct thread_info, accounting.starttime_user));DEFINE (ACCOUNT_USER_TIME , - offsetof(struct thread_info, accounting.user_time)); + offsetof(struct thread_info, accounting.utime));DEFINE (ACCOUNT_SYSTEM_TIME , - offsetof(struct thread_info, accounting.system_time)); + offsetof(struct thread_info, accounting.stime));#endif #endif /* CONFIG_PPC64 */
arch/powerpc/kernel/time.c +16 -15
@@ -271,8 +271,8 @@ void accumulate_stolen_time(void) sst =scan_dispatch_log (acct->starttime_user); ust =scan_dispatch_log (acct->starttime); - acct->system_time -= sst; - acct->user_time -= ust; + acct->stime -= sst; + acct->utime -= ust; local_paca->stolen_time += ust + sst; local_paca->soft_enabled = save_soft_enabled;
@@ -281,10 +281,11 @@ void accumulate_stolen_time(void)static inline u64 calculate_stolen_time (u64 stop_tb) {u64 stolen =0 ; +struct cpu_accounting_data *acct = &local_paca->accounting;if (get_paca ()->dtl_ridx !=be64_to_cpu (get_lppaca ()->dtl_idx)) { stolen =scan_dispatch_log (stop_tb); -get_paca ()->accounting.system_time -= stolen; + acct->stime -= stolen; } stolen +=get_paca ()->stolen_time;
@@ -316,17 +317,17 @@ static unsigned long vtime_delta(struct task_struct *tsk, now =mftb (); nowscaled =read_spurr (now); - acct->system_time += now - acct->starttime; + acct->stime += now - acct->starttime; acct->starttime = now; deltascaled = nowscaled - acct->startspurr; acct->startspurr = nowscaled; *stolen =calculate_stolen_time (now); - delta = acct->system_time; - acct->system_time =0 ; - udelta = acct->user_time - acct->utime_sspurr; - acct->utime_sspurr = acct->user_time; + delta = acct->stime; + acct->stime =0 ; + udelta = acct->utime - acct->utime_sspurr; + acct->utime_sspurr = acct->utime;/* * 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, *sys_scaled = deltascaled; } } - acct->user_time_scaled += user_scaled; + acct->utime_scaled += user_scaled;return delta; }
@@ -387,10 +388,10 @@ void vtime_account_user(struct task_struct *tsk)cputime_t utime, utimescaled;struct cpu_accounting_data *acct =get_accounting (tsk); - utime = acct->user_time; - utimescaled = acct->user_time_scaled; - acct->user_time =0 ; - acct->user_time_scaled =0 ; + utime = acct->utime; + utimescaled = acct->utime_scaled; + acct->utime =0 ; + acct->utime_scaled =0 ; acct->utime_sspurr =0 ;account_user_time (tsk, utime); tsk->utimescaled += utimescaled;
@@ -408,8 +409,8 @@ void arch_vtime_task_switch(struct task_struct *prev) acct->starttime =get_accounting (prev)->starttime; acct->startspurr =get_accounting (prev)->startspurr; - acct->system_time =0 ; - acct->user_time = 0; + acct->stime =0 ; + acct->utime = 0; }#endif /* CONFIG_PPC32 */
arch/powerpc/xmon/xmon.c +3 -3
@@ -2287,9 +2287,9 @@ static void dump_one_paca(int cpu)DUMP (p, subcore_sibling_mask,"x" );#endif -DUMP (p, accounting.user_time,"llx" ); -DUMP (p, accounting.system_time,"llx" ); -DUMP (p, accounting.user_time_scaled,"llx" ); +DUMP (p, accounting.utime,"llx" ); +DUMP (p, accounting.stime,"llx" ); +DUMP (p, accounting.utime_scaled,"llx" );DUMP (p, accounting.starttime,"llx" );DUMP (p, accounting.starttime_user,"llx" );DUMP (p, accounting.startspurr,"llx" );
Signature · 1 line
2.7.4
tip-bot for Frederic Weisbecker
merge bot[tip:sched/core] sched/cputime, powerpc: Prepare accounting structure for cputime flush on tick
sched/cputime, powerpc: Prepare accounting structure for cputime flush on tick
Commit-ID: 8c8b73c4811f2b5e458a7418dca07d2ef85c7db1 Gitweb: http://git.kernel.org/tip/8c8b73c4811f2b5e458a7418dca07d2ef85c7db1 Author: Frederic Weisbecker <[email protected]> AuthorDate: Thu, 5 Jan 2017 18:11:45 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Sat, 14 Jan 2017 09:54:12 +0100
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.
--- arch/powerpc/include/asm/accounting.h | 14 +++++++++++--- arch/powerpc/kernel/asm-offsets.c | 8 ++++---- arch/powerpc/kernel/time.c | 31 ++++++++++++++++--------------- arch/powerpc/xmon/xmon.c | 6 +++--- 4 files changed, 34 insertions(+), 25 deletions(-)
arch/powerpc/include/asm/accounting.h +11 -3
@@ -12,9 +12,17 @@/* Stuff for accurate time accounting */ struct cpu_accounting_data { -unsigned long user_time;/* accumulated usermode TB ticks */ -unsigned long system_time;/* accumulated system TB ticks */ -unsigned long user_time_scaled;/* accumulated usermode SPURR ticks */ +/* Accumulated cputime values to flush on ticks*/ +unsigned long utime; +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_user;/* TB value on exit to usermode */ unsigned long startspurr;/* SPURR value snapshot */
arch/powerpc/kernel/asm-offsets.c +4 -4
@@ -252,9 +252,9 @@ int main(void)DEFINE (ACCOUNT_STARTTIME_USER , offsetof(struct paca_struct, accounting.starttime_user));DEFINE (ACCOUNT_USER_TIME , - offsetof(struct paca_struct, accounting.user_time)); + offsetof(struct paca_struct, accounting.utime));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_NAPSTATELOST , offsetof(struct paca_struct , nap_state_lost));DEFINE (PACA_SPRG_VDSO , offsetof(struct paca_struct , sprg_vdso));
@@ -265,9 +265,9 @@ int main(void)DEFINE (ACCOUNT_STARTTIME_USER , offsetof(struct thread_info, accounting.starttime_user));DEFINE (ACCOUNT_USER_TIME , - offsetof(struct thread_info, accounting.user_time)); + offsetof(struct thread_info, accounting.utime));DEFINE (ACCOUNT_SYSTEM_TIME , - offsetof(struct thread_info, accounting.system_time)); + offsetof(struct thread_info, accounting.stime));#endif #endif /* CONFIG_PPC64 */
arch/powerpc/kernel/time.c +16 -15
@@ -271,8 +271,8 @@ void accumulate_stolen_time(void) sst =scan_dispatch_log (acct->starttime_user); ust =scan_dispatch_log (acct->starttime); - acct->system_time -= sst; - acct->user_time -= ust; + acct->stime -= sst; + acct->utime -= ust; local_paca->stolen_time += ust + sst; local_paca->soft_enabled = save_soft_enabled;
@@ -281,10 +281,11 @@ void accumulate_stolen_time(void)static inline u64 calculate_stolen_time (u64 stop_tb) {u64 stolen =0 ; +struct cpu_accounting_data *acct = &local_paca->accounting;if (get_paca ()->dtl_ridx !=be64_to_cpu (get_lppaca ()->dtl_idx)) { stolen =scan_dispatch_log (stop_tb); -get_paca ()->accounting.system_time -= stolen; + acct->stime -= stolen; } stolen +=get_paca ()->stolen_time;
@@ -316,17 +317,17 @@ static unsigned long vtime_delta(struct task_struct *tsk, now =mftb (); nowscaled =read_spurr (now); - acct->system_time += now - acct->starttime; + acct->stime += now - acct->starttime; acct->starttime = now; deltascaled = nowscaled - acct->startspurr; acct->startspurr = nowscaled; *stolen =calculate_stolen_time (now); - delta = acct->system_time; - acct->system_time =0 ; - udelta = acct->user_time - acct->utime_sspurr; - acct->utime_sspurr = acct->user_time; + delta = acct->stime; + acct->stime =0 ; + udelta = acct->utime - acct->utime_sspurr; + acct->utime_sspurr = acct->utime;/* * 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, *sys_scaled = deltascaled; } } - acct->user_time_scaled += user_scaled; + acct->utime_scaled += user_scaled;return delta; }
@@ -387,10 +388,10 @@ void vtime_account_user(struct task_struct *tsk)cputime_t utime, utimescaled;struct cpu_accounting_data *acct =get_accounting (tsk); - utime = acct->user_time; - utimescaled = acct->user_time_scaled; - acct->user_time =0 ; - acct->user_time_scaled =0 ; + utime = acct->utime; + utimescaled = acct->utime_scaled; + acct->utime =0 ; + acct->utime_scaled =0 ; acct->utime_sspurr =0 ;account_user_time (tsk, utime); tsk->utimescaled += utimescaled;
@@ -408,8 +409,8 @@ void arch_vtime_task_switch(struct task_struct *prev) acct->starttime =get_accounting (prev)->starttime; acct->startspurr =get_accounting (prev)->startspurr; - acct->system_time =0 ; - acct->user_time = 0; + acct->stime =0 ; + acct->utime = 0; }#endif /* CONFIG_PPC32 */
arch/powerpc/xmon/xmon.c +3 -3
@@ -2287,9 +2287,9 @@ static void dump_one_paca(int cpu)DUMP (p, subcore_sibling_mask,"x" );#endif -DUMP (p, accounting.user_time,"llx" ); -DUMP (p, accounting.system_time,"llx" ); -DUMP (p, accounting.user_time_scaled,"llx" ); +DUMP (p, accounting.utime,"llx" ); +DUMP (p, accounting.stime,"llx" ); +DUMP (p, accounting.utime_scaled,"llx" );DUMP (p, accounting.starttime,"llx" );DUMP (p, accounting.starttime_user,"llx" );DUMP (p, accounting.startspurr,"llx" );
PATCH 6/10 powerpc: Migrate stolen_time field to accounting structure
In reply to Frederic WeisbeckerThat in order to gather all cputime accumulation to the same place.
--- arch/powerpc/include/asm/paca.h | 1 - arch/powerpc/kernel/time.c | 6 +++--- arch/powerpc/xmon/xmon.c | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-)
arch/powerpc/include/asm/paca.h +0 -1
@@ -187,7 +187,6 @@ struct paca_struct {/* Stuff for accurate time accounting */ struct cpu_accounting_data accounting; -u64 stolen_time;/* TB ticks taken by hypervisor */ u64 dtl_ridx;/* read index in dispatch log */ struct dtl_entry *dtl_curr;/* pointer corresponding to dtl_ridx */
arch/powerpc/kernel/time.c +3 -3
@@ -273,7 +273,7 @@ void accumulate_stolen_time(void) ust =scan_dispatch_log (acct->starttime); acct->stime -= sst; acct->utime -= ust; - local_paca->stolen_time += ust + sst; + acct->steal_time += ust + sst; local_paca->soft_enabled = save_soft_enabled; }
@@ -288,8 +288,8 @@ static inline u64 calculate_stolen_time(u64 stop_tb) acct->stime -= stolen; } - stolen +=get_paca ()->stolen_time; -get_paca ()->stolen_time =0 ; + stolen += acct->steal_time; + acct->steal_time =0 ;return stolen; }
arch/powerpc/xmon/xmon.c +1 -1
@@ -2294,7 +2294,7 @@ static void dump_one_paca(int cpu)DUMP (p, accounting.starttime_user,"llx" );DUMP (p, accounting.startspurr,"llx" );DUMP (p, accounting.utime_sspurr,"llx" ); -DUMP (p, stolen_time,"llx" ); +DUMP (p, accounting.steal_time,"llx" );#undef DUMP catch_memory_errors =0 ;
Signature · 1 line
2.7.4
tip-bot for Frederic Weisbecker
merge bot[tip:sched/core] sched/cputime, powerpc: Migrate stolen_time field to the accounting structure
sched/cputime, powerpc: Migrate stolen_time field to the accounting structure
Commit-ID: f828c3d0aebab130a19d36336b50afa3414fa0bc Gitweb: http://git.kernel.org/tip/f828c3d0aebab130a19d36336b50afa3414fa0bc Author: Frederic Weisbecker <[email protected]> AuthorDate: Thu, 5 Jan 2017 18:11:46 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Sat, 14 Jan 2017 09:54:12 +0100
sched/cputime, powerpc: Migrate stolen_time field to the accounting structure
That in order to gather all cputime accumulation to the same place.
--- arch/powerpc/include/asm/paca.h | 1 - arch/powerpc/kernel/time.c | 6 +++--- arch/powerpc/xmon/xmon.c | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-)
arch/powerpc/include/asm/paca.h +0 -1
@@ -187,7 +187,6 @@ struct paca_struct {/* Stuff for accurate time accounting */ struct cpu_accounting_data accounting; -u64 stolen_time;/* TB ticks taken by hypervisor */ u64 dtl_ridx;/* read index in dispatch log */ struct dtl_entry *dtl_curr;/* pointer corresponding to dtl_ridx */
arch/powerpc/kernel/time.c +3 -3
@@ -273,7 +273,7 @@ void accumulate_stolen_time(void) ust =scan_dispatch_log (acct->starttime); acct->stime -= sst; acct->utime -= ust; - local_paca->stolen_time += ust + sst; + acct->steal_time += ust + sst; local_paca->soft_enabled = save_soft_enabled; }
@@ -288,8 +288,8 @@ static inline u64 calculate_stolen_time(u64 stop_tb) acct->stime -= stolen; } - stolen +=get_paca ()->stolen_time; -get_paca ()->stolen_time =0 ; + stolen += acct->steal_time; + acct->steal_time =0 ;return stolen; }
arch/powerpc/xmon/xmon.c +1 -1
@@ -2294,7 +2294,7 @@ static void dump_one_paca(int cpu)DUMP (p, accounting.starttime_user,"llx" );DUMP (p, accounting.startspurr,"llx" );DUMP (p, accounting.utime_sspurr,"llx" ); -DUMP (p, stolen_time,"llx" ); +DUMP (p, accounting.steal_time,"llx" );#undef DUMP catch_memory_errors =0 ;
PATCH 7/10 powerpc/vtime: Accumulate cputime and account only on tick/task switch
In reply to Frederic WeisbeckerCurrently CONFIG_VIRT_CPU_ACCOUNTING_NATIVE accounts the cputime on any context boundary: irq entry/exit, guest entry/exit, context switch, etc...
Calling functions such as account_system_time(), account_user_time() and such can be costly, especially if they are called on many fastpath such as twice per IRQ. Those functions do more than just accounting to kcpustat and task cputime. Depending on the config, some subsystems can perform unpleasant multiplications and divisions, among other things.
So lets accumulate the cputime instead and delay the accounting on ticks and context switches only.
--- arch/powerpc/kernel/time.c | 120 +++++++++++++++++++++++++++++---------------- 1 file changed, 77 insertions(+), 43 deletions(-)
arch/powerpc/kernel/time.c +77 -43
@@ -280,17 +280,10 @@ void accumulate_stolen_time(void)static inline u64 calculate_stolen_time (u64 stop_tb) { -u64 stolen =0 ; -struct cpu_accounting_data *acct = &local_paca->accounting; +if (get_paca ()->dtl_ridx !=be64_to_cpu (get_lppaca ()->dtl_idx)) +return scan_dispatch_log (stop_tb); -if (get_paca ()->dtl_ridx !=be64_to_cpu (get_lppaca ()->dtl_idx)) { - stolen =scan_dispatch_log (stop_tb); - acct->stime -= stolen; - } - - stolen += acct->steal_time; - acct->steal_time =0 ; -return stolen; +return 0 ; }#else /* CONFIG_PPC_SPLPAR */
@@ -306,27 +299,26 @@ static inline u64 calculate_stolen_time(u64 stop_tb)* or soft irq state. */ static unsigned long vtime_delta (struct task_struct *tsk, -unsigned long *sys_scaled, -unsigned long *stolen) +unsigned long *stime_scaled, +unsigned long *steal_time) {unsigned long now, nowscaled, deltascaled; -unsigned long udelta, delta, user_scaled; +unsigned long stime; +unsigned long utime, utime_scaled;struct cpu_accounting_data *acct =get_accounting (tsk);WARN_ON_ONCE (!irqs_disabled ()); now =mftb (); nowscaled =read_spurr (now); - acct->stime += now - acct->starttime; + stime = now - acct->starttime; acct->starttime = now; deltascaled = nowscaled - acct->startspurr; acct->startspurr = nowscaled; - *stolen =calculate_stolen_time (now); + *steal_time =calculate_stolen_time (now); - delta = acct->stime; - acct->stime =0 ; - udelta = acct->utime - acct->utime_sspurr; + utime = acct->utime - acct->utime_sspurr; acct->utime_sspurr = acct->utime;/*
@@ -339,39 +331,54 @@ static unsigned long vtime_delta(struct task_struct *tsk,* the user ticks get saved up in paca->user_time_scaled to be * used by account_process_tick. */ - *sys_scaled = delta; - user_scaled = udelta; -if (deltascaled != delta + udelta) { -if (udelta) { - *sys_scaled = deltascaled * delta / (delta + udelta); - user_scaled = deltascaled - *sys_scaled; + *stime_scaled = stime; + utime_scaled = utime; +if (deltascaled != stime + utime) { +if (utime) { + *stime_scaled = deltascaled * stime / (stime + utime); + utime_scaled = deltascaled - *stime_scaled; }else { - *sys_scaled = deltascaled; + *stime_scaled = deltascaled; } } - acct->utime_scaled += user_scaled; + acct->utime_scaled += utime_scaled; -return delta; +return stime; }void vtime_account_system (struct task_struct *tsk) { -unsigned long delta, sys_scaled, stolen; +unsigned long stime, stime_scaled, steal_time; +struct cpu_accounting_data *acct =get_accounting (tsk); - delta =vtime_delta (tsk, &sys_scaled, &stolen); -account_system_time (tsk,0 , delta); - tsk->stimescaled += sys_scaled; -if (stolen) -account_steal_time (stolen); + stime =vtime_delta (tsk, &stime_scaled, &steal_time); + + stime -=min (stime, steal_time); + acct->steal_time += steal_time; + +if ((tsk->flags &PF_VCPU ) && !irq_count ()) { + acct->gtime += stime; + acct->utime_scaled += stime_scaled; + }else { +if (hardirq_count ()) + acct->hardirq_time += stime; +else if (in_serving_softirq ()) + acct->softirq_time += stime; +else + acct->stime += stime; + + acct->stime_scaled += stime_scaled; + } }EXPORT_SYMBOL_GPL (vtime_account_system);void vtime_account_idle (struct task_struct *tsk) { -unsigned long delta, sys_scaled, stolen; +unsigned long stime, stime_scaled, steal_time; +struct cpu_accounting_data *acct =get_accounting (tsk); - delta =vtime_delta (tsk, &sys_scaled, &stolen); -account_idle_time (delta + stolen); + stime =vtime_delta (tsk, &stime_scaled, &steal_time); + acct->idle_time += stime + steal_time; }/*
@@ -385,16 +392,45 @@ void vtime_account_idle(struct task_struct *tsk)*/ void vtime_account_user (struct task_struct *tsk) { -cputime_t utime, utimescaled;struct cpu_accounting_data *acct =get_accounting (tsk); - utime = acct->utime; - utimescaled = acct->utime_scaled; +if (acct->utime) +account_user_time (tsk, acct->utime); + +if (acct->utime_scaled) + tsk->utimescaled += acct->utime_scaled; + +if (acct->gtime) +account_guest_time (tsk, acct->gtime); + +if (acct->steal_time) +account_steal_time (acct->steal_time); + +if (acct->idle_time) +account_idle_time (acct->idle_time); + +if (acct->stime) +account_system_index_time (tsk, acct->stime,CPUTIME_SYSTEM ); + +if (acct->stime_scaled) + tsk->stimescaled += acct->stime_scaled; + +if (acct->hardirq_time) +account_system_index_time (tsk, acct->hardirq_time,CPUTIME_IRQ ); + +if (acct->softirq_time) +account_system_index_time (tsk, acct->softirq_time,CPUTIME_SOFTIRQ ); + acct->utime =0 ; acct->utime_scaled =0 ; acct->utime_sspurr =0 ; -account_user_time (tsk, utime); - tsk->utimescaled += utimescaled; + acct->gtime =0 ; + acct->steal_time =0 ; + acct->idle_time =0 ; + acct->stime =0 ; + acct->stime_scaled =0 ; + acct->hardirq_time =0 ; + acct->softirq_time =0 ; }#ifdef CONFIG_PPC32
@@ -409,8 +445,6 @@ void arch_vtime_task_switch(struct task_struct *prev) acct->starttime =get_accounting (prev)->starttime; acct->startspurr = get_accounting(prev)->startspurr; - acct->stime =0 ; - acct->utime = 0; }#endif /* CONFIG_PPC32 */
Signature · 1 line
2.7.4
tip-bot for Frederic Weisbecker
merge bot[tip:sched/core] sched/cputime, powerpc/vtime: Accumulate cputime and account only on tick/task switch
sched/cputime, powerpc/vtime: Accumulate cputime and account only on tick/task switch
Commit-ID: a19ff1a2cc9227f82e97836a8ee3e593f622eaf9 Gitweb: http://git.kernel.org/tip/a19ff1a2cc9227f82e97836a8ee3e593f622eaf9 Author: Frederic Weisbecker <[email protected]> AuthorDate: Thu, 5 Jan 2017 18:11:47 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Sat, 14 Jan 2017 09:54:12 +0100
sched/cputime, powerpc/vtime: Accumulate cputime and account only on tick/task switch
Currently CONFIG_VIRT_CPU_ACCOUNTING_NATIVE=y accounts the cputime on any context boundary: irq entry/exit, guest entry/exit, context switch, etc...
Calling functions such as account_system_time(), account_user_time() and such can be costly, especially if they are called on many fastpath such as twice per IRQ. Those functions do more than just accounting to kcpustat and task cputime. Depending on the config, some subsystems can perform unpleasant multiplications and divisions, among other things.
So lets accumulate the cputime instead and delay the accounting on ticks and context switches only.
--- arch/powerpc/kernel/time.c | 120 +++++++++++++++++++++++++++++---------------- 1 file changed, 77 insertions(+), 43 deletions(-)
arch/powerpc/kernel/time.c +77 -43
@@ -280,17 +280,10 @@ void accumulate_stolen_time(void)static inline u64 calculate_stolen_time (u64 stop_tb) { -u64 stolen =0 ; -struct cpu_accounting_data *acct = &local_paca->accounting; - -if (get_paca ()->dtl_ridx !=be64_to_cpu (get_lppaca ()->dtl_idx)) { - stolen =scan_dispatch_log (stop_tb); - acct->stime -= stolen; - } +if (get_paca ()->dtl_ridx !=be64_to_cpu (get_lppaca ()->dtl_idx)) +return scan_dispatch_log (stop_tb); - stolen += acct->steal_time; - acct->steal_time =0 ; -return stolen; +return 0 ; }#else /* CONFIG_PPC_SPLPAR */
@@ -306,27 +299,26 @@ static inline u64 calculate_stolen_time(u64 stop_tb)* or soft irq state. */ static unsigned long vtime_delta (struct task_struct *tsk, -unsigned long *sys_scaled, -unsigned long *stolen) +unsigned long *stime_scaled, +unsigned long *steal_time) {unsigned long now, nowscaled, deltascaled; -unsigned long udelta, delta, user_scaled; +unsigned long stime; +unsigned long utime, utime_scaled;struct cpu_accounting_data *acct =get_accounting (tsk);WARN_ON_ONCE (!irqs_disabled ()); now =mftb (); nowscaled =read_spurr (now); - acct->stime += now - acct->starttime; + stime = now - acct->starttime; acct->starttime = now; deltascaled = nowscaled - acct->startspurr; acct->startspurr = nowscaled; - *stolen =calculate_stolen_time (now); + *steal_time =calculate_stolen_time (now); - delta = acct->stime; - acct->stime =0 ; - udelta = acct->utime - acct->utime_sspurr; + utime = acct->utime - acct->utime_sspurr; acct->utime_sspurr = acct->utime;/*
@@ -339,39 +331,54 @@ static unsigned long vtime_delta(struct task_struct *tsk,* the user ticks get saved up in paca->user_time_scaled to be * used by account_process_tick. */ - *sys_scaled = delta; - user_scaled = udelta; -if (deltascaled != delta + udelta) { -if (udelta) { - *sys_scaled = deltascaled * delta / (delta + udelta); - user_scaled = deltascaled - *sys_scaled; + *stime_scaled = stime; + utime_scaled = utime; +if (deltascaled != stime + utime) { +if (utime) { + *stime_scaled = deltascaled * stime / (stime + utime); + utime_scaled = deltascaled - *stime_scaled; }else { - *sys_scaled = deltascaled; + *stime_scaled = deltascaled; } } - acct->utime_scaled += user_scaled; + acct->utime_scaled += utime_scaled; -return delta; +return stime; }void vtime_account_system (struct task_struct *tsk) { -unsigned long delta, sys_scaled, stolen; +unsigned long stime, stime_scaled, steal_time; +struct cpu_accounting_data *acct =get_accounting (tsk); + + stime =vtime_delta (tsk, &stime_scaled, &steal_time); + + stime -=min (stime, steal_time); + acct->steal_time += steal_time; - delta =vtime_delta (tsk, &sys_scaled, &stolen); -account_system_time (tsk,0 , delta); - tsk->stimescaled += sys_scaled; -if (stolen) -account_steal_time (stolen); +if ((tsk->flags &PF_VCPU ) && !irq_count ()) { + acct->gtime += stime; + acct->utime_scaled += stime_scaled; + }else { +if (hardirq_count ()) + acct->hardirq_time += stime; +else if (in_serving_softirq ()) + acct->softirq_time += stime; +else + acct->stime += stime; + + acct->stime_scaled += stime_scaled; + } }EXPORT_SYMBOL_GPL (vtime_account_system);void vtime_account_idle (struct task_struct *tsk) { -unsigned long delta, sys_scaled, stolen; +unsigned long stime, stime_scaled, steal_time; +struct cpu_accounting_data *acct =get_accounting (tsk); - delta =vtime_delta (tsk, &sys_scaled, &stolen); -account_idle_time (delta + stolen); + stime =vtime_delta (tsk, &stime_scaled, &steal_time); + acct->idle_time += stime + steal_time; }/*
@@ -385,16 +392,45 @@ void vtime_account_idle(struct task_struct *tsk)*/ void vtime_account_user (struct task_struct *tsk) { -cputime_t utime, utimescaled;struct cpu_accounting_data *acct =get_accounting (tsk); - utime = acct->utime; - utimescaled = acct->utime_scaled; +if (acct->utime) +account_user_time (tsk, acct->utime); + +if (acct->utime_scaled) + tsk->utimescaled += acct->utime_scaled; + +if (acct->gtime) +account_guest_time (tsk, acct->gtime); + +if (acct->steal_time) +account_steal_time (acct->steal_time); + +if (acct->idle_time) +account_idle_time (acct->idle_time); + +if (acct->stime) +account_system_index_time (tsk, acct->stime,CPUTIME_SYSTEM ); + +if (acct->stime_scaled) + tsk->stimescaled += acct->stime_scaled; + +if (acct->hardirq_time) +account_system_index_time (tsk, acct->hardirq_time,CPUTIME_IRQ ); + +if (acct->softirq_time) +account_system_index_time (tsk, acct->softirq_time,CPUTIME_SOFTIRQ ); + acct->utime =0 ; acct->utime_scaled =0 ; acct->utime_sspurr =0 ; -account_user_time (tsk, utime); - tsk->utimescaled += utimescaled; + acct->gtime =0 ; + acct->steal_time =0 ; + acct->idle_time =0 ; + acct->stime =0 ; + acct->stime_scaled =0 ; + acct->hardirq_time =0 ; + acct->softirq_time =0 ; }#ifdef CONFIG_PPC32
@@ -409,8 +445,6 @@ void arch_vtime_task_switch(struct task_struct *prev) acct->starttime =get_accounting (prev)->starttime; acct->startspurr = get_accounting(prev)->startspurr; - acct->stime =0 ; - acct->utime = 0; }#endif /* CONFIG_PPC32 */
PATCH 8/10 ia64: Accumulate cputime and account only on tick/task switch
In reply to Frederic WeisbeckerCurrently CONFIG_VIRT_CPU_ACCOUNTING_NATIVE accounts the cputime on any context boundary: irq entry/exit, guest entry/exit, context switch, etc...
Calling functions such as account_system_time(), account_user_time() and such can be costly, especially if they are called on many fastpath such as twice per IRQ. Those functions do more than just accounting to kcpustat and task cputime. Depending on the config, some subsystems can perform unpleasant multiplications and divisions, among other things.
So lets accumulate the cputime instead and delay the accounting on ticks and context switches only.
--- arch/ia64/include/asm/thread_info.h | 6 ++++ arch/ia64/kernel/time.c | 60 ++++++++++++++++++++++++++++--------- 2 files changed, 52 insertions(+), 14 deletions(-)
arch/ia64/include/asm/thread_info.h +6 -0
@@ -27,6 +27,12 @@ struct thread_info {mm_segment_t addr_limit;/* user-level address space limit */ int preempt_count;/* 0=premptable, <0=BUG; will also serve as bh-counter */ #ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE +__u64 utime; +__u64 stime; +__u64 gtime; +__u64 hardirq_time; +__u64 softirq_time; +__u64 idle_time;__u64 ac_stamp;__u64 ac_leave;__u64 ac_stime;
arch/ia64/kernel/time.c +46 -14
93 lines not on this page · raw message
Signature · 1 line
2.7.4
tip-bot for Frederic Weisbecker
merge bot[tip:sched/core] sched/cputime, ia64: Accumulate cputime and account only on tick/task switch
sched/cputime, ia64: Accumulate cputime and account only on tick/task switch
Commit-ID: 7dd582305d19fd178bb42ecd1666285ecfb1657a Gitweb: http://git.kernel.org/tip/7dd582305d19fd178bb42ecd1666285ecfb1657a Author: Frederic Weisbecker <[email protected]> AuthorDate: Thu, 5 Jan 2017 18:11:48 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Sat, 14 Jan 2017 09:54:12 +0100
sched/cputime, ia64: Accumulate cputime and account only on tick/task switch
Currently CONFIG_VIRT_CPU_ACCOUNTING_NATIVE=y accounts the cputime on any context boundary: irq entry/exit, guest entry/exit, context switch, etc...
Calling functions such as account_system_time(), account_user_time() and such can be costly, especially if they are called on many fastpath such as twice per IRQ. Those functions do more than just accounting to kcpustat and task cputime. Depending on the config, some subsystems can perform unpleasant multiplications and divisions, among other things.
So lets accumulate the cputime instead and delay the accounting on ticks and context switches only.
--- arch/ia64/include/asm/thread_info.h | 6 ++++ arch/ia64/kernel/time.c | 62 ++++++++++++++++++++++++++++--------- 2 files changed, 53 insertions(+), 15 deletions(-)
arch/ia64/include/asm/thread_info.h +6 -0
@@ -27,6 +27,12 @@ struct thread_info {mm_segment_t addr_limit;/* user-level address space limit */ int preempt_count;/* 0=premptable, <0=BUG; will also serve as bh-counter */ #ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE +__u64 utime; +__u64 stime; +__u64 gtime; +__u64 hardirq_time; +__u64 softirq_time; +__u64 idle_time;__u64 ac_stamp;__u64 ac_leave;__u64 ac_stime;
arch/ia64/kernel/time.c +47 -15
94 lines not on this page · raw message
PATCH 9/10 s390/cputime: delayed accounting of system time
In reply to Frederic WeisbeckerFrom: Martin Schwidefsky <[email protected]>
The account_system_time() function is called with a cputime that occurred while running in the kernel. The function detects which context the CPU is currently running in and accounts the time to the correct bucket. This forces the arch code to account the cputime for hardirq and softirq immediately.
Such accounting function can be costly and perform unwelcome divisions and multiplications, among others.
The arch code can delay the accounting for system time. For s390 the accounting is done once per timer tick and for each task switch.
--- arch/s390/include/asm/lowcore.h | 65 +++++++++--------- arch/s390/include/asm/processor.h | 3 + arch/s390/kernel/vtime.c | 134 +++++++++++++++++++++++++------------- 3 files changed, 124 insertions(+), 78 deletions(-)
arch/s390/include/asm/lowcore.h +34 -31
@@ -85,53 +85,56 @@ struct lowcore {__u64 mcck_enter_timer;/* 0x02c0 */ __u64 exit_timer;/* 0x02c8 */ __u64 user_timer;/* 0x02d0 */ -__u64 system_timer;/* 0x02d8 */ -__u64 steal_timer;/* 0x02e0 */ -__u64 last_update_timer;/* 0x02e8 */ -__u64 last_update_clock;/* 0x02f0 */ -__u64 int_clock;/* 0x02f8 */ -__u64 mcck_clock;/* 0x0300 */ -__u64 clock_comparator;/* 0x0308 */ +__u64 guest_timer;/* 0x02d8 */ +__u64 system_timer;/* 0x02e0 */ +__u64 hardirq_timer;/* 0x02e8 */ +__u64 softirq_timer;/* 0x02f0 */ +__u64 steal_timer;/* 0x02f8 */ +__u64 last_update_timer;/* 0x0300 */ +__u64 last_update_clock;/* 0x0308 */ +__u64 int_clock;/* 0x0310 */ +__u64 mcck_clock;/* 0x0318 */ +__u64 clock_comparator;/* 0x0320 */ /* Current process. */ -__u64 current_task;/* 0x0310 */ -__u8 pad_0x318[0x320 -0x318 ];/* 0x0318 */ -__u64 kernel_stack;/* 0x0320 */ +__u64 current_task;/* 0x0328 */ +__u8 pad_0x318[0x320 -0x318 ];/* 0x0330 */ +__u64 kernel_stack;/* 0x0338 */ /* Interrupt, panic and restart stack. */ -__u64 async_stack;/* 0x0328 */ -__u64 panic_stack;/* 0x0330 */ -__u64 restart_stack;/* 0x0338 */ +__u64 async_stack;/* 0x0340 */ +__u64 panic_stack;/* 0x0348 */ +__u64 restart_stack;/* 0x0350 */ /* Restart function and parameter. */ -__u64 restart_fn;/* 0x0340 */ -__u64 restart_data;/* 0x0348 */ -__u64 restart_source;/* 0x0350 */ +__u64 restart_fn;/* 0x0358 */ +__u64 restart_data;/* 0x0360 */ +__u64 restart_source;/* 0x0368 */ /* Address space pointer. */ -__u64 kernel_asce;/* 0x0358 */ -__u64 user_asce;/* 0x0360 */ +__u64 kernel_asce;/* 0x0370 */ +__u64 user_asce;/* 0x0378 */ /* * The lpp and current_pid fields form a * 64-bit value that is set as program * parameter with the LPP instruction. */ -__u32 lpp;/* 0x0368 */ -__u32 current_pid;/* 0x036c */ +__u32 lpp;/* 0x0380 */ +__u32 current_pid;/* 0x0384 */ /* SMP info area */ -__u32 cpu_nr;/* 0x0370 */ -__u32 softirq_pending;/* 0x0374 */ -__u64 percpu_offset;/* 0x0378 */ -__u64 vdso_per_cpu_data;/* 0x0380 */ -__u64 machine_flags;/* 0x0388 */ -__u32 preempt_count;/* 0x0390 */ -__u8 pad_0x0394[0x0398 -0x0394 ];/* 0x0394 */ -__u64 gmap;/* 0x0398 */ -__u32 spinlock_lockval;/* 0x03a0 */ -__u32 fpu_flags;/* 0x03a4 */ -__u8 pad_0x03a8[0x0400 -0x03a8 ];/* 0x03a8 */ +__u32 cpu_nr;/* 0x0388 */ +__u32 softirq_pending;/* 0x038c */ +__u64 percpu_offset;/* 0x0390 */ +__u64 vdso_per_cpu_data;/* 0x0398 */ +__u64 machine_flags;/* 0x03a0 */ +__u32 preempt_count;/* 0x03a8 */ +__u8 pad_0x03ac[0x03b0 -0x03ac ];/* 0x03ac */ +__u64 gmap;/* 0x03b0 */ +__u32 spinlock_lockval;/* 0x03b8 */ +__u32 fpu_flags;/* 0x03bc */ +__u8 pad_0x03c0[0x0400 -0x03c0 ];/* 0x03c0 */ /* Per cpu primary space access list */ __u32 paste[16 ];/* 0x0400 */
arch/s390/include/asm/processor.h +3 -0
@@ -111,7 +111,10 @@ struct thread_struct {unsigned int acrs[NUM_ACRS ];unsigned long ksp;/* kernel stack pointer */ unsigned long user_timer;/* task cputime in user space */ +unsigned long guest_timer;/* task cputime in kvm guest */ unsigned long system_timer;/* task cputime in kernel space */ +unsigned long hardirq_timer;/* task cputime in hardirq context */ +unsigned long softirq_timer;/* task cputime in softirq context */ unsigned long sys_call_table;/* system call table address */ mm_segment_t mm_segment;unsigned long gmap_addr;/* address of last gmap fault. */
arch/s390/kernel/vtime.c +87 -47
185 lines not on this page · raw message
Signature · 1 line
2.7.4
tip-bot for Martin Schwidefsky
merge bot[tip:sched/core] sched/cputime, s390: Implement delayed accounting of system time
sched/cputime, s390: Implement delayed accounting of system time
Commit-ID: b7394a5f4ce9542666cc68422c3594ea854adc2c Gitweb: http://git.kernel.org/tip/b7394a5f4ce9542666cc68422c3594ea854adc2c Author: Martin Schwidefsky <[email protected]> AuthorDate: Thu, 5 Jan 2017 18:11:49 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Sat, 14 Jan 2017 09:54:12 +0100
sched/cputime, s390: Implement delayed accounting of system time
The account_system_time() function is called with a cputime that occurred while running in the kernel. The function detects which context the CPU is currently running in and accounts the time to the correct bucket. This forces the arch code to account the cputime for hardirq and softirq immediately.
Such accounting function can be costly and perform unwelcome divisions and multiplications, among others.
The arch code can delay the accounting for system time. For s390 the accounting is done once per timer tick and for each task switch.
--- arch/s390/include/asm/lowcore.h | 65 +++++++++--------- arch/s390/include/asm/processor.h | 3 + arch/s390/kernel/vtime.c | 136 ++++++++++++++++++++++++-------------- 3 files changed, 125 insertions(+), 79 deletions(-)
arch/s390/include/asm/lowcore.h +34 -31
@@ -85,53 +85,56 @@ struct lowcore {__u64 mcck_enter_timer;/* 0x02c0 */ __u64 exit_timer;/* 0x02c8 */ __u64 user_timer;/* 0x02d0 */ -__u64 system_timer;/* 0x02d8 */ -__u64 steal_timer;/* 0x02e0 */ -__u64 last_update_timer;/* 0x02e8 */ -__u64 last_update_clock;/* 0x02f0 */ -__u64 int_clock;/* 0x02f8 */ -__u64 mcck_clock;/* 0x0300 */ -__u64 clock_comparator;/* 0x0308 */ +__u64 guest_timer;/* 0x02d8 */ +__u64 system_timer;/* 0x02e0 */ +__u64 hardirq_timer;/* 0x02e8 */ +__u64 softirq_timer;/* 0x02f0 */ +__u64 steal_timer;/* 0x02f8 */ +__u64 last_update_timer;/* 0x0300 */ +__u64 last_update_clock;/* 0x0308 */ +__u64 int_clock;/* 0x0310 */ +__u64 mcck_clock;/* 0x0318 */ +__u64 clock_comparator;/* 0x0320 */ /* Current process. */ -__u64 current_task;/* 0x0310 */ -__u8 pad_0x318[0x320 -0x318 ];/* 0x0318 */ -__u64 kernel_stack;/* 0x0320 */ +__u64 current_task;/* 0x0328 */ +__u8 pad_0x318[0x320 -0x318 ];/* 0x0330 */ +__u64 kernel_stack;/* 0x0338 */ /* Interrupt, panic and restart stack. */ -__u64 async_stack;/* 0x0328 */ -__u64 panic_stack;/* 0x0330 */ -__u64 restart_stack;/* 0x0338 */ +__u64 async_stack;/* 0x0340 */ +__u64 panic_stack;/* 0x0348 */ +__u64 restart_stack;/* 0x0350 */ /* Restart function and parameter. */ -__u64 restart_fn;/* 0x0340 */ -__u64 restart_data;/* 0x0348 */ -__u64 restart_source;/* 0x0350 */ +__u64 restart_fn;/* 0x0358 */ +__u64 restart_data;/* 0x0360 */ +__u64 restart_source;/* 0x0368 */ /* Address space pointer. */ -__u64 kernel_asce;/* 0x0358 */ -__u64 user_asce;/* 0x0360 */ +__u64 kernel_asce;/* 0x0370 */ +__u64 user_asce;/* 0x0378 */ /* * The lpp and current_pid fields form a * 64-bit value that is set as program * parameter with the LPP instruction. */ -__u32 lpp;/* 0x0368 */ -__u32 current_pid;/* 0x036c */ +__u32 lpp;/* 0x0380 */ +__u32 current_pid;/* 0x0384 */ /* SMP info area */ -__u32 cpu_nr;/* 0x0370 */ -__u32 softirq_pending;/* 0x0374 */ -__u64 percpu_offset;/* 0x0378 */ -__u64 vdso_per_cpu_data;/* 0x0380 */ -__u64 machine_flags;/* 0x0388 */ -__u32 preempt_count;/* 0x0390 */ -__u8 pad_0x0394[0x0398 -0x0394 ];/* 0x0394 */ -__u64 gmap;/* 0x0398 */ -__u32 spinlock_lockval;/* 0x03a0 */ -__u32 fpu_flags;/* 0x03a4 */ -__u8 pad_0x03a8[0x0400 -0x03a8 ];/* 0x03a8 */ +__u32 cpu_nr;/* 0x0388 */ +__u32 softirq_pending;/* 0x038c */ +__u64 percpu_offset;/* 0x0390 */ +__u64 vdso_per_cpu_data;/* 0x0398 */ +__u64 machine_flags;/* 0x03a0 */ +__u32 preempt_count;/* 0x03a8 */ +__u8 pad_0x03ac[0x03b0 -0x03ac ];/* 0x03ac */ +__u64 gmap;/* 0x03b0 */ +__u32 spinlock_lockval;/* 0x03b8 */ +__u32 fpu_flags;/* 0x03bc */ +__u8 pad_0x03c0[0x0400 -0x03c0 ];/* 0x03c0 */ /* Per cpu primary space access list */ __u32 paste[16 ];/* 0x0400 */
arch/s390/include/asm/processor.h +3 -0
@@ -111,7 +111,10 @@ struct thread_struct {unsigned int acrs[NUM_ACRS ];unsigned long ksp;/* kernel stack pointer */ unsigned long user_timer;/* task cputime in user space */ +unsigned long guest_timer;/* task cputime in kvm guest */ unsigned long system_timer;/* task cputime in kernel space */ +unsigned long hardirq_timer;/* task cputime in hardirq context */ +unsigned long softirq_timer;/* task cputime in softirq context */ unsigned long sys_call_table;/* system call table address */ mm_segment_t mm_segment;unsigned long gmap_addr;/* address of last gmap fault. */
arch/s390/kernel/vtime.c +88 -48
186 lines not on this page · raw message
PATCH 10/10 vtime: Rename vtime_account_user() to vtime_flush()
In reply to Frederic WeisbeckerCONFIG_VIRT_CPU_ACCOUNTING_NATIVE used to accumulate user time and account it on ticks and context switches only through the vtime_account_user() function.
Now this model has been generalized on the 3 archs for all kind of cputime (system, irq, ...) and all the cputime flushing happens under vtime_account_user().
So let's rename this function to better reflect its new role.
--- arch/ia64/kernel/time.c | 2 +- arch/powerpc/kernel/time.c | 6 ++---- arch/s390/kernel/vtime.c | 2 +- include/linux/kernel_stat.h | 2 +- include/linux/vtime.h | 7 +++++-- kernel/sched/cputime.c | 4 +--- 6 files changed, 11 insertions(+), 12 deletions(-)
arch/ia64/kernel/time.c +1 -1
@@ -61,7 +61,7 @@ static struct clocksource *itc_clocksource;extern cputime_t cycle_to_cputime (u64 cyc); -void vtime_account_user (struct task_struct *tsk) +void vtime_flush (struct task_struct *tsk) {struct thread_info *ti =task_thread_info (tsk);cputime_t delta;
arch/powerpc/kernel/time.c +2 -4
@@ -382,15 +382,13 @@ void vtime_account_idle(struct task_struct *tsk) }/* -* Transfer the user time accumulated in the paca -* by the exception entry and exit code to the generic -* process user time records. +* Account the whole cputime accumulated in the paca * Must be called with interrupts disabled. * Assumes that vtime_account_system/idle() has been called * recently (i.e. since the last entry from usermode) so that * get_paca()->user_time_scaled is up to date. */ -void vtime_account_user (struct task_struct *tsk) +void vtime_flush (struct task_struct *tsk) {struct cpu_accounting_data *acct =get_accounting (tsk);
arch/s390/kernel/vtime.c +1 -1
@@ -214,7 +214,7 @@ void vtime_task_switch(struct task_struct *prev)* accounting system time in order to correctly compute * the stolen time accounting. */ -void vtime_account_user (struct task_struct *tsk) +void vtime_flush (struct task_struct *tsk) {if (do_account_vtime (tsk))virt_timer_expire ();
include/linux/kernel_stat.h +1 -1
@@ -89,7 +89,7 @@ extern void account_idle_time(cputime_t);#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE static inline void account_process_tick (struct task_struct *tsk,int user) { -vtime_account_user (tsk); +vtime_flush (tsk); }#else extern void account_process_tick (struct task_struct *,int user);
include/linux/vtime.h +5 -2
@@ -58,27 +58,28 @@ static inline void vtime_task_switch(struct task_struct *prev)extern void vtime_account_system (struct task_struct *tsk);extern void vtime_account_idle (struct task_struct *tsk); -extern void vtime_account_user (struct task_struct *tsk);#else /* !CONFIG_VIRT_CPU_ACCOUNTING */ static inline void vtime_task_switch (struct task_struct *prev) { }static inline void vtime_account_system (struct task_struct *tsk) { } -static inline void vtime_account_user (struct task_struct *tsk) { }#endif /* !CONFIG_VIRT_CPU_ACCOUNTING */ #ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN extern void arch_vtime_task_switch (struct task_struct *tsk); +extern void vtime_account_user (struct task_struct *tsk);extern void vtime_user_enter (struct task_struct *tsk);static inline void vtime_user_exit (struct task_struct *tsk) {vtime_account_user (tsk); } +extern void vtime_guest_enter (struct task_struct *tsk);extern void vtime_guest_exit (struct task_struct *tsk);extern void vtime_init_idle (struct task_struct *tsk,int cpu);#else /* !CONFIG_VIRT_CPU_ACCOUNTING_GEN */ +static inline void vtime_account_user (struct task_struct *tsk) { }static inline void vtime_user_enter (struct task_struct *tsk) { }static inline void vtime_user_exit (struct task_struct *tsk) { }static inline void vtime_guest_enter (struct task_struct *tsk) { }
@@ -93,9 +94,11 @@ static inline void vtime_account_irq_exit(struct task_struct *tsk)/* On hard|softirq exit we always account to hard|softirq cputime */ vtime_account_system(tsk); } +extern void vtime_flush (struct task_struct *tsk);#else /* !CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */ static inline void vtime_account_irq_enter (struct task_struct *tsk) { }static inline void vtime_account_irq_exit (struct task_struct *tsk) { } +static inline void vtime_flush (struct task_struct *tsk) { }#endif
kernel/sched/cputime.c +1 -3
@@ -437,9 +437,7 @@ void vtime_common_task_switch(struct task_struct *prev) elsevtime_account_system (prev ); -#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE -vtime_account_user (prev); -#endif +vtime_flush (prev); arch_vtime_task_switch(prev); }#endif
Signature · 1 line
2.7.4
tip-bot for Frederic Weisbecker
merge bot[tip:sched/core] sched/cputime: Rename vtime_account_user() to vtime_flush()
sched/cputime: Rename vtime_account_user() to vtime_flush()
Commit-ID: c8d7dabf8f91fadd265e6eb87afb201d14ea299b Gitweb: http://git.kernel.org/tip/c8d7dabf8f91fadd265e6eb87afb201d14ea299b Author: Frederic Weisbecker <[email protected]> AuthorDate: Thu, 5 Jan 2017 18:11:50 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Sat, 14 Jan 2017 09:54:13 +0100
sched/cputime: Rename vtime_account_user() to vtime_flush()
CONFIG_VIRT_CPU_ACCOUNTING_NATIVE=y used to accumulate user time and account it on ticks and context switches only through the vtime_account_user() function.
Now this model has been generalized on the 3 archs for all kind of cputime (system, irq, ...) and all the cputime flushing happens under vtime_account_user().
So let's rename this function to better reflect its new role.
--- arch/ia64/kernel/time.c | 2 +- arch/powerpc/kernel/time.c | 6 ++---- arch/s390/kernel/vtime.c | 2 +- include/linux/kernel_stat.h | 2 +- include/linux/vtime.h | 7 +++++-- kernel/sched/cputime.c | 4 +--- 6 files changed, 11 insertions(+), 12 deletions(-)
arch/ia64/kernel/time.c +1 -1
@@ -61,7 +61,7 @@ static struct clocksource *itc_clocksource;extern cputime_t cycle_to_cputime (u64 cyc); -void vtime_account_user (struct task_struct *tsk) +void vtime_flush (struct task_struct *tsk) {struct thread_info *ti =task_thread_info (tsk);cputime_t delta;
arch/powerpc/kernel/time.c +2 -4
@@ -382,15 +382,13 @@ void vtime_account_idle(struct task_struct *tsk) }/* -* Transfer the user time accumulated in the paca -* by the exception entry and exit code to the generic -* process user time records. +* Account the whole cputime accumulated in the paca * Must be called with interrupts disabled. * Assumes that vtime_account_system/idle() has been called * recently (i.e. since the last entry from usermode) so that * get_paca()->user_time_scaled is up to date. */ -void vtime_account_user (struct task_struct *tsk) +void vtime_flush (struct task_struct *tsk) {struct cpu_accounting_data *acct =get_accounting (tsk);
arch/s390/kernel/vtime.c +1 -1
@@ -214,7 +214,7 @@ void vtime_task_switch(struct task_struct *prev)* accounting system time in order to correctly compute * the stolen time accounting. */ -void vtime_account_user (struct task_struct *tsk) +void vtime_flush (struct task_struct *tsk) {if (do_account_vtime (tsk))virt_timer_expire ();
include/linux/kernel_stat.h +1 -1
@@ -89,7 +89,7 @@ extern void account_idle_time(cputime_t);#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE static inline void account_process_tick (struct task_struct *tsk,int user) { -vtime_account_user (tsk); +vtime_flush (tsk); }#else extern void account_process_tick (struct task_struct *,int user);
include/linux/vtime.h +5 -2
@@ -58,27 +58,28 @@ static inline void vtime_task_switch(struct task_struct *prev)extern void vtime_account_system (struct task_struct *tsk);extern void vtime_account_idle (struct task_struct *tsk); -extern void vtime_account_user (struct task_struct *tsk);#else /* !CONFIG_VIRT_CPU_ACCOUNTING */ static inline void vtime_task_switch (struct task_struct *prev) { }static inline void vtime_account_system (struct task_struct *tsk) { } -static inline void vtime_account_user (struct task_struct *tsk) { }#endif /* !CONFIG_VIRT_CPU_ACCOUNTING */ #ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN extern void arch_vtime_task_switch (struct task_struct *tsk); +extern void vtime_account_user (struct task_struct *tsk);extern void vtime_user_enter (struct task_struct *tsk);static inline void vtime_user_exit (struct task_struct *tsk) {vtime_account_user (tsk); } +extern void vtime_guest_enter (struct task_struct *tsk);extern void vtime_guest_exit (struct task_struct *tsk);extern void vtime_init_idle (struct task_struct *tsk,int cpu);#else /* !CONFIG_VIRT_CPU_ACCOUNTING_GEN */ +static inline void vtime_account_user (struct task_struct *tsk) { }static inline void vtime_user_enter (struct task_struct *tsk) { }static inline void vtime_user_exit (struct task_struct *tsk) { }static inline void vtime_guest_enter (struct task_struct *tsk) { }
@@ -93,9 +94,11 @@ static inline void vtime_account_irq_exit(struct task_struct *tsk)/* On hard|softirq exit we always account to hard|softirq cputime */ vtime_account_system(tsk); } +extern void vtime_flush (struct task_struct *tsk);#else /* !CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */ static inline void vtime_account_irq_enter (struct task_struct *tsk) { }static inline void vtime_account_irq_exit (struct task_struct *tsk) { } +static inline void vtime_flush (struct task_struct *tsk) { }#endif
kernel/sched/cputime.c +1 -3
@@ -437,9 +437,7 @@ void vtime_common_task_switch(struct task_struct *prev) elsevtime_account_system (prev ); -#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE -vtime_account_user (prev); -#endif +vtime_flush (prev); arch_vtime_task_switch(prev); }#endif
Quoted 9 lines · On Thu, 5 Jan 2017 18:11:40 +0100 Frederic Weisbecker <[email protected]>…
This version is a rebase on top of latest Linus tree which includes the fix
8f2b468aadc("s390/vtime: correct system time accounting").Also a small change: I have moved
account_system_index_scaled()to s390 in patch "s390/cputime: delayed accounting of system time" because it is the only user of the function.
git://git.kernel.org/pub/scm/linux/kernel/git/frederic/linux-dynticks.git
vtime/acc-v2
That looks good, I get sensible numbers for s390. Thanks for doing this!
For the s390 parts:
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
Quoted 9 lines · Frederic Weisbecker
This version is a rebase on top of latest Linus tree which includes the fix
8f2b468aadc("s390/vtime: correct system time accounting").Also a small change: I have moved
account_system_index_scaled()to s390 in patch "s390/cputime: delayed accounting of system time" because it is the only user of the function.
git://git.kernel.org/pub/scm/linux/kernel/git/frederic/linux-dynticks.git
vtime/acc-v2
Quoted 5 lines · Thomas Gleixner
Quoted 3 lines · Frederic Weisbecker
This version is a rebase on top of latest Linus tree which includes the fix
8f2b468aadc("s390/vtime: correct system time accounting").
Quoted 8 lines
Quoted 6 lines
Also a small change: I have moved
account_system_index_scaled()to s390 in patch "s390/cputime: delayed accounting of system time" because it is the only user of the function.
git://git.kernel.org/pub/scm/linux/kernel/git/frederic/linux-dynticks.git
vtime/acc-v2Acked-by Thomas Gleixner <[email protected]>
Thanks for your reviews! I added the acks on the series.