[xen master] RCU: make the period of the idle timer adaptive

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[xen master] RCU: make the period of the idle timer adaptive

patchbot
commit 4cb6b5799ff7569af406faec3b1225e554c6f47c
Author:     Dario Faggioli <[hidden email]>
AuthorDate: Mon Oct 9 13:24:01 2017 +0200
Commit:     Jan Beulich <[hidden email]>
CommitDate: Mon Oct 9 13:24:01 2017 +0200

    RCU: make the period of the idle timer adaptive
   
    Basically, if the RCU idle timer, when (if!) it fires,
    finds that the grace period isn't over, we increase the
    timer's period (i.e., it will fire later, next time).
    If, OTOH, it finds the grace period is already finished,
    we decrease the timer's period (i.e., it will fire a bit
    earlier next time).
   
    The goal is to let the period timer sefl-adjust to a
    number of 'misses', of the order of 1%.
   
    Suggested-by: George Dunlap <[hidden email]>
    Signed-off-by: Dario Faggioli <[hidden email]>
    Reviewed-by: Jan Beulich <[hidden email]>
---
 xen/common/rcupdate.c | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/xen/common/rcupdate.c b/xen/common/rcupdate.c
index f07185f..3517790 100644
--- a/xen/common/rcupdate.c
+++ b/xen/common/rcupdate.c
@@ -118,9 +118,21 @@ struct rcu_data {
  */
 #define IDLE_TIMER_PERIOD_MAX     MILLISECS(100)
 #define IDLE_TIMER_PERIOD_DEFAULT MILLISECS(10)
+#define IDLE_TIMER_PERIOD_MIN     MICROSECS(100)
 
 static s_time_t __read_mostly idle_timer_period;
 
+/*
+ * Increment and decrement values for the idle timer handler. The algorithm
+ * works as follows:
+ * - if the timer actually fires, and it finds out that the grace period isn't
+ *   over yet, we add IDLE_TIMER_PERIOD_INCR to the timer's period;
+ * - if the timer actually fires and it finds the grace period over, we
+ *   subtract IDLE_TIMER_PERIOD_DECR from the timer's period.
+ */
+#define IDLE_TIMER_PERIOD_INCR    MILLISECS(10)
+#define IDLE_TIMER_PERIOD_DECR    MICROSECS(100)
+
 static DEFINE_PER_CPU(struct rcu_data, rcu_data);
 
 static int blimit = 10;
@@ -493,8 +505,14 @@ void rcu_idle_timer_stop()
 
 static void rcu_idle_timer_handler(void* data)
 {
-    /* Nothing, really... Just count the number of times we fire */
     perfc_incr(rcu_idle_timer);
+
+    if ( !cpumask_empty(&rcu_ctrlblk.cpumask) )
+        idle_timer_period = min(idle_timer_period + IDLE_TIMER_PERIOD_INCR,
+                                IDLE_TIMER_PERIOD_MAX);
+    else
+        idle_timer_period = max(idle_timer_period - IDLE_TIMER_PERIOD_DECR,
+                                IDLE_TIMER_PERIOD_MIN);
 }
 
 void rcu_check_callbacks(int cpu)
--
generated by git-patchbot for /home/xen/git/xen.git#master

_______________________________________________
Xen-changelog mailing list
[hidden email]
https://lists.xenproject.org/xen-changelog