Hi,
as Jan Beulich pointed out:
I'm afraid this change isn't really correct:
+ cores_per_node = info['nr_cpus'] / info['nr_nodes']
+ nodes_required = (self.info['VCPUs_max'] + cores_per_node - 1)
/ cores_per_node
Simply using cores_per_node (as calculated here) as a divisor is bound
to cause division-by-zero issues, namely when limiting the number of
CPUs on the Xen command line (maxcpus=).
Actually Jan's proposed method of getting additional nodes is more
elegant, so I implemented: enumerating the best nodes and adding CPU
affinity until all VCPUs can be backed by at least on physical core.
This should fix problems with asymmetric NUMA configurations and cropped
number of CPUs in Xen.
Regards,
Andre.
Signed-off-by: Andre Przywara <andre.przywara@xxxxxxx>
--
Andre Przywara
AMD-Operating System Research Center (OSRC), Dresden, Germany
Tel: +49 351 488-3567-12
----to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Karl-Hammerschmidt-Str. 34, 85609 Dornach b. Muenchen
Geschaeftsfuehrer: Andrew Bowd; Thomas M. McCoy; Giuliano Meroni
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632
diff -r 13d4e78ede97 tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py Wed Jan 13 08:33:34 2010 +0000
+++ b/tools/python/xen/xend/XendDomainInfo.py Wed Jan 13 22:55:56 2010 +0100
@@ -2724,13 +2724,12 @@
candidate_node_list.append(i)
best_node = find_relaxed_node(candidate_node_list)[0]
cpumask = info['node_to_cpu'][best_node]
- cores_per_node = info['nr_cpus'] / info['nr_nodes']
- nodes_required = (self.info['VCPUs_max'] + cores_per_node - 1)
/ cores_per_node
- if nodes_required > 1:
- log.debug("allocating %d NUMA nodes", nodes_required)
- best_nodes = find_relaxed_node(filter(lambda x: x !=
best_node, range(0,info['nr_nodes'])))
- for i in best_nodes[:nodes_required - 1]:
- cpumask = cpumask + info['node_to_cpu'][i]
+ best_nodes = find_relaxed_node(filter(lambda x: x !=
best_node, range(0,info['nr_nodes'])))
+ for node_idx in best_nodes:
+ if len(cpumask) >= self.info['VCPUs_max']:
+ break
+ cpumask = cpumask + info['node_to_cpu'][node_idx]
+ log.debug("allocating additional NUMA node %d", node_idx)
for v in range(0, self.info['VCPUs_max']):
xc.vcpu_setaffinity(self.domid, v, cpumask)
return index
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|