[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] NUMA: Fix computation of needed nodes
Hi, as Jan Beulich pointed out: 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.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_nodeSimply 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=). 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |