diff --git a/xen/common/schedule.c b/xen/common/schedule.c index 8bea9a203e..343ab6306e 100644 --- a/xen/common/schedule.c +++ b/xen/common/schedule.c @@ -869,6 +869,11 @@ void sched_set_affinity( cpumask_copy(v->cpu_hard_affinity, hard); if ( soft ) cpumask_copy(v->cpu_soft_affinity, soft); + + v->soft_aff_effective = !cpumask_subset(v->cpu_hard_affinity, + v->cpu_soft_affinity) && + cpumask_intersects(v->cpu_soft_affinity, + v->cpu_hard_affinity); } static int vcpu_set_affinity( diff --git a/xen/include/xen/sched-if.h b/xen/include/xen/sched-if.h index 65b4538114..9596eae1e2 100644 --- a/xen/include/xen/sched-if.h +++ b/xen/include/xen/sched-if.h @@ -270,10 +270,9 @@ static inline cpumask_t* cpupool_domain_cpumask(struct domain *d) */ static inline int has_soft_affinity(const struct vcpu *v) { - return !cpumask_subset(cpupool_domain_cpumask(v->domain), - v->cpu_soft_affinity) && - !cpumask_subset(v->cpu_hard_affinity, v->cpu_soft_affinity) && - cpumask_intersects(v->cpu_soft_affinity, v->cpu_hard_affinity); + return v->soft_aff_effective && + !cpumask_subset(cpupool_domain_cpumask(v->domain), + v->cpu_soft_affinity); } /* diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h index cbd50e9867..3303fd9803 100644 --- a/xen/include/xen/sched.h +++ b/xen/include/xen/sched.h @@ -210,6 +210,9 @@ struct vcpu bool hcall_compat; #endif + /* Does soft affinity actually play a role (given hard affinity)? */ + bool soft_aff_effective; + /* The CPU, if any, which is holding onto this VCPU's state. */ #define VCPU_CPU_CLEAN (~0u) unsigned int dirty_cpu;