# HG changeset patch # User André Przywara # Date 1205504312 -3600 # Node ID 6ca722ad5208390ae9f671cac84238ed3ca42fdb # Parent f33328217eee1a66bf2a874ff1a42b62c21e42bc allow explicit numa node placement of guests diff -r f33328217eee -r 6ca722ad5208 tools/python/xen/xend/XendConfig.py --- a/tools/python/xen/xend/XendConfig.py Mon Mar 10 22:51:57 2008 +0000 +++ b/tools/python/xen/xend/XendConfig.py Fri Mar 14 15:18:32 2008 +0100 @@ -152,6 +152,7 @@ XENAPI_CFG_TYPES = { 'memory_dynamic_min': int, 'memory_dynamic_max': int, 'cpus': list, + 'numanodes': list, 'vcpus_params': dict, 'VCPUs_max': int, 'VCPUs_at_startup': int, @@ -329,6 +330,7 @@ class XendConfig(dict): 'on_xend_start': 'ignore', 'on_xend_stop': 'ignore', 'cpus': [], + 'numanodes': None, 'VCPUs_max': 1, 'VCPUs_live': 1, 'VCPUs_at_startup': 1, diff -r f33328217eee -r 6ca722ad5208 tools/python/xen/xend/XendDomainInfo.py --- a/tools/python/xen/xend/XendDomainInfo.py Mon Mar 10 22:51:57 2008 +0000 +++ b/tools/python/xen/xend/XendDomainInfo.py Fri Mar 14 15:18:32 2008 +0100 @@ -1969,34 +1969,38 @@ class XendDomainInfo: else: info = xc.physinfo() if info['nr_nodes'] > 1: + candidate_node_list = [] + if self.info['numanodes'] is None: + for i in range (0, info['nr_nodes']): + candidate_node_list.append(i) + else: + for node in self.info['numanodes']: + if node < info['nr_nodes']: + candidate_node_list.append (node) node_memory_list = info['node_to_memory'] needmem = self.image.getRequiredAvailableMemory(self.info['memory_dynamic_max']) / 1024 - candidate_node_list = [] - for i in range(0, info['nr_nodes']): - if node_memory_list[i] >= needmem: - candidate_node_list.append(i) - if candidate_node_list is None or len(candidate_node_list) == 1: + for i in candidate_node_list: + if node_memory_list[i] < needmem: + candidate_node_list.remove (i) + if candidate_node_list is None or len(candidate_node_list) == 0: index = node_memory_list.index( max(node_memory_list) ) - cpumask = info['node_to_cpu'][index] + elif len(candidate_node_list) == 1: + index = candidate_node_list[0] else: - nodeload = [0] - nodeload = nodeload * info['nr_nodes'] + nodeload = [0] * info['nr_nodes'] from xen.xend import XendDomain doms = XendDomain.instance().list('all') for dom in doms: cpuinfo = dom.getVCPUInfo() for vcpu in sxp.children(cpuinfo, 'vcpu'): - def vinfo(n, t): - return t(sxp.child_value(vcpu, n)) - cpumap = vinfo('cpumap', list) + cpumap = list(sxp.child_value(vcpu, 'cpumap')) for i in candidate_node_list: - node_cpumask = info['node_to_cpu'][i] - for j in node_cpumask: + for j in info['node_to_cpu'][candidate_node_list[i]]: if j in cpumap: nodeload[i] += 1 break - index = nodeload.index( min(nodeload) ) - cpumask = info['node_to_cpu'][index] + index = candidate_node_list[nodeload.index( min(nodeload) )] + cpumask = info['node_to_cpu'][index] for v in range(0, self.info['VCPUs_max']): xc.vcpu_setaffinity(self.domid, v, cpumask) diff -r f33328217eee -r 6ca722ad5208 tools/python/xen/xm/create.py --- a/tools/python/xen/xm/create.py Mon Mar 10 22:51:57 2008 +0000 +++ b/tools/python/xen/xm/create.py Fri Mar 14 15:18:32 2008 +0100 @@ -189,6 +189,10 @@ gopts.var('cpus', val='CPUS', gopts.var('cpus', val='CPUS', fn=set_value, default=None, use="CPUS to run the domain on.") + +gopts.var('numanodes', val='NUMANODES', + fn=set_value, default=[], + use="NUMA nodes to run the domain on.") gopts.var('rtc_timeoffset', val='RTC_TIMEOFFSET', fn=set_value, default="0", @@ -769,7 +773,7 @@ def make_config(vals): map(add_conf, ['name', 'memory', 'maxmem', 'shadow_memory', 'restart', 'on_poweroff', 'on_reboot', 'on_crash', 'vcpus', 'vcpu_avail', 'features', - 'on_xend_start', 'on_xend_stop', 'target']) + 'on_xend_start', 'on_xend_stop', 'target', 'numanodes']) if vals.uuid is not None: config.append(['uuid', vals.uuid])