mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
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@intel.com>
This commit is contained in:
1 parent
b97d94b4ef
commit
e4434634c4
1 file changed
+20
-2
@@ -228,6 +228,11 @@ static void burn_credits(struct csched_vcpu *svc, s_time_t now)
|
||||
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 csched_vcpu *new)
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||