[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH 5/6] xen, tools: add nr_cpus field to fix nr_cpus calc



This patch adds a new field, nr_cpus, to the physinfo hcall and removes
code which used to calculate this number.  On some systems, for
instance, an opteron 2-way, the sockets-per-node calculation is bogus.
Rather than trying to calculate this number, just add a nr_cpus field
based on num_online_cpus().  This patch touches ia64 and ppc physinfo to
add the nr_cpus field, but it has only been tested on x86.

-- 
Ryan Harper
Software Engineer; Linux Technology Center
IBM Corp., Austin, Tx
(512) 838-9253   T/L: 678-9253
ryanh@xxxxxxxxxx


diffstat output:
 tools/python/xen/lowlevel/xc/xc.c      |   11 ++++-------
 tools/python/xen/xend/XendNode.py      |    4 ----
 tools/xenmon/xenbaked.c                |    5 +----
 tools/xenstat/libxenstat/src/xenstat.c |    4 +---
 tools/xentrace/xentrace.c              |    5 +----
 xen/arch/ia64/xen/dom0_ops.c           |    1 +
 xen/arch/powerpc/sysctl.c              |    1 +
 xen/arch/x86/sysctl.c                  |    1 +
 xen/include/public/sysctl.h            |    1 +
 9 files changed, 11 insertions(+), 22 deletions(-)

Signed-off-by: Ryan Harper <ryanh@xxxxxxxxxx>
---
Add nr_cpus field to physinfo; remove calculation

diff -r 3afd2fd370b6 tools/python/xen/lowlevel/xc/xc.c
--- a/tools/python/xen/lowlevel/xc/xc.c Wed Oct 18 16:30:30 2006 -0500
+++ b/tools/python/xen/lowlevel/xc/xc.c Wed Oct 18 16:31:18 2006 -0500
@@ -474,7 +474,7 @@ static PyObject *pyxc_physinfo(XcObject 
 {
     xc_physinfo_t info;
     char cpu_cap[128], *p=cpu_cap, *q=cpu_cap;
-    int i,j, nr_cpus;
+    int i,j;
     PyObject *ret_obj, *memchunk_obj, *node_to_cpu_obj;
     xc_memory_chunk_t *chunks;
     xc_cpu_to_node_t  *map;
@@ -491,10 +491,6 @@ static PyObject *pyxc_physinfo(XcObject 
 
     if ( xc_physinfo(self->xc_handle, &info) != 0 )
         return PyErr_SetFromErrno(xc_error);
-
-    /* calc number of cpus, ignore nr_nodes since sockets_per node is bogus */
-    nr_cpus = info.threads_per_core * info.cores_per_socket *
-       info.sockets_per_node;
 
     *q=0;
     for(i=0;i<sizeof(info.hw_cap)/4;i++)
@@ -506,10 +502,11 @@ static PyObject *pyxc_physinfo(XcObject 
     if(q>cpu_cap)
         *(q-1)=0;
 
-    ret_obj = Py_BuildValue("{s:i,s:i,s:i,s:l,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: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_kib(info.total_pages),
                             "free_memory",      pages_to_kib(info.free_pages),
                             "scrub_memory",     pages_to_kib(info.scrub_pages),
@@ -540,7 +537,7 @@ static PyObject *pyxc_physinfo(XcObject 
  
         /* walk the cpu_to_node array, for each cpu
            which maps to node i, add to cpus list */
-        for ( j=0; j<nr_cpus; j++)
+        for ( j=0; j<info.nr_cpus; j++)
         {
             /* this cpu j maps to node i */
             if ( i == (uint32_t)map[j])
diff -r 3afd2fd370b6 tools/python/xen/xend/XendNode.py
--- a/tools/python/xen/xend/XendNode.py Wed Oct 18 16:30:30 2006 -0500
+++ b/tools/python/xen/xend/XendNode.py Wed Oct 18 16:30:33 2006 -0500
@@ -117,10 +117,6 @@ class XendNode:
     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
         # physinfo is in KiB
         info['total_memory'] = info['total_memory'] / 1024
diff -r 3afd2fd370b6 tools/xenmon/xenbaked.c
--- a/tools/xenmon/xenbaked.c   Wed Oct 18 16:30:30 2006 -0500
+++ b/tools/xenmon/xenbaked.c   Wed Oct 18 16:30:33 2006 -0500
@@ -462,10 +462,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 3afd2fd370b6 tools/xenstat/libxenstat/src/xenstat.c
--- a/tools/xenstat/libxenstat/src/xenstat.c    Wed Oct 18 16:30:30 2006 -0500
+++ b/tools/xenstat/libxenstat/src/xenstat.c    Wed Oct 18 16:30:33 2006 -0500
@@ -233,9 +233,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 3afd2fd370b6 tools/xentrace/xentrace.c
--- a/tools/xentrace/xentrace.c Wed Oct 18 16:30:30 2006 -0500
+++ b/tools/xentrace/xentrace.c Wed Oct 18 16:30:33 2006 -0500
@@ -272,10 +272,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 3afd2fd370b6 xen/arch/ia64/xen/dom0_ops.c
--- a/xen/arch/ia64/xen/dom0_ops.c      Wed Oct 18 16:30:30 2006 -0500
+++ b/xen/arch/ia64/xen/dom0_ops.c      Wed Oct 18 16:30:33 2006 -0500
@@ -198,6 +198,7 @@ long arch_do_sysctl(xen_sysctl_t *op, XE
             cpus_weight(cpu_core_map[0]) / pi->threads_per_core;
         pi->sockets_per_node = 
             num_online_cpus() / cpus_weight(cpu_core_map[0]);
+        pi->nr_cpus          = (u32)num_online_cpus();
         pi->nr_nodes         = 1;
         pi->total_pages      = total_pages; 
         pi->free_pages       = avail_domheap_pages();
diff -r 3afd2fd370b6 xen/arch/powerpc/sysctl.c
--- a/xen/arch/powerpc/sysctl.c Wed Oct 18 16:30:30 2006 -0500
+++ b/xen/arch/powerpc/sysctl.c Wed Oct 18 16:30:33 2006 -0500
@@ -44,6 +44,7 @@ long arch_do_sysctl(struct xen_sysctl *s
         pi->threads_per_core = 1;
         pi->cores_per_socket = 1;
         pi->sockets_per_node = 1;
+        pi->nr_cpus          = (u32)num_online_cpus();
         pi->nr_nodes         = 1;
         pi->total_pages      = total_pages;
         pi->free_pages       = avail_domheap_pages();
diff -r 3afd2fd370b6 xen/arch/x86/sysctl.c
--- a/xen/arch/x86/sysctl.c     Wed Oct 18 16:30:30 2006 -0500
+++ b/xen/arch/x86/sysctl.c     Wed Oct 18 16:30:33 2006 -0500
@@ -52,6 +52,7 @@ long arch_do_sysctl(
         pi->sockets_per_node = 
             num_online_cpus() / cpus_weight(cpu_core_map[0]);
 
+        pi->nr_cpus          = (u32)num_online_cpus();
         pi->total_pages      = total_pages;
         pi->free_pages       = avail_domheap_pages();
         pi->scrub_pages      = avail_scrub_pages();
diff -r 3afd2fd370b6 xen/include/public/sysctl.h
--- a/xen/include/public/sysctl.h       Wed Oct 18 16:30:30 2006 -0500
+++ b/xen/include/public/sysctl.h       Wed Oct 18 16:30:33 2006 -0500
@@ -62,6 +62,7 @@ struct xen_sysctl_physinfo {
     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_t total_pages;

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.