NOHZ updates for v4.3
Subsystems (7)
Ingo Molnar
maintainerLinus,
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: 555ee95a0a5a525ad2f1654fab0bd157de832b4f Merge branch 'timers/nohz-for-tip' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic/linux-dynticks into timers/nohz
The main changes, mostly written by Frederic Weisbecker, include:
- Fix some jiffies based cputime assumptions. (No real harm because the concerned code isn't used by full dynticks.)
- Simplify jiffies <-> usecs conversions. Remove dead code.
- Remove early hacks on nohz full code that avoided messing up idle nohz internals. Now nohz integrates well full and idle and such hack have become needless.
- Restart nohz full tick from irq exit. (A simplification and a preparation for future optimization on scheduler kick to nohz full.)
- Code cleanups.
- Tile driver isolation enhancement on top of nohz. (Chris Metcalf)
Thanks,
Ingo
------------------>
Chris Metcalf (1):
nohz: Prevent tilegx network driver interrupts
Frederic Weisbecker (7):
jiffies: Remove HZ > USEC_PER_SEC special case
apm32: Fix cputime == jiffies assumption
alpha: Fix jiffies based cputime assumption
nohz: Remove idle task special case
nohz: Restart nohz full tick from irq exit
nohz: Move tick_nohz_restart_sched_tick() above its users
nohz: Remove useless argument on tick_nohz_task_switch()
arch/alpha/kernel/osf_sys.c | 13 ++++--- arch/x86/kernel/apm_32.c | 2 +- drivers/net/ethernet/tile/tilegx.c | 4 ++- include/linux/jiffies.h | 9 +---- include/linux/tick.h | 25 ++++++------- kernel/sched/core.c | 2 +- kernel/time/tick-sched.c | 72 ++++++++++++++------------------------ kernel/time/time.c | 10 ++++-- 8 files changed, 62 insertions(+), 75 deletions(-)
arch/alpha/kernel/osf_sys.c +9 -4
@@ -1138,6 +1138,7 @@ SYSCALL_DEFINE2(osf_getrusage, int, who, struct rusage32 __user *, ru) {struct rusage32 r;cputime_t utime, stime; +unsigned long utime_jiffies, stime_jiffies;if (who !=RUSAGE_SELF && who !=RUSAGE_CHILDREN )return -EINVAL ;
@@ -1146,14 +1147,18 @@ SYSCALL_DEFINE2(osf_getrusage, int, who, struct rusage32 __user *, ru)switch (who) {case RUSAGE_SELF :task_cputime (current, &utime, &stime); -jiffies_to_timeval32 (utime, &r.ru_utime); -jiffies_to_timeval32 (stime, &r.ru_stime); + utime_jiffies =cputime_to_jiffies (utime); + stime_jiffies =cputime_to_jiffies (stime); +jiffies_to_timeval32 (utime_jiffies, &r.ru_utime); +jiffies_to_timeval32 (stime_jiffies, &r.ru_stime); r.ru_minflt = current->min_flt; r.ru_majflt = current->maj_flt;break ;case RUSAGE_CHILDREN : -jiffies_to_timeval32 (current->signal->cutime, &r.ru_utime); -jiffies_to_timeval32 (current->signal->cstime, &r.ru_stime); + utime_jiffies =cputime_to_jiffies (current->signal->cutime); + stime_jiffies =cputime_to_jiffies (current->signal->cstime); +jiffies_to_timeval32 (utime_jiffies, &r.ru_utime); +jiffies_to_timeval32 (stime_jiffies, &r.ru_stime); r.ru_minflt = current->signal->cmin_flt; r.ru_majflt = current->signal->cmaj_flt;break ;
arch/x86/kernel/apm_32.c +1 -1
@@ -919,7 +919,7 @@ static int apm_cpu_idle(struct cpuidle_device *dev, }else if (jiffies_since_last_check > idle_period) {unsigned int idle_percentage; - idle_percentage = stime - last_stime; + idle_percentage =cputime_to_jiffies (stime - last_stime); idle_percentage *=100 ; idle_percentage /= jiffies_since_last_check; use_apm_idle = (idle_percentage > idle_threshold);
drivers/net/ethernet/tile/tilegx.c +3 -1
@@ -40,6 +40,7 @@#include <linux/tcp.h> #include <linux/net_tstamp.h> #include <linux/ptp_clock_kernel.h> +#include <linux/tick.h> #include <asm/checksum.h> #include <asm/homecache.h>
@@ -2273,7 +2274,8 @@ static int __init tile_net_init_module(void)tile_net_dev_init (name, mac);if (!network_cpus_init ()) - network_cpus_map = *cpu_online_mask; +cpumask_and (&network_cpus_map,housekeeping_cpumask (), + cpu_online_mask);return 0 ; }
include/linux/jiffies.h +1 -8
@@ -363,18 +363,11 @@ static inline unsigned long msecs_to_jiffies(const unsigned int m) }extern unsigned long __usecs_to_jiffies (const unsigned int u); -#if HZ <=USEC_PER_SEC && !(USEC_PER_SEC %HZ ) +#if !(USEC_PER_SEC %HZ )static inline unsigned long _usecs_to_jiffies (const unsigned int u) {return (u + (USEC_PER_SEC /HZ ) -1 ) / (USEC_PER_SEC /HZ ); } -#elif HZ >USEC_PER_SEC && !(HZ %USEC_PER_SEC ) -static inline unsigned long _usecs_to_jiffies (const unsigned int u) -{ -return u * (HZ /USEC_PER_SEC ); -} -static inline unsigned long _usecs_to_jiffies (const unsigned int u) -{#else static inline unsigned long _usecs_to_jiffies (const unsigned int u) {
include/linux/tick.h +13 -12
@@ -147,22 +147,29 @@ static inline void tick_nohz_full_add_cpus_to(struct cpumask *mask)cpumask_or (mask, mask, tick_nohz_full_mask); } -extern void __tick_nohz_full_check (void );extern void tick_nohz_full_kick (void );extern void tick_nohz_full_kick_cpu (int cpu);extern void tick_nohz_full_kick_all (void ); -extern void __tick_nohz_task_switch (struct task_struct *tsk); +extern void __tick_nohz_task_switch (void );#else static inline bool tick_nohz_full_enabled (void ) {return false; }static inline bool tick_nohz_full_cpu (int cpu) {return false; }static inline void tick_nohz_full_add_cpus_to (struct cpumask *mask) { } -static inline void __tick_nohz_full_check (void ) { }static inline void tick_nohz_full_kick_cpu (int cpu) { }static inline void tick_nohz_full_kick (void ) { }static inline void tick_nohz_full_kick_all (void ) { } -static inline void __tick_nohz_task_switch (struct task_struct *tsk) { } +static inline void __tick_nohz_task_switch (void ) { }#endif +static inline const struct cpumask *housekeeping_cpumask (void ) +{ +#ifdef CONFIG_NO_HZ_FULL +if (tick_nohz_full_enabled ()) +return housekeeping_mask; +#endif +return cpu_possible_mask; +} +static inline bool is_housekeeping_cpu (int cpu) {#ifdef CONFIG_NO_HZ_FULL
@@ -181,16 +188,10 @@ static inline void housekeeping_affine(struct task_struct *t) #endif } -static inline void tick_nohz_full_check (void ) -{ -if (tick_nohz_full_enabled ()) -__tick_nohz_full_check (); -} - -static inline void tick_nohz_task_switch (struct task_struct *tsk) +static inline void tick_nohz_task_switch (void ) {if (tick_nohz_full_enabled ()) -__tick_nohz_task_switch (tsk); +__tick_nohz_task_switch (); }#endif
kernel/sched/core.c +1 -1
@@ -2489,7 +2489,7 @@ static struct rq *finish_task_switch(struct task_struct *prev)put_task_struct (prev); } -tick_nohz_task_switch (current); +tick_nohz_task_switch ();return rq; }
kernel/time/tick-sched.c +27 -45
119 lines not on this page · raw message
kernel/time/time.c +7 -3
@@ -268,10 +268,14 @@ EXPORT_SYMBOL(jiffies_to_msecs);unsigned int jiffies_to_usecs (const unsigned long j) { -#if HZ <=USEC_PER_SEC && !(USEC_PER_SEC %HZ ) +/* +* Hz usually doesn't go much further MSEC_PER_SEC. +* jiffies_to_usecs() and usecs_to_jiffies() depend on that. +*/ +BUILD_BUG_ON (HZ >USEC_PER_SEC ); + +#if !(USEC_PER_SEC %HZ )return (USEC_PER_SEC /HZ ) * j; -#elif HZ >USEC_PER_SEC && !(HZ %USEC_PER_SEC ) -return (j + (HZ /USEC_PER_SEC ) -1 )/(HZ /USEC_PER_SEC );#else # if BITS_PER_LONG ==32 return (HZ_TO_USEC_MUL32 * j) >>HZ_TO_USEC_SHR32 ;