Ryan Harper
2005-Dec-16 23:13 UTC
[Xen-devel] [PATCH] 6/7 xen: Add basic NUMA support - Physinfo nr_cpus
This patch adds a new field to physinfo, nr_cpus, which previously has been calculated by the following formula: nr_cpus = nr_nodes * sockets_per_node * cores_per_socket * \ threads_per_core This formula makes an assumption about the symmetry of NUMA nodes. For instance, on my Dual Opteron, which is a two node system with one cpu in each node, sockets_per_node is calculated as 2, but this is incorrect. There isn''t a single value for sockets per node, but rather, it should be a list of values, which is generated by taking the Hamming weight of each node''s cpumask. In Xen, there aren''t a large number of uses for sockets_per_node other than calculating the number of cpus booted in the hypervisor. Instead of dealing with making another array in physinfo, I''ve opted to add nr_cpus which is based on num_online_cpus() and replaced all instances of the nr_cpus formula with a reference to the proper nr_cpus value that is now contained in the physinfo. -- Ryan Harper Software Engineer; Linux Technology Center IBM Corp., Austin, Tx (512) 838-9253 T/L: 678-9253 ryanh@us.ibm.com diffstat output: tools/python/xen/lowlevel/xc/xc.c | 3 ++- tools/python/xen/xend/XendNode.py | 4 ---- tools/xenmon/xenbaked.c | 5 +---- tools/xentrace/xentrace.c | 5 +---- xen/arch/ia64/xen/dom0_ops.c | 1 + xen/arch/x86/dom0_ops.c | 1 + xen/include/public/dom0_ops.h | 1 + 7 files changed, 7 insertions(+), 13 deletions(-) Signed-off-by: Ryan Harper <ryanh@us.ibm.com> Signed-off-by: Ryan Grimm <grimm@us.ibm.com> --- diff -r 398a0cdf3e31 -r f9779dd3e52b tools/python/xen/lowlevel/xc/xc.c --- a/tools/python/xen/lowlevel/xc/xc.c Fri Dec 16 17:02:16 2005 +++ b/tools/python/xen/lowlevel/xc/xc.c Fri Dec 16 17:47:48 2005 @@ -623,10 +623,11 @@ if(q>cpu_cap) *(q-1)=0; - ret_obj = Py_BuildValue("{s:i,s:i,s:i,s:l,s:l,s:i,s:s}", + ret_obj = Py_BuildValue("{s:i,s:i,s:i,s:i,s:l,s:l,s:i,s:s}", "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_mb(info.total_pages), "free_memory", pages_to_mb(info.free_pages), "cpu_khz", info.cpu_khz, diff -r 398a0cdf3e31 -r f9779dd3e52b tools/python/xen/xend/XendNode.py --- a/tools/python/xen/xend/XendNode.py Fri Dec 16 17:02:16 2005 +++ b/tools/python/xen/xend/XendNode.py Fri Dec 16 17:47:48 2005 @@ -122,10 +122,6 @@ def physinfo(self): info = self.xc.physinfo() - info[''nr_cpus''] = (info[''nr_nodes''] * - info[''sockets_per_node''] * - info[''cores_per_socket''] * - info[''threads_per_core'']) info[''cpu_mhz''] = info[''cpu_khz''] / 1000 info[''mem_chunks''] = self.format_memchunks(info) info[''node_to_cpu''] = self.format_node_to_cpu(info) diff -r 398a0cdf3e31 -r f9779dd3e52b tools/xenmon/xenbaked.c --- a/tools/xenmon/xenbaked.c Fri Dec 16 17:02:16 2005 +++ b/tools/xenmon/xenbaked.c Fri Dec 16 17:47:48 2005 @@ -399,10 +399,7 @@ xc_interface_close(xc_handle); opts.cpu_freq = (double)op.u.physinfo.cpu_khz/1000.0; - return (op.u.physinfo.threads_per_core * - op.u.physinfo.cores_per_socket * - op.u.physinfo.sockets_per_node * - op.u.physinfo.nr_nodes); + return op.u.physinfo.nr_cpus; } diff -r 398a0cdf3e31 -r f9779dd3e52b tools/xentrace/xentrace.c --- a/tools/xentrace/xentrace.c Fri Dec 16 17:02:16 2005 +++ b/tools/xentrace/xentrace.c Fri Dec 16 17:47:48 2005 @@ -277,10 +277,7 @@ xc_interface_close(xc_handle); - return (op.u.physinfo.threads_per_core * - op.u.physinfo.cores_per_socket * - op.u.physinfo.sockets_per_node * - op.u.physinfo.nr_nodes); + return op.u.physinfo.nr_cpus; } diff -r 398a0cdf3e31 -r f9779dd3e52b xen/arch/ia64/xen/dom0_ops.c --- a/xen/arch/ia64/xen/dom0_ops.c Fri Dec 16 17:02:16 2005 +++ b/xen/arch/ia64/xen/dom0_ops.c Fri Dec 16 17:47:48 2005 @@ -204,6 +204,7 @@ pi->sockets_per_node = num_online_cpus() / (pi->threads_per_core * pi->cores_per_socket); pi->nr_nodes = 1; + pi->nr_cpus = (u32)num_online_cpus(); pi->total_pages = 99; // FIXME pi->free_pages = avail_domheap_pages(); pi->cpu_khz = 100; // FIXME cpu_khz; diff -r 398a0cdf3e31 -r f9779dd3e52b xen/arch/x86/dom0_ops.c --- a/xen/arch/x86/dom0_ops.c Fri Dec 16 17:02:16 2005 +++ b/xen/arch/x86/dom0_ops.c Fri Dec 16 17:47:48 2005 @@ -188,6 +188,7 @@ pi->cores_per_socket = boot_cpu_data.x86_num_cores; pi->sockets_per_node = num_online_cpus() / (pi->threads_per_core * pi->cores_per_socket); + pi->nr_cpus = (u32)num_online_cpus(); pi->total_pages = total_pages; pi->free_pages = avail_domheap_pages(); pi->cpu_khz = cpu_khz; diff -r 398a0cdf3e31 -r f9779dd3e52b xen/include/public/dom0_ops.h --- a/xen/include/public/dom0_ops.h Fri Dec 16 17:02:16 2005 +++ b/xen/include/public/dom0_ops.h Fri Dec 16 17:47:48 2005 @@ -200,6 +200,7 @@ uint32_t cores_per_socket; uint32_t sockets_per_node; uint32_t nr_nodes; + uint32_t nr_cpus; uint32_t cpu_khz; unsigned long total_pages; unsigned long free_pages; _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel