[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-ia64-devel] Re: [Xen-devel] [PATCH] nr_cpus calculation problem due to incorrect sockets_per_node
No changes are allowed to the tools interfaces within a stable release series. It'll be in 3.2.0 in a few weeks time. -- Keir On 29/10/07 15:37, "beth kon" <eak@xxxxxxxxxx> wrote: > Hi. Wondering if this patch has been reviewed and could be considered > for inclusion in 3.2. Sorry about the late request. You were asking for > input last week. > > beth kon wrote: > >> Testing on an 8-node 128-way NUMA machine has exposed a problem with >> Xen's nr_cpus calculation. In this case, since Xen cuts off recognized >> CPUs at 32, the machine appears to have 16 CPUs on the first and >> second nodes and none on the remaining nodes. Given this asymmetry, >> the calculation of sockets_per_node (which is later used to calculate >> nr_cpus) is incorrect: >> >> pi->sockets_per_node = num_online_cpus() /(num_online_nodes() * >> pi->cores_per_socket * pi->threads_per_core); >> >> The most straightforward solution is to remove sockets_per_node, and >> instead determine nr_cpus directly from num_online_cpus. >> >> This patch has been tested on x86_64 NUMA machines. >> >> ------------------------------------------------------------------------ >> >> diff -r b4278beaf354 docs/man/xm.pod.1 >> --- a/docs/man/xm.pod.1 Wed Oct 17 13:12:03 2007 +0100 >> +++ b/docs/man/xm.pod.1 Wed Oct 17 20:09:46 2007 -0700 >> @@ -446,7 +446,6 @@ page more readable): >> machine : i686 >> nr_cpus : 2 >> nr_nodes : 1 >> - sockets_per_node : 2 >> cores_per_socket : 1 >> threads_per_core : 1 >> cpu_mhz : 696 >> diff -r b4278beaf354 tools/python/xen/lowlevel/xc/xc.c >> --- a/tools/python/xen/lowlevel/xc/xc.c Wed Oct 17 13:12:03 2007 +0100 >> +++ b/tools/python/xen/lowlevel/xc/xc.c Wed Oct 17 20:09:46 2007 -0700 >> @@ -721,7 +721,7 @@ static PyObject *pyxc_physinfo(XcObject >> "max_cpu_id", info.max_cpu_id, >> "threads_per_core", info.threads_per_core, >> "cores_per_socket", info.cores_per_socket, >> - "sockets_per_node", info.sockets_per_node, >> + "nr_cpus", info.nr_cpus, >> "total_memory", >> pages_to_kib(info.total_pages), >> "free_memory", >> pages_to_kib(info.free_pages), >> "scrub_memory", >> pages_to_kib(info.scrub_pages), >> diff -r b4278beaf354 tools/python/xen/xend/XendNode.py >> --- a/tools/python/xen/xend/XendNode.py Wed Oct 17 13:12:03 2007 +0100 >> +++ b/tools/python/xen/xend/XendNode.py Wed Oct 17 20:09:46 2007 -0700 >> @@ -475,7 +475,7 @@ class XendNode: >> >> cpu_info = { >> "nr_nodes": phys_info["nr_nodes"], >> - "sockets_per_node": phys_info["sockets_per_node"], >> + "nr_cpus": phys_info["nr_cpus"], >> "cores_per_socket": phys_info["cores_per_socket"], >> "threads_per_core": phys_info["threads_per_core"] >> } >> @@ -580,17 +580,9 @@ class XendNode: >> str='none\n' >> return str[:-1]; >> >> - def count_cpus(self, pinfo): >> - count=0 >> - node_to_cpu=pinfo['node_to_cpu'] >> - for i in range(0, pinfo['nr_nodes']): >> - count+=len(node_to_cpu[i]) >> - return count; >> - >> def physinfo(self): >> info = self.xc.physinfo() >> >> - info['nr_cpus'] = self.count_cpus(info) >> info['cpu_mhz'] = info['cpu_khz'] / 1000 >> >> # physinfo is in KiB, need it in MiB >> @@ -600,7 +592,6 @@ class XendNode: >> >> ITEM_ORDER = ['nr_cpus', >> 'nr_nodes', >> - 'sockets_per_node', >> 'cores_per_socket', >> 'threads_per_core', >> 'cpu_mhz', >> diff -r b4278beaf354 tools/python/xen/xm/main.py >> --- a/tools/python/xen/xm/main.py Wed Oct 17 13:12:03 2007 +0100 >> +++ b/tools/python/xen/xm/main.py Wed Oct 17 20:09:46 2007 -0700 >> @@ -1667,9 +1667,8 @@ def xm_info(args): >> "release": getVal(["software_version", "release"]), >> "version": getVal(["software_version", "version"]), >> "machine": getVal(["software_version", "machine"]), >> - "nr_cpus": len(getVal(["host_CPUs"], [])), >> + "nr_cpus": getVal(["cpu_configuration", "nr_cpus"]), >> "nr_nodes": getVal(["cpu_configuration", "nr_nodes"]), >> - "sockets_per_node": getVal(["cpu_configuration", >> "sockets_per_node"]), >> "cores_per_socket": getVal(["cpu_configuration", >> "cores_per_socket"]), >> "threads_per_core": getVal(["cpu_configuration", >> "threads_per_core"]), >> "cpu_mhz": getCpuMhz(), >> diff -r b4278beaf354 tools/xenmon/xenbaked.c >> --- a/tools/xenmon/xenbaked.c Wed Oct 17 13:12:03 2007 +0100 >> +++ b/tools/xenmon/xenbaked.c Wed Oct 17 20:09:46 2007 -0700 >> @@ -460,10 +460,7 @@ unsigned int get_num_cpus(void) >> xc_interface_close(xc_handle); >> opts.cpu_freq = (double)physinfo.cpu_khz/1000.0; >> >> - return (physinfo.threads_per_core * >> - physinfo.cores_per_socket * >> - physinfo.sockets_per_node * >> - physinfo.nr_nodes); >> + return physinfo.nr_cpus; >> } >> >> >> diff -r b4278beaf354 tools/xenstat/libxenstat/src/xenstat.c >> --- a/tools/xenstat/libxenstat/src/xenstat.c Wed Oct 17 13:12:03 2007 +0100 >> +++ b/tools/xenstat/libxenstat/src/xenstat.c Wed Oct 17 20:09:46 2007 -0700 >> @@ -155,9 +155,7 @@ xenstat_node *xenstat_get_node(xenstat_h >> } >> >> node->cpu_hz = ((unsigned long long)physinfo.cpu_khz) * 1000ULL; >> - node->num_cpus = >> - (physinfo.threads_per_core * physinfo.cores_per_socket * >> - physinfo.sockets_per_node * physinfo.nr_nodes); >> + node->num_cpus = physinfo.nr_cpus; >> node->tot_mem = ((unsigned long long)physinfo.total_pages) >> * handle->page_size; >> node->free_mem = ((unsigned long long)physinfo.free_pages) >> diff -r b4278beaf354 tools/xentrace/xentrace.c >> --- a/tools/xentrace/xentrace.c Wed Oct 17 13:12:03 2007 +0100 >> +++ b/tools/xentrace/xentrace.c Wed Oct 17 20:09:46 2007 -0700 >> @@ -309,10 +309,7 @@ unsigned int get_num_cpus(void) >> >> xc_interface_close(xc_handle); >> >> - return (physinfo.threads_per_core * >> - physinfo.cores_per_socket * >> - physinfo.sockets_per_node * >> - physinfo.nr_nodes); >> + return physinfo.nr_cpus; >> } >> >> >> diff -r b4278beaf354 tools/xm-test/lib/XmTestLib/Xm.py >> --- a/tools/xm-test/lib/XmTestLib/Xm.py Wed Oct 17 13:12:03 2007 +0100 >> +++ b/tools/xm-test/lib/XmTestLib/Xm.py Wed Oct 17 20:09:46 2007 -0700 >> @@ -218,11 +218,9 @@ def restartXend(): >> return status >> >> def smpConcurrencyLevel(): >> - cores = int(getInfo("cores_per_socket")) >> - threads = int(getInfo("threads_per_core")) >> - sockets = int(getInfo("sockets_per_node")) >> - >> - return cores * sockets * threads >> + nr_cpus = int(getInfo("nr_cpus")) >> + >> + return nr_cpus >> >> if __name__ == "__main__": >> if isDomainRunning("0"): >> diff -r b4278beaf354 tools/xm-test/lib/XmTestReport/OSReport.py >> --- a/tools/xm-test/lib/XmTestReport/OSReport.py Wed Oct 17 13:12:03 2007 >> +0100 >> +++ b/tools/xm-test/lib/XmTestReport/OSReport.py Wed Oct 17 20:09:46 2007 >> -0700 >> @@ -92,7 +92,6 @@ class Machine: >> >> xenValues = {"nr_cpus" : "Unknown", >> "nr_nodes" : "Unknown", >> - "sockets_per_node" : "Unknown", >> "cores_per_socket" : "Unknown", >> "threads_per_core" : "Unknown", >> "cpu_mhz" : "Unknown", >> diff -r b4278beaf354 xen/arch/ia64/xen/dom0_ops.c >> --- a/xen/arch/ia64/xen/dom0_ops.c Wed Oct 17 13:12:03 2007 +0100 >> +++ b/xen/arch/ia64/xen/dom0_ops.c Wed Oct 17 20:09:46 2007 -0700 >> @@ -234,7 +234,7 @@ long arch_do_sysctl(xen_sysctl_t *op, XE >> { >> case XEN_SYSCTL_physinfo: >> { >> - int i, node_cpus = 0; >> + int i; >> uint32_t max_array_ent; >> >> xen_sysctl_physinfo_t *pi = &op->u.physinfo; >> @@ -242,18 +242,8 @@ long arch_do_sysctl(xen_sysctl_t *op, XE >> pi->threads_per_core = cpus_weight(cpu_sibling_map[0]); >> pi->cores_per_socket = >> cpus_weight(cpu_core_map[0]) / pi->threads_per_core; >> + pi->nr_cpus = (u32)num_online_cpus(); >> pi->nr_nodes = num_online_nodes(); >> - >> - /* >> - * Guess at a sockets_per_node value. Use the maximum number of >> - * CPUs per node to avoid deconfigured CPUs breaking the average. >> - */ >> - for_each_online_node(i) >> - node_cpus = max(node_cpus, cpus_weight(node_to_cpumask(i))); >> - >> - pi->sockets_per_node = node_cpus / >> - (pi->cores_per_socket * pi->threads_per_core); >> - >> pi->total_pages = total_pages; >> pi->free_pages = avail_domheap_pages(); >> pi->scrub_pages = avail_scrub_pages(); >> diff -r b4278beaf354 xen/arch/powerpc/sysctl.c >> --- a/xen/arch/powerpc/sysctl.c Wed Oct 17 13:12:03 2007 +0100 >> +++ b/xen/arch/powerpc/sysctl.c Wed Oct 17 20:09:46 2007 -0700 >> @@ -45,9 +45,7 @@ long arch_do_sysctl(struct xen_sysctl *s >> cpus_weight(cpu_sibling_map[0]); >> pi->cores_per_socket = >> cpus_weight(cpu_core_map[0]) / pi->threads_per_core; >> - pi->sockets_per_node = num_online_cpus() / >> - (num_online_nodes() * pi->cores_per_socket * >> pi->threads_per_core); >> - >> + pi->nr_cpus = (u32)num_online_cpus(); >> pi->nr_nodes = num_online_nodes(); >> pi->total_pages = total_pages; >> pi->free_pages = avail_domheap_pages(); >> diff -r b4278beaf354 xen/arch/x86/sysctl.c >> --- a/xen/arch/x86/sysctl.c Wed Oct 17 13:12:03 2007 +0100 >> +++ b/xen/arch/x86/sysctl.c Wed Oct 17 20:09:46 2007 -0700 >> @@ -51,10 +51,8 @@ long arch_do_sysctl( >> cpus_weight(cpu_sibling_map[0]); >> pi->cores_per_socket = >> cpus_weight(cpu_core_map[0]) / pi->threads_per_core; >> + pi->nr_cpus = (u32)num_online_cpus(); >> pi->nr_nodes = num_online_nodes(); >> - pi->sockets_per_node = num_online_cpus() / >> - (pi->nr_nodes * pi->cores_per_socket * pi->threads_per_core); >> - >> pi->total_pages = total_pages; >> pi->free_pages = avail_domheap_pages(); >> pi->scrub_pages = avail_scrub_pages(); >> diff -r b4278beaf354 xen/include/public/sysctl.h >> --- a/xen/include/public/sysctl.h Wed Oct 17 13:12:03 2007 +0100 >> +++ b/xen/include/public/sysctl.h Wed Oct 17 20:09:46 2007 -0700 >> @@ -79,7 +79,7 @@ struct xen_sysctl_physinfo { >> /* IN variables. */ >> uint32_t threads_per_core; >> uint32_t cores_per_socket; >> - uint32_t sockets_per_node; >> + uint32_t nr_cpus; >> uint32_t nr_nodes; >> uint32_t cpu_khz; >> uint64_aligned_t total_pages; >> >> >> ------------------------------------------------------------------------ >> >> _______________________________________________ >> Xen-devel mailing list >> Xen-devel@xxxxxxxxxxxxxxxxxxx >> http://lists.xensource.com/xen-devel >> >> > _______________________________________________ Xen-ia64-devel mailing list Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-ia64-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |