timers/nohz changes for v3.15
Subsystems (9)
Linus,
Please pull the latest timers-nohz-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers-nohz-for-linus
# HEAD: 073d8224d299528778e90773becd1e890953443c arch: Remove stub cputime.h headers
The main purpose is to fix a full dynticks bug related to virtualization, where steal time accounting appears to be zero in /proc/stat even after a few seconds of competing guests running busy loops in a same host CPU. It's not a regression though as it was there since the beginning.
The other commits are preparatory work to fix the bug and various cleanups.
Thanks,
Ingo
------------------>
Frederic Weisbecker (6):
cputime: Fix nsecs_to_cputime() return type cast
cputime: Default implementation of nsecs -> cputime conversion
cputime: Bring cputime -> nsecs conversion
cputime: Fix jiffies based cputime assumption on steal accounting
sched: Remove needless round trip nsecs <-> tick conversion of steal time
arch: Remove stub cputime.h headers
arch/alpha/include/asm/Kbuild | 1 + arch/alpha/include/asm/cputime.h | 6 ------ arch/cris/include/asm/Kbuild | 1 + arch/cris/include/asm/cputime.h | 6 ------ arch/frv/include/asm/Kbuild | 1 + arch/frv/include/asm/cputime.h | 6 ------ arch/m32r/include/asm/Kbuild | 1 + arch/m32r/include/asm/cputime.h | 6 ------ arch/microblaze/include/asm/Kbuild | 1 + arch/microblaze/include/asm/cputime.h | 1 - arch/mn10300/include/asm/Kbuild | 1 + arch/mn10300/include/asm/cputime.h | 1 - arch/score/include/asm/Kbuild | 1 + arch/score/include/asm/cputime.h | 6 ------ arch/x86/include/asm/Kbuild | 1 + arch/x86/include/asm/cputime.h | 1 - drivers/cpufreq/cpufreq_stats.c | 2 +- drivers/s390/cio/cio.c | 2 +- fs/proc/stat.c | 2 +- fs/proc/uptime.c | 2 +- include/asm-generic/cputime_jiffies.h | 4 +++- include/asm-generic/cputime_nsecs.h | 5 ++++- include/linux/cputime.h | 16 ++++++++++++++++ include/linux/kernel_stat.h | 2 +- include/linux/sched.h | 2 +- kernel/sched/core.c | 6 ------ kernel/sched/cputime.c | 16 +++++++++++----- kernel/sched/sched.h | 10 ---------- 28 files changed, 48 insertions(+), 62 deletions(-) delete mode 100644 arch/alpha/include/asm/cputime.h delete mode 100644 arch/cris/include/asm/cputime.h delete mode 100644 arch/frv/include/asm/cputime.h delete mode 100644 arch/m32r/include/asm/cputime.h delete mode 100644 arch/microblaze/include/asm/cputime.h delete mode 100644 arch/mn10300/include/asm/cputime.h delete mode 100644 arch/score/include/asm/cputime.h delete mode 100644 arch/x86/include/asm/cputime.h create mode 100644 include/linux/cputime.h
arch/alpha/include/asm/Kbuild +1 -0
@@ -1,6 +1,7 @@ generic-y += clkdev.h +generic-y += cputime.h generic-y += exec.h generic-y += hash.h generic-y += mcs_spinlock.h
arch/alpha/include/asm/cputime.h deleted +0 -6
@@ -1,6 +0,0 @@ -#ifndef __ALPHA_CPUTIME_H -#define __ALPHA_CPUTIME_H - -#include <asm-generic/cputime.h> - -#endif /* __ALPHA_CPUTIME_H */
arch/cris/include/asm/Kbuild +1 -0
@@ -5,6 +5,7 @@ header-y += arch-v32/ generic-y += barrier.h generic-y += clkdev.h +generic-y += cputime.h generic-y += exec.h generic-y += hash.h generic-y += kvm_para.h
arch/cris/include/asm/cputime.h deleted +0 -6
@@ -1,6 +0,0 @@ -#ifndef __CRIS_CPUTIME_H -#define __CRIS_CPUTIME_H - -#include <asm-generic/cputime.h> - -#endif /* __CRIS_CPUTIME_H */
arch/frv/include/asm/Kbuild +1 -0
@@ -1,5 +1,6 @@ generic-y += clkdev.h +generic-y += cputime.h generic-y += exec.h generic-y += hash.h generic-y += mcs_spinlock.h
arch/frv/include/asm/cputime.h deleted +0 -6
@@ -1,6 +0,0 @@ -#ifndef _ASM_CPUTIME_H -#define _ASM_CPUTIME_H - -#include <asm-generic/cputime.h> - -#endif /* _ASM_CPUTIME_H */
arch/m32r/include/asm/Kbuild +1 -0
@@ -1,5 +1,6 @@ generic-y += clkdev.h +generic-y += cputime.h generic-y += exec.h generic-y += hash.h generic-y += mcs_spinlock.h
arch/m32r/include/asm/cputime.h deleted +0 -6
@@ -1,6 +0,0 @@ -#ifndef __M32R_CPUTIME_H -#define __M32R_CPUTIME_H - -#include <asm-generic/cputime.h> - -#endif /* __M32R_CPUTIME_H */
arch/microblaze/include/asm/Kbuild +1 -0
@@ -1,6 +1,7 @@ generic-y += barrier.h generic-y += clkdev.h +generic-y += cputime.h generic-y += exec.h generic-y += hash.h generic-y += mcs_spinlock.h
arch/microblaze/include/asm/cputime.h deleted +0 -1
@@ -1 +0,0 @@ -#include <asm-generic/cputime.h>
arch/mn10300/include/asm/Kbuild +1 -0
@@ -1,6 +1,7 @@ generic-y += barrier.h generic-y += clkdev.h +generic-y += cputime.h generic-y += exec.h generic-y += hash.h generic-y += mcs_spinlock.h
arch/mn10300/include/asm/cputime.h deleted +0 -1
@@ -1 +0,0 @@ -#include <asm-generic/cputime.h>
arch/score/include/asm/Kbuild +1 -0
@@ -4,6 +4,7 @@ header-y += generic-y += barrier.h generic-y += clkdev.h +generic-y += cputime.h generic-y += hash.h generic-y += mcs_spinlock.h generic-y += preempt.h
arch/score/include/asm/cputime.h deleted +0 -6
@@ -1,6 +0,0 @@ -#ifndef _ASM_SCORE_CPUTIME_H -#define _ASM_SCORE_CPUTIME_H - -#include <asm-generic/cputime.h> - -#endif /* _ASM_SCORE_CPUTIME_H */
arch/x86/include/asm/Kbuild +1 -0
@@ -5,4 +5,5 @@ genhdr-y += unistd_64.h genhdr-y += unistd_x32.h generic-y += clkdev.h +generic-y += cputime.h generic-y += mcs_spinlock.h
arch/x86/include/asm/cputime.h deleted +0 -1
@@ -1 +0,0 @@ -#include <asm-generic/cputime.h>
drivers/cpufreq/cpufreq_stats.c +1 -1
@@ -13,7 +13,7 @@#include <linux/cpufreq.h> #include <linux/module.h> #include <linux/slab.h> -#include <asm/cputime.h> +#include <linux/cputime.h> static spinlock_t cpufreq_stats_lock;
drivers/s390/cio/cio.c +1 -1
@@ -28,7 +28,7 @@#include <asm/chpid.h> #include <asm/airq.h> #include <asm/isc.h> -#include <asm/cputime.h> +#include <linux/cputime.h> #include <asm/fcx.h> #include <asm/nmi.h> #include <asm/crw.h>
fs/proc/stat.c +1 -1
@@ -9,7 +9,7 @@#include <linux/slab.h> #include <linux/time.h> #include <linux/irqnr.h> -#include <asm/cputime.h> +#include <linux/cputime.h> #include <linux/tick.h> #ifndef arch_irq_stat_cpu
fs/proc/uptime.c +1 -1
@@ -5,7 +5,7 @@#include <linux/seq_file.h> #include <linux/time.h> #include <linux/kernel_stat.h> -#include <asm/cputime.h> +#include <linux/cputime.h> static int uptime_proc_show (struct seq_file *m,void *v) {
include/asm-generic/cputime_jiffies.h +3 -1
@@ -15,8 +15,10 @@ typedef u64 __nocast cputime64_t;/* -* Convert nanoseconds to cputime +* Convert nanoseconds <-> cputime */ +#define cputime_to_nsecs (__ct) \ + jiffies_to_nsecs(cputime_to_jiffies(__ct))#define nsecs_to_cputime64 (__nsec) \ jiffies64_to_cputime64(nsecs_to_jiffies64(__nsec))#define nsecs_to_cputime (__nsec) \
include/asm-generic/cputime_nsecs.h +4 -1
@@ -44,7 +44,10 @@ typedef u64 __nocast cputime64_t;/* * Convert cputime <-> nanoseconds */ -#define nsecs_to_cputime (__nsecs) ((__force u64)(__nsecs)) +#define cputime_to_nsecs (__ct) \ + (__force u64)(__ct) +#define nsecs_to_cputime (__nsecs) \ + (__force cputime_t)(__nsecs)/*
include/linux/cputime.h new file +16 -0
@@ -0,0 +1,16 @@ +#ifndef __LINUX_CPUTIME_H +#define __LINUX_CPUTIME_H + +#include <asm/cputime.h> + +#ifndef cputime_to_nsecs +# define cputime_to_nsecs (__ct) \ + (cputime_to_usecs(__ct) * NSEC_PER_USEC) +#endif + +#ifndef nsecs_to_cputime +# define nsecs_to_cputime (__nsecs) \ + usecs_to_cputime((__nsecs) / NSEC_PER_USEC) +#endif + +#endif /* __LINUX_CPUTIME_H */
include/linux/kernel_stat.h +1 -1
@@ -9,7 +9,7 @@#include <linux/sched.h> #include <linux/vtime.h> #include <asm/irq.h> -#include <asm/cputime.h> +#include <linux/cputime.h> /* * 'kernel_stat.h' contains the definitions needed for doing
include/linux/sched.h +1 -1
@@ -27,7 +27,7 @@ struct sched_param {#include <asm/page.h> #include <asm/ptrace.h> -#include <asm/cputime.h> +#include <linux/cputime.h> #include <linux/smp.h> #include <linux/sem.h>
kernel/sched/core.c +0 -6
@@ -823,19 +823,13 @@ static void update_rq_clock_task(struct rq *rq, s64 delta)#endif #ifdef CONFIG_PARAVIRT_TIME_ACCOUNTING if (static_key_false ((¶virt_steal_rq_enabled))) { -u64 st; - steal =paravirt_steal_clock (cpu_of (rq)); steal -= rq->prev_steal_time_rq;if (unlikely (steal > delta)) steal = delta; - st =steal_ticks (steal); - steal = st *TICK_NSEC ; - rq->prev_steal_time_rq += steal; - delta -= steal; }#endif
kernel/sched/cputime.c +11 -5
@@ -258,16 +258,22 @@ static __always_inline bool steal_account_process_tick(void) {#ifdef CONFIG_PARAVIRT if (static_key_false (¶virt_steal_enabled)) { -u64 steal, st =0 ; +u64 steal; +cputime_t steal_ct; steal =paravirt_steal_clock (smp_processor_id ()); steal -=this_rq ()->prev_steal_time; - st =steal_ticks (steal); -this_rq ()->prev_steal_time += st *TICK_NSEC ; +/* +* cputime_t may be less precise than nsecs (eg: if it's +* based on jiffies). Lets cast the result to cputime +* granularity and account the rest on the next rounds. +*/ + steal_ct =nsecs_to_cputime (steal); +this_rq ()->prev_steal_time +=cputime_to_nsecs (steal_ct); -account_steal_time (st); -return st; +account_steal_time (steal_ct); +return steal_ct; }#endif return false;
kernel/sched/sched.h +0 -10
@@ -1214,16 +1214,6 @@ extern void update_idle_cpu_load(struct rq *this_rq);extern void init_task_runnable_average (struct task_struct *p); -#ifdef CONFIG_PARAVIRT -static inline u64 steal_ticks (u64 steal) -{ -if (unlikely (steal >NSEC_PER_SEC )) -return div_u64 (steal,TICK_NSEC ); - -return __iter_div_u64_rem (steal,TICK_NSEC , &steal); -} -#endif -static inline void inc_nr_running (struct rq *rq) { rq->nr_running++;