* [GIT PULL] cputime: Scaled cputime optimizations and cleanups
@ 2016-11-15 2:06 Frederic Weisbecker
2016-11-15 2:06 ` [PATCH 1/4] cputime/powerpc: Remove cputime_last_delta global variable Frederic Weisbecker
` (3 more replies)
0 siblings, 4 replies; 9+ messages in thread
From: Frederic Weisbecker @ 2016-11-15 2:06 UTC (permalink / raw)
To: Ingo Molnar
Cc: LKML, Frederic Weisbecker, Paul Mackerras, Peter Zijlstra,
Heiko Carstens, Benjamin Herrenschmidt, Michael Neuling,
Paul Mackerras, Ingo Molnar, Martin Schwidefsky,
Stanislaw Gruszka
Ingo,
Please pull the sched/cputime branch that can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/frederic/linux-dynticks.git
sched/cputime
HEAD: bb953cdfa26c25e42beb748e7be71ea3d4927186
This set removes the dead arch and core code handling scaled cputime and
optimize the most common case where archs don't support scaled frequency
accounting.
Thanks,
Frederic
---
Stanislaw Gruszka (4):
cputime/powerpc: Remove cputime_last_delta global variable
cputime/powerpc: Remove cputime_to_scaled()
cputime/powerpc/s390: Make scaled cputime arch specific
cputime: Simplify task_cputime()
arch/Kconfig | 3 +
arch/ia64/kernel/time.c | 4 +-
arch/powerpc/Kconfig | 1 +
arch/powerpc/include/asm/cputime.h | 14 ----
arch/powerpc/kernel/time.c | 8 +--
arch/s390/Kconfig | 1 +
arch/s390/kernel/vtime.c | 9 ++-
arch/x86/kernel/apm_32.c | 4 +-
include/asm-generic/cputime_jiffies.h | 1 -
include/asm-generic/cputime_nsecs.h | 1 -
include/linux/kernel_stat.h | 4 +-
include/linux/sched.h | 35 ++++++----
kernel/fork.c | 2 +
kernel/sched/cputime.c | 124 +++++++++-------------------------
kernel/time/posix-cpu-timers.c | 4 +-
15 files changed, 78 insertions(+), 137 deletions(-)
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH 1/4] cputime/powerpc: Remove cputime_last_delta global variable 2016-11-15 2:06 [GIT PULL] cputime: Scaled cputime optimizations and cleanups Frederic Weisbecker @ 2016-11-15 2:06 ` Frederic Weisbecker 2016-11-15 10:50 ` [tip:sched/core] sched/cputime, powerpc: " tip-bot for Stanislaw Gruszka 2016-11-15 2:06 ` [PATCH 2/4] cputime/powerpc: Remove cputime_to_scaled() Frederic Weisbecker ` (2 subsequent siblings) 3 siblings, 1 reply; 9+ messages in thread From: Frederic Weisbecker @ 2016-11-15 2:06 UTC (permalink / raw) To: Ingo Molnar Cc: LKML, Stanislaw Gruszka, Paul Mackerras, Peter Zijlstra, Heiko Carstens, Benjamin Herrenschmidt, Michael Neuling, Paul Mackerras, Ingo Molnar, Frederic Weisbecker, Martin Schwidefsky From: Stanislaw Gruszka <sgruszka@redhat.com> Since commit: cf9efce0ce313 ("powerpc: Account time using timebase rather than PURR") cputime_last_delta is not initialized to other value than 0, hence it's not used except zero check and cputime_to_scaled() just returns the argument. Acked-by: Paul Mackerras <paulus@ozlabs.org> Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Michael Neuling <mikey@neuling.org> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> Cc: Heiko Carstens <heiko.carstens@de.ibm.com> Link: http://lkml.kernel.org/r/1477917389-11341-2-git-send-email-sgruszka@redhat.com Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> --- arch/powerpc/include/asm/cputime.h | 7 ------- arch/powerpc/kernel/time.c | 2 -- 2 files changed, 9 deletions(-) diff --git a/arch/powerpc/include/asm/cputime.h b/arch/powerpc/include/asm/cputime.h index 4f60db0..9f5dcf7 100644 --- a/arch/powerpc/include/asm/cputime.h +++ b/arch/powerpc/include/asm/cputime.h @@ -46,8 +46,6 @@ extern cputime_t cputime_one_jiffy; * Convert cputime <-> jiffies */ extern u64 __cputime_jiffies_factor; -DECLARE_PER_CPU(unsigned long, cputime_last_delta); -DECLARE_PER_CPU(unsigned long, cputime_scaled_last_delta); static inline unsigned long cputime_to_jiffies(const cputime_t ct) { @@ -58,11 +56,6 @@ static inline unsigned long cputime_to_jiffies(const cputime_t ct) * the last scaled to real ratio */ static inline cputime_t cputime_to_scaled(const cputime_t ct) { - if (cpu_has_feature(CPU_FTR_SPURR) && - __this_cpu_read(cputime_last_delta)) - return (__force u64) ct * - __this_cpu_read(cputime_scaled_last_delta) / - __this_cpu_read(cputime_last_delta); return ct; } diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index bc3f7d0..8105198 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c @@ -164,8 +164,6 @@ u64 __cputime_sec_factor; EXPORT_SYMBOL(__cputime_sec_factor); u64 __cputime_clockt_factor; EXPORT_SYMBOL(__cputime_clockt_factor); -DEFINE_PER_CPU(unsigned long, cputime_last_delta); -DEFINE_PER_CPU(unsigned long, cputime_scaled_last_delta); cputime_t cputime_one_jiffy; -- 2.7.4 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [tip:sched/core] sched/cputime, powerpc: Remove cputime_last_delta global variable 2016-11-15 2:06 ` [PATCH 1/4] cputime/powerpc: Remove cputime_last_delta global variable Frederic Weisbecker @ 2016-11-15 10:50 ` tip-bot for Stanislaw Gruszka 0 siblings, 0 replies; 9+ messages in thread From: tip-bot for Stanislaw Gruszka @ 2016-11-15 10:50 UTC (permalink / raw) To: linux-tip-commits Cc: linux-kernel, paulus, tglx, mingo, fweisbec, torvalds, mikey, heiko.carstens, peterz, schwidefsky, sgruszka, paulus, hpa, benh Commit-ID: 7008eb997bcfdd8c5274bb6672aa5d4e77994309 Gitweb: http://git.kernel.org/tip/7008eb997bcfdd8c5274bb6672aa5d4e77994309 Author: Stanislaw Gruszka <sgruszka@redhat.com> AuthorDate: Tue, 15 Nov 2016 03:06:49 +0100 Committer: Ingo Molnar <mingo@kernel.org> CommitDate: Tue, 15 Nov 2016 09:51:04 +0100 sched/cputime, powerpc: Remove cputime_last_delta global variable Since commit: cf9efce0ce313 ("powerpc: Account time using timebase rather than PURR") cputime_last_delta is not initialized to other value than 0, hence it's not used except zero check and cputime_to_scaled() just returns the argument. Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Acked-by: Paul Mackerras <paulus@ozlabs.org> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Heiko Carstens <heiko.carstens@de.ibm.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> Cc: Michael Neuling <mikey@neuling.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/1479175612-14718-2-git-send-email-fweisbec@gmail.com Signed-off-by: Ingo Molnar <mingo@kernel.org> --- arch/powerpc/include/asm/cputime.h | 7 ------- arch/powerpc/kernel/time.c | 2 -- 2 files changed, 9 deletions(-) diff --git a/arch/powerpc/include/asm/cputime.h b/arch/powerpc/include/asm/cputime.h index 4f60db0..9f5dcf7 100644 --- a/arch/powerpc/include/asm/cputime.h +++ b/arch/powerpc/include/asm/cputime.h @@ -46,8 +46,6 @@ extern cputime_t cputime_one_jiffy; * Convert cputime <-> jiffies */ extern u64 __cputime_jiffies_factor; -DECLARE_PER_CPU(unsigned long, cputime_last_delta); -DECLARE_PER_CPU(unsigned long, cputime_scaled_last_delta); static inline unsigned long cputime_to_jiffies(const cputime_t ct) { @@ -58,11 +56,6 @@ static inline unsigned long cputime_to_jiffies(const cputime_t ct) * the last scaled to real ratio */ static inline cputime_t cputime_to_scaled(const cputime_t ct) { - if (cpu_has_feature(CPU_FTR_SPURR) && - __this_cpu_read(cputime_last_delta)) - return (__force u64) ct * - __this_cpu_read(cputime_scaled_last_delta) / - __this_cpu_read(cputime_last_delta); return ct; } diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index bc3f7d0..8105198 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c @@ -164,8 +164,6 @@ u64 __cputime_sec_factor; EXPORT_SYMBOL(__cputime_sec_factor); u64 __cputime_clockt_factor; EXPORT_SYMBOL(__cputime_clockt_factor); -DEFINE_PER_CPU(unsigned long, cputime_last_delta); -DEFINE_PER_CPU(unsigned long, cputime_scaled_last_delta); cputime_t cputime_one_jiffy; ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/4] cputime/powerpc: Remove cputime_to_scaled() 2016-11-15 2:06 [GIT PULL] cputime: Scaled cputime optimizations and cleanups Frederic Weisbecker 2016-11-15 2:06 ` [PATCH 1/4] cputime/powerpc: Remove cputime_last_delta global variable Frederic Weisbecker @ 2016-11-15 2:06 ` Frederic Weisbecker 2016-11-15 10:51 ` [tip:sched/core] sched/cputime, powerpc: " tip-bot for Stanislaw Gruszka 2016-11-15 2:06 ` [PATCH 3/4] cputime/powerpc/s390: Make scaled cputime arch specific Frederic Weisbecker 2016-11-15 2:06 ` [PATCH 4/4] cputime: Simplify task_cputime() Frederic Weisbecker 3 siblings, 1 reply; 9+ messages in thread From: Frederic Weisbecker @ 2016-11-15 2:06 UTC (permalink / raw) To: Ingo Molnar Cc: LKML, Stanislaw Gruszka, Paul Mackerras, Peter Zijlstra, Heiko Carstens, Benjamin Herrenschmidt, Michael Neuling, Paul Mackerras, Ingo Molnar, Frederic Weisbecker, Martin Schwidefsky From: Stanislaw Gruszka <sgruszka@redhat.com> Currently cputime_to_scaled() just return it's argument on all implementations, we don't need to call this function. Reviewed-by: Paul Mackerras <paulus@ozlabs.org> Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Michael Neuling <mikey@neuling.org> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> Cc: Heiko Carstens <heiko.carstens@de.ibm.com> Link: http://lkml.kernel.org/r/1477917389-11341-3-git-send-email-sgruszka@redhat.com Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> --- arch/powerpc/include/asm/cputime.h | 7 ------- include/asm-generic/cputime_jiffies.h | 1 - include/asm-generic/cputime_nsecs.h | 1 - kernel/sched/cputime.c | 26 ++++++++++++-------------- 4 files changed, 12 insertions(+), 23 deletions(-) diff --git a/arch/powerpc/include/asm/cputime.h b/arch/powerpc/include/asm/cputime.h index 9f5dcf7..aa2e6a3 100644 --- a/arch/powerpc/include/asm/cputime.h +++ b/arch/powerpc/include/asm/cputime.h @@ -52,13 +52,6 @@ static inline unsigned long cputime_to_jiffies(const cputime_t ct) return mulhdu((__force u64) ct, __cputime_jiffies_factor); } -/* Estimate the scaled cputime by scaling the real cputime based on - * the last scaled to real ratio */ -static inline cputime_t cputime_to_scaled(const cputime_t ct) -{ - return ct; -} - static inline cputime_t jiffies_to_cputime(const unsigned long jif) { u64 ct; diff --git a/include/asm-generic/cputime_jiffies.h b/include/asm-generic/cputime_jiffies.h index fe386fc..6bb8cd4 100644 --- a/include/asm-generic/cputime_jiffies.h +++ b/include/asm-generic/cputime_jiffies.h @@ -7,7 +7,6 @@ typedef unsigned long __nocast cputime_t; #define cputime_one_jiffy jiffies_to_cputime(1) #define cputime_to_jiffies(__ct) (__force unsigned long)(__ct) -#define cputime_to_scaled(__ct) (__ct) #define jiffies_to_cputime(__hz) (__force cputime_t)(__hz) typedef u64 __nocast cputime64_t; diff --git a/include/asm-generic/cputime_nsecs.h b/include/asm-generic/cputime_nsecs.h index a84e28e..4e3b18e 100644 --- a/include/asm-generic/cputime_nsecs.h +++ b/include/asm-generic/cputime_nsecs.h @@ -34,7 +34,6 @@ typedef u64 __nocast cputime64_t; */ #define cputime_to_jiffies(__ct) \ cputime_div(__ct, NSEC_PER_SEC / HZ) -#define cputime_to_scaled(__ct) (__ct) #define jiffies_to_cputime(__jif) \ (__force cputime_t)((__jif) * (NSEC_PER_SEC / HZ)) #define cputime64_to_jiffies64(__ct) \ diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c index 5ebee31..3229c72 100644 --- a/kernel/sched/cputime.c +++ b/kernel/sched/cputime.c @@ -390,7 +390,7 @@ static void irqtime_account_process_tick(struct task_struct *p, int user_tick, struct rq *rq, int ticks) { u64 cputime = (__force u64) cputime_one_jiffy * ticks; - cputime_t scaled, other; + cputime_t other; /* * When returning from idle, many ticks can get accounted at @@ -403,7 +403,6 @@ static void irqtime_account_process_tick(struct task_struct *p, int user_tick, if (other >= cputime) return; cputime -= other; - scaled = cputime_to_scaled(cputime); if (this_cpu_ksoftirqd() == p) { /* @@ -411,15 +410,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_time(p, cputime, scaled, CPUTIME_SOFTIRQ); + __account_system_time(p, cputime, cputime, CPUTIME_SOFTIRQ); } else if (user_tick) { - account_user_time(p, cputime, scaled); + account_user_time(p, cputime, 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, cputime, scaled); + account_guest_time(p, cputime, cputime); } else { - __account_system_time(p, cputime, scaled, CPUTIME_SYSTEM); + __account_system_time(p, cputime, cputime, CPUTIME_SYSTEM); } } @@ -502,7 +501,7 @@ void thread_group_cputime_adjusted(struct task_struct *p, cputime_t *ut, cputime */ void account_process_tick(struct task_struct *p, int user_tick) { - cputime_t cputime, scaled, steal; + cputime_t cputime, steal; struct rq *rq = this_rq(); if (vtime_accounting_cpu_enabled()) @@ -520,12 +519,11 @@ void account_process_tick(struct task_struct *p, int user_tick) return; cputime -= steal; - scaled = cputime_to_scaled(cputime); if (user_tick) - account_user_time(p, cputime, scaled); + account_user_time(p, cputime, cputime); else if ((p != rq->idle) || (irq_count() != HARDIRQ_OFFSET)) - account_system_time(p, HARDIRQ_OFFSET, cputime, scaled); + account_system_time(p, HARDIRQ_OFFSET, cputime, cputime); else account_idle_time(cputime); } @@ -746,7 +744,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, cputime_to_scaled(delta_cpu)); + account_system_time(tsk, irq_count(), delta_cpu, delta_cpu); } void vtime_account_system(struct task_struct *tsk) @@ -767,7 +765,7 @@ void vtime_account_user(struct task_struct *tsk) tsk->vtime_snap_whence = VTIME_SYS; if (vtime_delta(tsk)) { delta_cpu = get_vtime_delta(tsk); - account_user_time(tsk, delta_cpu, cputime_to_scaled(delta_cpu)); + account_user_time(tsk, delta_cpu, delta_cpu); } write_seqcount_end(&tsk->vtime_seqcount); } @@ -940,8 +938,8 @@ void task_cputime_scaled(struct task_struct *t, fetch_task_cputime(t, utimescaled, stimescaled, &t->utimescaled, &t->stimescaled, &udelta, &sdelta); if (utimescaled) - *utimescaled += cputime_to_scaled(udelta); + *utimescaled += udelta; if (stimescaled) - *stimescaled += cputime_to_scaled(sdelta); + *stimescaled += sdelta; } #endif /* CONFIG_VIRT_CPU_ACCOUNTING_GEN */ -- 2.7.4 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [tip:sched/core] sched/cputime, powerpc: Remove cputime_to_scaled() 2016-11-15 2:06 ` [PATCH 2/4] cputime/powerpc: Remove cputime_to_scaled() Frederic Weisbecker @ 2016-11-15 10:51 ` tip-bot for Stanislaw Gruszka 0 siblings, 0 replies; 9+ messages in thread From: tip-bot for Stanislaw Gruszka @ 2016-11-15 10:51 UTC (permalink / raw) To: linux-tip-commits Cc: benh, hpa, paulus, torvalds, heiko.carstens, mingo, fweisbec, sgruszka, linux-kernel, schwidefsky, paulus, tglx, peterz, mikey Commit-ID: 981ee2d444408fc55b9390d6a4a54a6697513611 Gitweb: http://git.kernel.org/tip/981ee2d444408fc55b9390d6a4a54a6697513611 Author: Stanislaw Gruszka <sgruszka@redhat.com> AuthorDate: Tue, 15 Nov 2016 03:06:50 +0100 Committer: Ingo Molnar <mingo@kernel.org> CommitDate: Tue, 15 Nov 2016 09:51:04 +0100 sched/cputime, powerpc: Remove cputime_to_scaled() Currently cputime_to_scaled() just return it's argument on all implementations, we don't need to call this function. Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Reviewed-by: Paul Mackerras <paulus@ozlabs.org> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Heiko Carstens <heiko.carstens@de.ibm.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> Cc: Michael Neuling <mikey@neuling.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/1479175612-14718-3-git-send-email-fweisbec@gmail.com Signed-off-by: Ingo Molnar <mingo@kernel.org> --- arch/powerpc/include/asm/cputime.h | 7 ------- include/asm-generic/cputime_jiffies.h | 1 - include/asm-generic/cputime_nsecs.h | 1 - kernel/sched/cputime.c | 26 ++++++++++++-------------- 4 files changed, 12 insertions(+), 23 deletions(-) diff --git a/arch/powerpc/include/asm/cputime.h b/arch/powerpc/include/asm/cputime.h index 9f5dcf7..aa2e6a3 100644 --- a/arch/powerpc/include/asm/cputime.h +++ b/arch/powerpc/include/asm/cputime.h @@ -52,13 +52,6 @@ static inline unsigned long cputime_to_jiffies(const cputime_t ct) return mulhdu((__force u64) ct, __cputime_jiffies_factor); } -/* Estimate the scaled cputime by scaling the real cputime based on - * the last scaled to real ratio */ -static inline cputime_t cputime_to_scaled(const cputime_t ct) -{ - return ct; -} - static inline cputime_t jiffies_to_cputime(const unsigned long jif) { u64 ct; diff --git a/include/asm-generic/cputime_jiffies.h b/include/asm-generic/cputime_jiffies.h index fe386fc..6bb8cd4 100644 --- a/include/asm-generic/cputime_jiffies.h +++ b/include/asm-generic/cputime_jiffies.h @@ -7,7 +7,6 @@ typedef unsigned long __nocast cputime_t; #define cputime_one_jiffy jiffies_to_cputime(1) #define cputime_to_jiffies(__ct) (__force unsigned long)(__ct) -#define cputime_to_scaled(__ct) (__ct) #define jiffies_to_cputime(__hz) (__force cputime_t)(__hz) typedef u64 __nocast cputime64_t; diff --git a/include/asm-generic/cputime_nsecs.h b/include/asm-generic/cputime_nsecs.h index a84e28e..4e3b18e 100644 --- a/include/asm-generic/cputime_nsecs.h +++ b/include/asm-generic/cputime_nsecs.h @@ -34,7 +34,6 @@ typedef u64 __nocast cputime64_t; */ #define cputime_to_jiffies(__ct) \ cputime_div(__ct, NSEC_PER_SEC / HZ) -#define cputime_to_scaled(__ct) (__ct) #define jiffies_to_cputime(__jif) \ (__force cputime_t)((__jif) * (NSEC_PER_SEC / HZ)) #define cputime64_to_jiffies64(__ct) \ diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c index 5ebee31..3229c72 100644 --- a/kernel/sched/cputime.c +++ b/kernel/sched/cputime.c @@ -390,7 +390,7 @@ static void irqtime_account_process_tick(struct task_struct *p, int user_tick, struct rq *rq, int ticks) { u64 cputime = (__force u64) cputime_one_jiffy * ticks; - cputime_t scaled, other; + cputime_t other; /* * When returning from idle, many ticks can get accounted at @@ -403,7 +403,6 @@ static void irqtime_account_process_tick(struct task_struct *p, int user_tick, if (other >= cputime) return; cputime -= other; - scaled = cputime_to_scaled(cputime); if (this_cpu_ksoftirqd() == p) { /* @@ -411,15 +410,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_time(p, cputime, scaled, CPUTIME_SOFTIRQ); + __account_system_time(p, cputime, cputime, CPUTIME_SOFTIRQ); } else if (user_tick) { - account_user_time(p, cputime, scaled); + account_user_time(p, cputime, 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, cputime, scaled); + account_guest_time(p, cputime, cputime); } else { - __account_system_time(p, cputime, scaled, CPUTIME_SYSTEM); + __account_system_time(p, cputime, cputime, CPUTIME_SYSTEM); } } @@ -502,7 +501,7 @@ void thread_group_cputime_adjusted(struct task_struct *p, cputime_t *ut, cputime */ void account_process_tick(struct task_struct *p, int user_tick) { - cputime_t cputime, scaled, steal; + cputime_t cputime, steal; struct rq *rq = this_rq(); if (vtime_accounting_cpu_enabled()) @@ -520,12 +519,11 @@ void account_process_tick(struct task_struct *p, int user_tick) return; cputime -= steal; - scaled = cputime_to_scaled(cputime); if (user_tick) - account_user_time(p, cputime, scaled); + account_user_time(p, cputime, cputime); else if ((p != rq->idle) || (irq_count() != HARDIRQ_OFFSET)) - account_system_time(p, HARDIRQ_OFFSET, cputime, scaled); + account_system_time(p, HARDIRQ_OFFSET, cputime, cputime); else account_idle_time(cputime); } @@ -746,7 +744,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, cputime_to_scaled(delta_cpu)); + account_system_time(tsk, irq_count(), delta_cpu, delta_cpu); } void vtime_account_system(struct task_struct *tsk) @@ -767,7 +765,7 @@ void vtime_account_user(struct task_struct *tsk) tsk->vtime_snap_whence = VTIME_SYS; if (vtime_delta(tsk)) { delta_cpu = get_vtime_delta(tsk); - account_user_time(tsk, delta_cpu, cputime_to_scaled(delta_cpu)); + account_user_time(tsk, delta_cpu, delta_cpu); } write_seqcount_end(&tsk->vtime_seqcount); } @@ -940,8 +938,8 @@ void task_cputime_scaled(struct task_struct *t, fetch_task_cputime(t, utimescaled, stimescaled, &t->utimescaled, &t->stimescaled, &udelta, &sdelta); if (utimescaled) - *utimescaled += cputime_to_scaled(udelta); + *utimescaled += udelta; if (stimescaled) - *stimescaled += cputime_to_scaled(sdelta); + *stimescaled += sdelta; } #endif /* CONFIG_VIRT_CPU_ACCOUNTING_GEN */ ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/4] cputime/powerpc/s390: Make scaled cputime arch specific 2016-11-15 2:06 [GIT PULL] cputime: Scaled cputime optimizations and cleanups Frederic Weisbecker 2016-11-15 2:06 ` [PATCH 1/4] cputime/powerpc: Remove cputime_last_delta global variable Frederic Weisbecker 2016-11-15 2:06 ` [PATCH 2/4] cputime/powerpc: Remove cputime_to_scaled() Frederic Weisbecker @ 2016-11-15 2:06 ` Frederic Weisbecker 2016-11-15 2:06 ` [PATCH 4/4] cputime: Simplify task_cputime() Frederic Weisbecker 3 siblings, 0 replies; 9+ messages in thread From: Frederic Weisbecker @ 2016-11-15 2:06 UTC (permalink / raw) To: Ingo Molnar Cc: LKML, Stanislaw Gruszka, Paul Mackerras, Peter Zijlstra, Heiko Carstens, Benjamin Herrenschmidt, Michael Neuling, Paul Mackerras, Ingo Molnar, Frederic Weisbecker, Martin Schwidefsky From: Stanislaw Gruszka <sgruszka@redhat.com> Only s390 and powerpc have hardware facilities allowing to measure cputimes scaled by frequency. On all other architectures utimescaled/stimescaled are equal to utime/stime (however they are accounted separately). Patch remove {u,s}timescaled accounting on all architectures except powerpc and s390, where those values are explicitly accounted on proper places. Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Michael Neuling <mikey@neuling.org> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> Cc: Heiko Carstens <heiko.carstens@de.ibm.com> Link: http://lkml.kernel.org/r/20161031162143.GB12646@redhat.com Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> --- arch/Kconfig | 3 +++ arch/ia64/kernel/time.c | 4 +-- arch/powerpc/Kconfig | 1 + arch/powerpc/kernel/time.c | 6 +++-- arch/s390/Kconfig | 1 + arch/s390/kernel/vtime.c | 9 ++++--- include/linux/kernel_stat.h | 4 +-- include/linux/sched.h | 23 ++++++++++++----- kernel/fork.c | 2 ++ kernel/sched/cputime.c | 61 +++++++++++---------------------------------- 10 files changed, 53 insertions(+), 61 deletions(-) diff --git a/arch/Kconfig b/arch/Kconfig index 659bdd0..abab659 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -512,6 +512,9 @@ config HAVE_CONTEXT_TRACKING config HAVE_VIRT_CPU_ACCOUNTING bool +config ARCH_HAS_SCALED_CPUTIME + bool + config HAVE_VIRT_CPU_ACCOUNTING_GEN bool default y if 64BIT diff --git a/arch/ia64/kernel/time.c b/arch/ia64/kernel/time.c index 6f892b9..021f44a 100644 --- a/arch/ia64/kernel/time.c +++ b/arch/ia64/kernel/time.c @@ -68,7 +68,7 @@ void vtime_account_user(struct task_struct *tsk) if (ti->ac_utime) { delta_utime = cycle_to_cputime(ti->ac_utime); - account_user_time(tsk, delta_utime, delta_utime); + account_user_time(tsk, delta_utime); ti->ac_utime = 0; } } @@ -112,7 +112,7 @@ void vtime_account_system(struct task_struct *tsk) { cputime_t delta = vtime_delta(tsk); - account_system_time(tsk, 0, delta, delta); + account_system_time(tsk, 0, delta); } EXPORT_SYMBOL_GPL(vtime_account_system); diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 65fba4c..c7f120a 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -160,6 +160,7 @@ config PPC select HAVE_LIVEPATCH if HAVE_DYNAMIC_FTRACE_WITH_REGS select GENERIC_CPU_AUTOPROBE select HAVE_VIRT_CPU_ACCOUNTING + select ARCH_HAS_SCALED_CPUTIME if VIRT_CPU_ACCOUNTING_NATIVE select HAVE_ARCH_HARDENED_USERCOPY select HAVE_KERNEL_GZIP diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index 8105198..be9751f 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c @@ -358,7 +358,8 @@ void vtime_account_system(struct task_struct *tsk) unsigned long delta, sys_scaled, stolen; delta = vtime_delta(tsk, &sys_scaled, &stolen); - account_system_time(tsk, 0, delta, sys_scaled); + account_system_time(tsk, 0, delta); + tsk->stimescaled += sys_scaled; if (stolen) account_steal_time(stolen); } @@ -391,7 +392,8 @@ void vtime_account_user(struct task_struct *tsk) acct->user_time = 0; acct->user_time_scaled = 0; acct->utime_sspurr = 0; - account_user_time(tsk, utime, utimescaled); + account_user_time(tsk, utime); + tsk->utimescaled += utimescaled; } #ifdef CONFIG_PPC32 diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index 426481d..028f97b 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig @@ -171,6 +171,7 @@ config S390 select SYSCTL_EXCEPTION_TRACE select TTY select VIRT_CPU_ACCOUNTING + select ARCH_HAS_SCALED_CPUTIME select VIRT_TO_BUS select HAVE_NMI diff --git a/arch/s390/kernel/vtime.c b/arch/s390/kernel/vtime.c index 856e30d..1bd5dde 100644 --- a/arch/s390/kernel/vtime.c +++ b/arch/s390/kernel/vtime.c @@ -137,8 +137,10 @@ static int do_account_vtime(struct task_struct *tsk, int hardirq_offset) user_scaled = (user_scaled * mult) / div; system_scaled = (system_scaled * mult) / div; } - account_user_time(tsk, user, user_scaled); - account_system_time(tsk, hardirq_offset, system, system_scaled); + account_user_time(tsk, user); + tsk->utimescaled += user_scaled; + account_system_time(tsk, hardirq_offset, system); + tsk->stimescaled += system_scaled; steal = S390_lowcore.steal_timer; if ((s64) steal > 0) { @@ -202,7 +204,8 @@ void vtime_account_irq_enter(struct task_struct *tsk) system_scaled = (system_scaled * mult) / div; } - account_system_time(tsk, 0, system, system_scaled); + account_system_time(tsk, 0, system); + tsk->stimescaled += system_scaled; virt_timer_forward(system); } diff --git a/include/linux/kernel_stat.h b/include/linux/kernel_stat.h index 44fda64..00f7768 100644 --- a/include/linux/kernel_stat.h +++ b/include/linux/kernel_stat.h @@ -78,8 +78,8 @@ static inline unsigned int kstat_cpu_irqs_sum(unsigned int cpu) return kstat_cpu(cpu).irqs_sum; } -extern void account_user_time(struct task_struct *, cputime_t, cputime_t); -extern void account_system_time(struct task_struct *, int, cputime_t, cputime_t); +extern void account_user_time(struct task_struct *, cputime_t); +extern void account_system_time(struct task_struct *, int, cputime_t); extern void account_steal_time(cputime_t); extern void account_idle_time(cputime_t); diff --git a/include/linux/sched.h b/include/linux/sched.h index 3762fe4..f72e813 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1647,7 +1647,10 @@ struct task_struct { int __user *set_child_tid; /* CLONE_CHILD_SETTID */ int __user *clear_child_tid; /* CLONE_CHILD_CLEARTID */ - cputime_t utime, stime, utimescaled, stimescaled; + cputime_t utime, stime; +#ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME + cputime_t utimescaled, stimescaled; +#endif cputime_t gtime; struct prev_cputime prev_cputime; #ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN @@ -2240,8 +2243,6 @@ struct task_struct *try_get_task_struct(struct task_struct **ptask); #ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN extern void task_cputime(struct task_struct *t, cputime_t *utime, cputime_t *stime); -extern void task_cputime_scaled(struct task_struct *t, - cputime_t *utimescaled, cputime_t *stimescaled); extern cputime_t task_gtime(struct task_struct *t); #else static inline void task_cputime(struct task_struct *t, @@ -2253,6 +2254,13 @@ static inline void task_cputime(struct task_struct *t, *stime = t->stime; } +static inline cputime_t task_gtime(struct task_struct *t) +{ + return t->gtime; +} +#endif + +#ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME static inline void task_cputime_scaled(struct task_struct *t, cputime_t *utimescaled, cputime_t *stimescaled) @@ -2262,12 +2270,15 @@ static inline void task_cputime_scaled(struct task_struct *t, if (stimescaled) *stimescaled = t->stimescaled; } - -static inline cputime_t task_gtime(struct task_struct *t) +#else +static inline void task_cputime_scaled(struct task_struct *t, + cputime_t *utimescaled, + cputime_t *stimescaled) { - return t->gtime; + task_cputime(t, utimescaled, stimescaled); } #endif + extern void task_cputime_adjusted(struct task_struct *p, cputime_t *ut, cputime_t *st); extern void thread_group_cputime_adjusted(struct task_struct *p, cputime_t *ut, cputime_t *st); diff --git a/kernel/fork.c b/kernel/fork.c index 997ac1d..600e93b 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -1551,7 +1551,9 @@ static __latent_entropy struct task_struct *copy_process( init_sigpending(&p->pending); p->utime = p->stime = p->gtime = 0; +#ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME p->utimescaled = p->stimescaled = 0; +#endif prev_cputime_init(&p->prev_cputime); #ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c index 3229c72..ba55ebf 100644 --- a/kernel/sched/cputime.c +++ b/kernel/sched/cputime.c @@ -128,16 +128,13 @@ static inline void task_group_account_field(struct task_struct *p, int index, * Account user cpu time to a process. * @p: the process that the cpu time gets accounted to * @cputime: the cpu time spent in user space since the last update - * @cputime_scaled: cputime scaled by cpu frequency */ -void account_user_time(struct task_struct *p, cputime_t cputime, - cputime_t cputime_scaled) +void account_user_time(struct task_struct *p, cputime_t cputime) { int index; /* Add user time to process. */ p->utime += cputime; - p->utimescaled += cputime_scaled; account_group_user_time(p, cputime); index = (task_nice(p) > 0) ? CPUTIME_NICE : CPUTIME_USER; @@ -153,16 +150,13 @@ void account_user_time(struct task_struct *p, cputime_t cputime, * Account guest cpu time to a process. * @p: the process that the cpu time gets accounted to * @cputime: the cpu time spent in virtual machine since the last update - * @cputime_scaled: cputime scaled by cpu frequency */ -static void account_guest_time(struct task_struct *p, cputime_t cputime, - cputime_t cputime_scaled) +static void account_guest_time(struct task_struct *p, cputime_t cputime) { u64 *cpustat = kcpustat_this_cpu->cpustat; /* Add guest time to process. */ p->utime += cputime; - p->utimescaled += cputime_scaled; account_group_user_time(p, cputime); p->gtime += cputime; @@ -180,16 +174,13 @@ static void account_guest_time(struct task_struct *p, cputime_t cputime, * Account system cpu time to a process and desired cpustat field * @p: the process that the cpu time gets accounted to * @cputime: the cpu time spent in kernel space since the last update - * @cputime_scaled: cputime scaled by cpu frequency - * @target_cputime64: pointer to cpustat field that has to be updated + * @index: pointer to cpustat field that has to be updated */ static inline -void __account_system_time(struct task_struct *p, cputime_t cputime, - cputime_t cputime_scaled, int index) +void __account_system_time(struct task_struct *p, cputime_t cputime, int index) { /* Add system time to process. */ p->stime += cputime; - p->stimescaled += cputime_scaled; account_group_system_time(p, cputime); /* Add system time to cpustat. */ @@ -204,15 +195,14 @@ void __account_system_time(struct task_struct *p, cputime_t cputime, * @p: the process that the cpu time gets accounted to * @hardirq_offset: the offset to subtract from hardirq_count() * @cputime: the cpu time spent in kernel space since the last update - * @cputime_scaled: cputime scaled by cpu frequency */ void account_system_time(struct task_struct *p, int hardirq_offset, - cputime_t cputime, cputime_t cputime_scaled) + cputime_t cputime) { int index; if ((p->flags & PF_VCPU) && (irq_count() - hardirq_offset == 0)) { - account_guest_time(p, cputime, cputime_scaled); + account_guest_time(p, cputime); return; } @@ -223,7 +213,7 @@ void account_system_time(struct task_struct *p, int hardirq_offset, else index = CPUTIME_SYSTEM; - __account_system_time(p, cputime, cputime_scaled, index); + __account_system_time(p, cputime, index); } /* @@ -410,15 +400,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_time(p, cputime, cputime, CPUTIME_SOFTIRQ); + __account_system_time(p, cputime, CPUTIME_SOFTIRQ); } else if (user_tick) { - account_user_time(p, cputime, cputime); + 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, cputime, cputime); + account_guest_time(p, cputime); } else { - __account_system_time(p, cputime, cputime, CPUTIME_SYSTEM); + __account_system_time(p, cputime, CPUTIME_SYSTEM); } } @@ -521,9 +511,9 @@ void account_process_tick(struct task_struct *p, int user_tick) cputime -= steal; if (user_tick) - account_user_time(p, cputime, cputime); + account_user_time(p, cputime); else if ((p != rq->idle) || (irq_count() != HARDIRQ_OFFSET)) - account_system_time(p, HARDIRQ_OFFSET, cputime, cputime); + account_system_time(p, HARDIRQ_OFFSET, cputime); else account_idle_time(cputime); } @@ -744,7 +734,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, delta_cpu); + account_system_time(tsk, irq_count(), delta_cpu); } void vtime_account_system(struct task_struct *tsk) @@ -765,7 +755,7 @@ void vtime_account_user(struct task_struct *tsk) tsk->vtime_snap_whence = VTIME_SYS; if (vtime_delta(tsk)) { delta_cpu = get_vtime_delta(tsk); - account_user_time(tsk, delta_cpu, delta_cpu); + account_user_time(tsk, delta_cpu); } write_seqcount_end(&tsk->vtime_seqcount); } @@ -921,25 +911,4 @@ void task_cputime(struct task_struct *t, cputime_t *utime, cputime_t *stime) if (stime) *stime += sdelta; } - -void task_cputime_scaled(struct task_struct *t, - cputime_t *utimescaled, cputime_t *stimescaled) -{ - cputime_t udelta, sdelta; - - if (!vtime_accounting_enabled()) { - if (utimescaled) - *utimescaled = t->utimescaled; - if (stimescaled) - *stimescaled = t->stimescaled; - return; - } - - fetch_task_cputime(t, utimescaled, stimescaled, - &t->utimescaled, &t->stimescaled, &udelta, &sdelta); - if (utimescaled) - *utimescaled += udelta; - if (stimescaled) - *stimescaled += sdelta; -} #endif /* CONFIG_VIRT_CPU_ACCOUNTING_GEN */ -- 2.7.4 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 4/4] cputime: Simplify task_cputime() 2016-11-15 2:06 [GIT PULL] cputime: Scaled cputime optimizations and cleanups Frederic Weisbecker ` (2 preceding siblings ...) 2016-11-15 2:06 ` [PATCH 3/4] cputime/powerpc/s390: Make scaled cputime arch specific Frederic Weisbecker @ 2016-11-15 2:06 ` Frederic Weisbecker 2016-11-15 10:52 ` [tip:sched/core] sched/cputime: " tip-bot for Stanislaw Gruszka 3 siblings, 1 reply; 9+ messages in thread From: Frederic Weisbecker @ 2016-11-15 2:06 UTC (permalink / raw) To: Ingo Molnar Cc: LKML, Stanislaw Gruszka, Paul Mackerras, Peter Zijlstra, Heiko Carstens, Benjamin Herrenschmidt, Michael Neuling, Paul Mackerras, Ingo Molnar, Frederic Weisbecker, Martin Schwidefsky From: Stanislaw Gruszka <sgruszka@redhat.com> Now since fetch_task_cputime() has no other users than task_cputime(), its code could be used directly in task_cputime(). Moreover since only 2 task_cputime() calls of 17 use NULL argument, we can add dummy variables to those calls and remove NULL checks from task_cputimes(). Do also remove NULL checks on task_cputimes_scaled(). Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Michael Neuling <mikey@neuling.org> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> Cc: Heiko Carstens <heiko.carstens@de.ibm.com> Link: http://lkml.kernel.org/r/1477917389-11341-5-git-send-email-sgruszka@redhat.com Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> --- arch/x86/kernel/apm_32.c | 4 +-- include/linux/sched.h | 12 +++------ kernel/sched/cputime.c | 57 +++++++++++------------------------------- kernel/time/posix-cpu-timers.c | 4 +-- 4 files changed, 23 insertions(+), 54 deletions(-) diff --git a/arch/x86/kernel/apm_32.c b/arch/x86/kernel/apm_32.c index c7364bd..d90749b 100644 --- a/arch/x86/kernel/apm_32.c +++ b/arch/x86/kernel/apm_32.c @@ -906,14 +906,14 @@ static int apm_cpu_idle(struct cpuidle_device *dev, static int use_apm_idle; /* = 0 */ static unsigned int last_jiffies; /* = 0 */ static unsigned int last_stime; /* = 0 */ - cputime_t stime; + cputime_t stime, utime; int apm_idle_done = 0; unsigned int jiffies_since_last_check = jiffies - last_jiffies; unsigned int bucket; recalc: - task_cputime(current, NULL, &stime); + task_cputime(current, &utime, &stime); if (jiffies_since_last_check > IDLE_CALC_LIMIT) { use_apm_idle = 0; } else if (jiffies_since_last_check > idle_period) { diff --git a/include/linux/sched.h b/include/linux/sched.h index f72e813..fe3ce46 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -2248,10 +2248,8 @@ extern cputime_t task_gtime(struct task_struct *t); static inline void task_cputime(struct task_struct *t, cputime_t *utime, cputime_t *stime) { - if (utime) - *utime = t->utime; - if (stime) - *stime = t->stime; + *utime = t->utime; + *stime = t->stime; } static inline cputime_t task_gtime(struct task_struct *t) @@ -2265,10 +2263,8 @@ static inline void task_cputime_scaled(struct task_struct *t, cputime_t *utimescaled, cputime_t *stimescaled) { - if (utimescaled) - *utimescaled = t->utimescaled; - if (stimescaled) - *stimescaled = t->stimescaled; + *utimescaled = t->utimescaled; + *stimescaled = t->stimescaled; } #else static inline void task_cputime_scaled(struct task_struct *t, diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c index ba55ebf..7700a9c 100644 --- a/kernel/sched/cputime.c +++ b/kernel/sched/cputime.c @@ -851,29 +851,25 @@ cputime_t task_gtime(struct task_struct *t) * add up the pending nohz execution time since the last * cputime snapshot. */ -static void -fetch_task_cputime(struct task_struct *t, - cputime_t *u_dst, cputime_t *s_dst, - cputime_t *u_src, cputime_t *s_src, - cputime_t *udelta, cputime_t *sdelta) +void task_cputime(struct task_struct *t, cputime_t *utime, cputime_t *stime) { + cputime_t delta; unsigned int seq; - unsigned long long delta; + + if (!vtime_accounting_enabled()) { + *utime = t->utime; + *stime = t->stime; + return; + } do { - *udelta = 0; - *sdelta = 0; - seq = read_seqcount_begin(&t->vtime_seqcount); - if (u_dst) - *u_dst = *u_src; - if (s_dst) - *s_dst = *s_src; + *utime = t->utime; + *stime = t->stime; /* Task is sleeping, nothing to add */ - if (t->vtime_snap_whence == VTIME_INACTIVE || - is_idle_task(t)) + if (t->vtime_snap_whence == VTIME_INACTIVE || is_idle_task(t)) continue; delta = vtime_delta(t); @@ -882,33 +878,10 @@ fetch_task_cputime(struct task_struct *t, * Task runs either in user or kernel space, add pending nohz time to * the right place. */ - if (t->vtime_snap_whence == VTIME_USER || t->flags & PF_VCPU) { - *udelta = delta; - } else { - if (t->vtime_snap_whence == VTIME_SYS) - *sdelta = delta; - } + if (t->vtime_snap_whence == VTIME_USER || t->flags & PF_VCPU) + *utime += delta; + else if (t->vtime_snap_whence == VTIME_SYS) + *stime += delta; } while (read_seqcount_retry(&t->vtime_seqcount, seq)); } - - -void task_cputime(struct task_struct *t, cputime_t *utime, cputime_t *stime) -{ - cputime_t udelta, sdelta; - - if (!vtime_accounting_enabled()) { - if (utime) - *utime = t->utime; - if (stime) - *stime = t->stime; - return; - } - - fetch_task_cputime(t, utime, stime, &t->utime, - &t->stime, &udelta, &sdelta); - if (utime) - *utime += udelta; - if (stime) - *stime += sdelta; -} #endif /* CONFIG_VIRT_CPU_ACCOUNTING_GEN */ diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c index 39008d7..e887ffc 100644 --- a/kernel/time/posix-cpu-timers.c +++ b/kernel/time/posix-cpu-timers.c @@ -133,9 +133,9 @@ static inline unsigned long long prof_ticks(struct task_struct *p) } static inline unsigned long long virt_ticks(struct task_struct *p) { - cputime_t utime; + cputime_t utime, stime; - task_cputime(p, &utime, NULL); + task_cputime(p, &utime, &stime); return cputime_to_expires(utime); } -- 2.7.4 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [tip:sched/core] sched/cputime: Simplify task_cputime() 2016-11-15 2:06 ` [PATCH 4/4] cputime: Simplify task_cputime() Frederic Weisbecker @ 2016-11-15 10:52 ` tip-bot for Stanislaw Gruszka 0 siblings, 0 replies; 9+ messages in thread From: tip-bot for Stanislaw Gruszka @ 2016-11-15 10:52 UTC (permalink / raw) To: linux-tip-commits Cc: torvalds, tglx, mikey, mingo, paulus, hpa, benh, schwidefsky, linux-kernel, peterz, fweisbec, sgruszka, heiko.carstens, paulus Commit-ID: 353c50ebe329daaf2c94dc41c1c481cbba2a31fd Gitweb: http://git.kernel.org/tip/353c50ebe329daaf2c94dc41c1c481cbba2a31fd Author: Stanislaw Gruszka <sgruszka@redhat.com> AuthorDate: Tue, 15 Nov 2016 03:06:52 +0100 Committer: Ingo Molnar <mingo@kernel.org> CommitDate: Tue, 15 Nov 2016 09:51:05 +0100 sched/cputime: Simplify task_cputime() Now since fetch_task_cputime() has no other users than task_cputime(), its code could be used directly in task_cputime(). Moreover since only 2 task_cputime() calls of 17 use a NULL argument, we can add dummy variables to those calls and remove NULL checks from task_cputimes(). Also remove NULL checks from task_cputimes_scaled(). Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Heiko Carstens <heiko.carstens@de.ibm.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> Cc: Michael Neuling <mikey@neuling.org> Cc: Paul Mackerras <paulus@ozlabs.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/1479175612-14718-5-git-send-email-fweisbec@gmail.com Signed-off-by: Ingo Molnar <mingo@kernel.org> --- arch/x86/kernel/apm_32.c | 4 +-- include/linux/sched.h | 12 +++------ kernel/sched/cputime.c | 57 +++++++++++------------------------------- kernel/time/posix-cpu-timers.c | 4 +-- 4 files changed, 23 insertions(+), 54 deletions(-) diff --git a/arch/x86/kernel/apm_32.c b/arch/x86/kernel/apm_32.c index c7364bd..d90749b 100644 --- a/arch/x86/kernel/apm_32.c +++ b/arch/x86/kernel/apm_32.c @@ -906,14 +906,14 @@ static int apm_cpu_idle(struct cpuidle_device *dev, static int use_apm_idle; /* = 0 */ static unsigned int last_jiffies; /* = 0 */ static unsigned int last_stime; /* = 0 */ - cputime_t stime; + cputime_t stime, utime; int apm_idle_done = 0; unsigned int jiffies_since_last_check = jiffies - last_jiffies; unsigned int bucket; recalc: - task_cputime(current, NULL, &stime); + task_cputime(current, &utime, &stime); if (jiffies_since_last_check > IDLE_CALC_LIMIT) { use_apm_idle = 0; } else if (jiffies_since_last_check > idle_period) { diff --git a/include/linux/sched.h b/include/linux/sched.h index f72e813..fe3ce46 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -2248,10 +2248,8 @@ extern cputime_t task_gtime(struct task_struct *t); static inline void task_cputime(struct task_struct *t, cputime_t *utime, cputime_t *stime) { - if (utime) - *utime = t->utime; - if (stime) - *stime = t->stime; + *utime = t->utime; + *stime = t->stime; } static inline cputime_t task_gtime(struct task_struct *t) @@ -2265,10 +2263,8 @@ static inline void task_cputime_scaled(struct task_struct *t, cputime_t *utimescaled, cputime_t *stimescaled) { - if (utimescaled) - *utimescaled = t->utimescaled; - if (stimescaled) - *stimescaled = t->stimescaled; + *utimescaled = t->utimescaled; + *stimescaled = t->stimescaled; } #else static inline void task_cputime_scaled(struct task_struct *t, diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c index ba55ebf..7700a9c 100644 --- a/kernel/sched/cputime.c +++ b/kernel/sched/cputime.c @@ -851,29 +851,25 @@ cputime_t task_gtime(struct task_struct *t) * add up the pending nohz execution time since the last * cputime snapshot. */ -static void -fetch_task_cputime(struct task_struct *t, - cputime_t *u_dst, cputime_t *s_dst, - cputime_t *u_src, cputime_t *s_src, - cputime_t *udelta, cputime_t *sdelta) +void task_cputime(struct task_struct *t, cputime_t *utime, cputime_t *stime) { + cputime_t delta; unsigned int seq; - unsigned long long delta; - do { - *udelta = 0; - *sdelta = 0; + if (!vtime_accounting_enabled()) { + *utime = t->utime; + *stime = t->stime; + return; + } + do { seq = read_seqcount_begin(&t->vtime_seqcount); - if (u_dst) - *u_dst = *u_src; - if (s_dst) - *s_dst = *s_src; + *utime = t->utime; + *stime = t->stime; /* Task is sleeping, nothing to add */ - if (t->vtime_snap_whence == VTIME_INACTIVE || - is_idle_task(t)) + if (t->vtime_snap_whence == VTIME_INACTIVE || is_idle_task(t)) continue; delta = vtime_delta(t); @@ -882,33 +878,10 @@ fetch_task_cputime(struct task_struct *t, * Task runs either in user or kernel space, add pending nohz time to * the right place. */ - if (t->vtime_snap_whence == VTIME_USER || t->flags & PF_VCPU) { - *udelta = delta; - } else { - if (t->vtime_snap_whence == VTIME_SYS) - *sdelta = delta; - } + if (t->vtime_snap_whence == VTIME_USER || t->flags & PF_VCPU) + *utime += delta; + else if (t->vtime_snap_whence == VTIME_SYS) + *stime += delta; } while (read_seqcount_retry(&t->vtime_seqcount, seq)); } - - -void task_cputime(struct task_struct *t, cputime_t *utime, cputime_t *stime) -{ - cputime_t udelta, sdelta; - - if (!vtime_accounting_enabled()) { - if (utime) - *utime = t->utime; - if (stime) - *stime = t->stime; - return; - } - - fetch_task_cputime(t, utime, stime, &t->utime, - &t->stime, &udelta, &sdelta); - if (utime) - *utime += udelta; - if (stime) - *stime += sdelta; -} #endif /* CONFIG_VIRT_CPU_ACCOUNTING_GEN */ diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c index 39008d7..e887ffc 100644 --- a/kernel/time/posix-cpu-timers.c +++ b/kernel/time/posix-cpu-timers.c @@ -133,9 +133,9 @@ static inline unsigned long long prof_ticks(struct task_struct *p) } static inline unsigned long long virt_ticks(struct task_struct *p) { - cputime_t utime; + cputime_t utime, stime; - task_cputime(p, &utime, NULL); + task_cputime(p, &utime, &stime); return cputime_to_expires(utime); } ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 0/4] cputime: some optimizations and cleanups @ 2016-10-31 12:36 Stanislaw Gruszka 2016-10-31 12:36 ` [PATCH 4/4] cputime: simplify task_cputime() Stanislaw Gruszka 0 siblings, 1 reply; 9+ messages in thread From: Stanislaw Gruszka @ 2016-10-31 12:36 UTC (permalink / raw) To: linux-kernel Cc: Ingo Molnar, Peter Zijlstra, Frederic Weisbecker, Paul Mackerras, Benjamin Herrenschmidt, Michael Neuling, linuxppc-dev, Martin Schwidefsky, Heiko Carstens, linux-s390, Stanislaw Gruszka Patches remove accounting of utimescaled/stimescaled on architectures that do not provide those values (scaled cputimes are equal to normal cputimes) what is every architecture except powerpc and s390. Patches do not change user visible behaviour. There is very little documentation how scaled cputimes should be interpreted and what useful information they provide (at least I could not find that). Moreover they are exported to user-space only via not commonly used taskstats and delayacct interfaces (i.e. interfaces that are not used by standard linux tools AFICT). However I assume they can not be removed by whole (i.e. replaced by normal utimes/stimes on powerpc and s390). Stanislaw Gruszka (4): cputime/powerpc: remove cputime_last_delta global variable cputime/powerpc: remove cputime_to_scaled() cputime/powerpc/s390: make scaled cputime arch specific cputime: simplify task_cputime() arch/ia64/kernel/time.c | 4 +- arch/powerpc/Kconfig | 1 + arch/powerpc/include/asm/cputime.h | 14 ---- arch/powerpc/kernel/time.c | 8 +- arch/s390/Kconfig | 1 + arch/s390/kernel/vtime.c | 9 ++- arch/x86/kernel/apm_32.c | 4 +- include/asm-generic/cputime_jiffies.h | 1 - include/asm-generic/cputime_nsecs.h | 1 - include/linux/kernel_stat.h | 4 +- include/linux/sched.h | 29 +++++--- kernel/fork.c | 2 + kernel/sched/cputime.c | 124 +++++++++------------------------ kernel/time/posix-cpu-timers.c | 4 +- 14 files changed, 73 insertions(+), 133 deletions(-) ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 4/4] cputime: simplify task_cputime() 2016-10-31 12:36 [PATCH 0/4] cputime: some optimizations and cleanups Stanislaw Gruszka @ 2016-10-31 12:36 ` Stanislaw Gruszka 0 siblings, 0 replies; 9+ messages in thread From: Stanislaw Gruszka @ 2016-10-31 12:36 UTC (permalink / raw) To: linux-kernel Cc: Ingo Molnar, Peter Zijlstra, Frederic Weisbecker, Paul Mackerras, Benjamin Herrenschmidt, Michael Neuling, linuxppc-dev, Martin Schwidefsky, Heiko Carstens, linux-s390, Stanislaw Gruszka Now since fetch_task_cputime() has no other users than task_cputime(), it's code could be used directly in task_cputime(). Moreover since only 2 task_cputime() calls of 17 use NULL argument, we can add dummy variables to those calls and remove NULL checks from task_cputimes(). Do also remove NULL checks on task_cputimes_scaled(). Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> --- arch/x86/kernel/apm_32.c | 4 +- include/linux/sched.h | 12 +++----- kernel/sched/cputime.c | 57 ++++++++++----------------------------- kernel/time/posix-cpu-timers.c | 4 +- 4 files changed, 23 insertions(+), 54 deletions(-) diff --git a/arch/x86/kernel/apm_32.c b/arch/x86/kernel/apm_32.c index c7364bd..d90749b 100644 --- a/arch/x86/kernel/apm_32.c +++ b/arch/x86/kernel/apm_32.c @@ -906,14 +906,14 @@ static int apm_cpu_idle(struct cpuidle_device *dev, static int use_apm_idle; /* = 0 */ static unsigned int last_jiffies; /* = 0 */ static unsigned int last_stime; /* = 0 */ - cputime_t stime; + cputime_t stime, utime; int apm_idle_done = 0; unsigned int jiffies_since_last_check = jiffies - last_jiffies; unsigned int bucket; recalc: - task_cputime(current, NULL, &stime); + task_cputime(current, &utime, &stime); if (jiffies_since_last_check > IDLE_CALC_LIMIT) { use_apm_idle = 0; } else if (jiffies_since_last_check > idle_period) { diff --git a/include/linux/sched.h b/include/linux/sched.h index 36a2c2e..93fbae0 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -2228,10 +2228,8 @@ extern void task_cputime(struct task_struct *t, static inline void task_cputime(struct task_struct *t, cputime_t *utime, cputime_t *stime) { - if (utime) - *utime = t->utime; - if (stime) - *stime = t->stime; + *utime = t->utime; + *stime = t->stime; } static inline cputime_t task_gtime(struct task_struct *t) @@ -2245,10 +2243,8 @@ static inline void task_cputime_scaled(struct task_struct *t, cputime_t *utimescaled, cputime_t *stimescaled) { - if (utimescaled) - *utimescaled = t->utimescaled; - if (stimescaled) - *stimescaled = t->stimescaled; + *utimescaled = t->utimescaled; + *stimescaled = t->stimescaled; } #else static inline void task_cputime_scaled(struct task_struct *t, diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c index d427def..46a984e 100644 --- a/kernel/sched/cputime.c +++ b/kernel/sched/cputime.c @@ -851,29 +851,25 @@ cputime_t task_gtime(struct task_struct *t) * add up the pending nohz execution time since the last * cputime snapshot. */ -static void -fetch_task_cputime(struct task_struct *t, - cputime_t *u_dst, cputime_t *s_dst, - cputime_t *u_src, cputime_t *s_src, - cputime_t *udelta, cputime_t *sdelta) +void task_cputime(struct task_struct *t, cputime_t *utime, cputime_t *stime) { + cputime_t delta; unsigned int seq; - unsigned long long delta; - do { - *udelta = 0; - *sdelta = 0; + if (!vtime_accounting_enabled()) { + *utime = t->utime; + *stime = t->stime; + return; + } + do { seq = read_seqcount_begin(&t->vtime_seqcount); - if (u_dst) - *u_dst = *u_src; - if (s_dst) - *s_dst = *s_src; + *utime = t->utime; + *stime = t->stime; /* Task is sleeping, nothing to add */ - if (t->vtime_snap_whence == VTIME_INACTIVE || - is_idle_task(t)) + if (t->vtime_snap_whence == VTIME_INACTIVE || is_idle_task(t)) continue; delta = vtime_delta(t); @@ -882,33 +878,10 @@ cputime_t task_gtime(struct task_struct *t) * Task runs either in user or kernel space, add pending nohz time to * the right place. */ - if (t->vtime_snap_whence == VTIME_USER || t->flags & PF_VCPU) { - *udelta = delta; - } else { - if (t->vtime_snap_whence == VTIME_SYS) - *sdelta = delta; - } + if (t->vtime_snap_whence == VTIME_USER || t->flags & PF_VCPU) + *utime += delta; + else if (t->vtime_snap_whence == VTIME_SYS) + *stime += delta; } while (read_seqcount_retry(&t->vtime_seqcount, seq)); } - - -void task_cputime(struct task_struct *t, cputime_t *utime, cputime_t *stime) -{ - cputime_t udelta, sdelta; - - if (!vtime_accounting_enabled()) { - if (utime) - *utime = t->utime; - if (stime) - *stime = t->stime; - return; - } - - fetch_task_cputime(t, utime, stime, &t->utime, - &t->stime, &udelta, &sdelta); - if (utime) - *utime += udelta; - if (stime) - *stime += sdelta; -} #endif /* CONFIG_VIRT_CPU_ACCOUNTING_GEN */ diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c index 39008d7..e887ffc 100644 --- a/kernel/time/posix-cpu-timers.c +++ b/kernel/time/posix-cpu-timers.c @@ -133,9 +133,9 @@ static inline unsigned long long prof_ticks(struct task_struct *p) } static inline unsigned long long virt_ticks(struct task_struct *p) { - cputime_t utime; + cputime_t utime, stime; - task_cputime(p, &utime, NULL); + task_cputime(p, &utime, &stime); return cputime_to_expires(utime); } -- 1.7.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
end of thread, other threads:[~2016-11-15 10:53 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-11-15 2:06 [GIT PULL] cputime: Scaled cputime optimizations and cleanups Frederic Weisbecker 2016-11-15 2:06 ` [PATCH 1/4] cputime/powerpc: Remove cputime_last_delta global variable Frederic Weisbecker 2016-11-15 10:50 ` [tip:sched/core] sched/cputime, powerpc: " tip-bot for Stanislaw Gruszka 2016-11-15 2:06 ` [PATCH 2/4] cputime/powerpc: Remove cputime_to_scaled() Frederic Weisbecker 2016-11-15 10:51 ` [tip:sched/core] sched/cputime, powerpc: " tip-bot for Stanislaw Gruszka 2016-11-15 2:06 ` [PATCH 3/4] cputime/powerpc/s390: Make scaled cputime arch specific Frederic Weisbecker 2016-11-15 2:06 ` [PATCH 4/4] cputime: Simplify task_cputime() Frederic Weisbecker 2016-11-15 10:52 ` [tip:sched/core] sched/cputime: " tip-bot for Stanislaw Gruszka -- strict thread matches above, loose matches on Subject: below -- 2016-10-31 12:36 [PATCH 0/4] cputime: some optimizations and cleanups Stanislaw Gruszka 2016-10-31 12:36 ` [PATCH 4/4] cputime: simplify task_cputime() Stanislaw Gruszka
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).