[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 08/16] xen: derive NUMA node affinity from hard and soft CPU affinity
if a domain's NUMA node-affinity (which is what controls memory allocations) is provided by the user/toolstack, it just is not touched. However, if the user does not say anything, leaving it all to Xen, let's compute it in the following way: 1. cpupool's cpus & hard-affinity & soft-affinity 2. if (1) is empty: cpupool's cpus & hard-affinity This guarantees memory to be allocated from the narrowest possible set of NUMA nodes, ad makes it relatively easy to set up NUMA-aware scheduling on top of soft affinity. Signed-off-by: Dario Faggioli <dario.faggioli@xxxxxxxxxx> --- xen/common/domain.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/xen/common/domain.c b/xen/common/domain.c index 2916490..4b8fca8 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -353,7 +353,7 @@ struct domain *domain_create( void domain_update_node_affinity(struct domain *d) { - cpumask_var_t cpumask; + cpumask_var_t cpumask, cpumask_soft; cpumask_var_t online_affinity; const cpumask_t *online; struct vcpu *v; @@ -361,9 +361,15 @@ void domain_update_node_affinity(struct domain *d) if ( !zalloc_cpumask_var(&cpumask) ) return; + if ( !zalloc_cpumask_var(&cpumask_soft) ) + { + free_cpumask_var(cpumask); + return; + } if ( !alloc_cpumask_var(&online_affinity) ) { free_cpumask_var(cpumask); + free_cpumask_var(cpumask_soft); return; } @@ -373,8 +379,12 @@ void domain_update_node_affinity(struct domain *d) for_each_vcpu ( d, v ) { + /* Build up the mask of online pcpus we have hard affinity with */ cpumask_and(online_affinity, v->cpu_hard_affinity, online); cpumask_or(cpumask, cpumask, online_affinity); + + /* As well as the mask of all pcpus we have soft affinity with */ + cpumask_or(cpumask_soft, cpumask_soft, v->cpu_soft_affinity); } /* @@ -386,6 +396,15 @@ void domain_update_node_affinity(struct domain *d) */ if ( d->auto_node_affinity ) { + /* + * We're looking for the narower possible set of nodes. So, if + * possible (i.e., if not empty!) let's use the intersection + * between online, hard and soft affinity. If not, just fall back + * to online & hard affinity. + */ + if ( cpumask_intersects(cpumask, cpumask_soft) ) + cpumask_and(cpumask, cpumask, cpumask_soft); + nodes_clear(d->node_affinity); for_each_online_node ( node ) if ( cpumask_intersects(&node_to_cpumask(node), cpumask) ) @@ -397,6 +416,7 @@ void domain_update_node_affinity(struct domain *d) spin_unlock(&d->node_affinity_lock); free_cpumask_var(online_affinity); + free_cpumask_var(cpumask_soft); free_cpumask_var(cpumask); } _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |