[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 3/3] xen: 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%. Signed-off-by: Dario Faggioli <dario.faggioli@xxxxxxxxxx> Suggested-by: George Dunlap <george.dunlap@xxxxxxxxxx> --- Cc: Jan Beulich <JBeulich@xxxxxxxx> Cc: Julien Grall <julien.grall@xxxxxxx> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Cc: George Dunlap <george.dunlap@xxxxxxxxxx> Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx>, Cc: Tim Deegan <tim@xxxxxxx> --- xen/common/rcupdate.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/xen/common/rcupdate.c b/xen/common/rcupdate.c index dfd0daf..9a708ef 100644 --- a/xen/common/rcupdate.c +++ b/xen/common/rcupdate.c @@ -118,6 +118,7 @@ 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 = IDLE_TIMER_PERIOD_DEFAULT; static int parse_idle_timer_period(const char *s) @@ -140,6 +141,17 @@ static int parse_idle_timer_period(const char *s) } custom_param("rcu_idle_timer_period_ms", parse_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; @@ -495,8 +507,18 @@ 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_t(s_time_t, IDLE_TIMER_PERIOD_MAX, + idle_timer_period + IDLE_TIMER_PERIOD_INCR); + } + else + { + idle_timer_period = max_t(s_time_t, IDLE_TIMER_PERIOD_MIN, + idle_timer_period - IDLE_TIMER_PERIOD_DECR); + } } void rcu_check_callbacks(int cpu) _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |