summaryrefslogtreecommitdiff
path: root/kernel/rcutree.h
diff options
context:
space:
mode:
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>2013-08-26 04:20:47 (GMT)
committerJiri Slaby <jslaby@suse.cz>2014-03-12 12:25:37 (GMT)
commit66802dc66423b151f82088406a77131474341cb7 (patch)
tree2658bcbdbfca9cc2e03aec4afdf538fe28a4d1da /kernel/rcutree.h
parentac631f750ba3ccde692d0f41750002fba17a005d (diff)
downloadlinux-fsl-qoriq-66802dc66423b151f82088406a77131474341cb7.tar.xz
rcu: Throttle rcu_try_advance_all_cbs() execution
commit c229828ca6bc62d6c654f64b1d1b8a9ebd8a56f3 upstream. The rcu_try_advance_all_cbs() function is invoked on each attempted entry to and every exit from idle. If this function determines that there are callbacks ready to invoke, the caller will invoke the RCU core, which in turn will result in a pair of context switches. If a CPU enters and exits idle extremely frequently, this can result in an excessive number of context switches and high CPU overhead. This commit therefore causes rcu_try_advance_all_cbs() to throttle itself, refusing to do work more than once per jiffy. Reported-by: Tibor Billes <tbilles@gmx.com> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Tested-by: Tibor Billes <tbilles@gmx.com> Reviewed-by: Josh Triplett <josh@joshtriplett.org> Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Diffstat (limited to 'kernel/rcutree.h')
-rw-r--r--kernel/rcutree.h2
1 files changed, 2 insertions, 0 deletions
diff --git a/kernel/rcutree.h b/kernel/rcutree.h
index 5f97eab..52be957 100644
--- a/kernel/rcutree.h
+++ b/kernel/rcutree.h
@@ -104,6 +104,8 @@ struct rcu_dynticks {
/* idle-period nonlazy_posted snapshot. */
unsigned long last_accelerate;
/* Last jiffy CBs were accelerated. */
+ unsigned long last_advance_all;
+ /* Last jiffy CBs were all advanced. */
int tick_nohz_enabled_snap; /* Previously seen value from sysfs. */
#endif /* #ifdef CONFIG_RCU_FAST_NO_HZ */
};