# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1270533572 -3600
# Node ID a3f52abcd7da9efb7bd88ab829cb638ffb4e35ef
# Parent aef25086c71c0f640379741acbc251d37755f889
CSCHED: Optimize __runq_tickle to reduce IPIs
Limiting the number of idle cpus tickled for vcpu migration purpose
to ONLY ONE to get rid of a lot of IPI events which may impact the
average cpu idle residency time.
The default on option 'tickle_one_idle_cpu=0' can be used to disable
this optimization if needed.
Signed-off-by: Wei Gang <gang.wei@xxxxxxxxx>
---
xen/common/sched_credit.c | 22 ++++++++++++++++++++--
1 files changed, 20 insertions(+), 2 deletions(-)
diff -r aef25086c71c -r a3f52abcd7da xen/common/sched_credit.c
--- a/xen/common/sched_credit.c Tue Apr 06 06:56:20 2010 +0100
+++ b/xen/common/sched_credit.c Tue Apr 06 06:59:32 2010 +0100
@@ -228,6 +228,11 @@ static void burn_credits(struct csched_v
svc->start_time += (credits * MILLISECS(1)) / CSCHED_CREDITS_PER_MSEC;
}
+static int opt_tickle_one_idle __read_mostly = 1;
+boolean_param("tickle_one_idle_cpu", opt_tickle_one_idle);
+
+DEFINE_PER_CPU(unsigned int, last_tickle_cpu) = 0;
+
static inline void
__runq_tickle(unsigned int cpu, struct csched_vcpu *new)
{
@@ -265,8 +270,21 @@ __runq_tickle(unsigned int cpu, struct c
}
else
{
- CSCHED_STAT_CRANK(tickle_idlers_some);
- cpus_or(mask, mask, csched_priv.idlers);
+ cpumask_t idle_mask;
+
+ cpus_and(idle_mask, csched_priv.idlers, new->vcpu->cpu_affinity);
+ if ( !cpus_empty(idle_mask) )
+ {
+ CSCHED_STAT_CRANK(tickle_idlers_some);
+ if ( opt_tickle_one_idle )
+ {
+ this_cpu(last_tickle_cpu) =
+ cycle_cpu(this_cpu(last_tickle_cpu), idle_mask);
+ cpu_set(this_cpu(last_tickle_cpu), mask);
+ }
+ else
+ cpus_or(mask, mask, idle_mask);
+ }
cpus_and(mask, mask, new->vcpu->cpu_affinity);
}
}
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|