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 | 3 ++-
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, 9 insertions(+), 16 deletions(-)
Signed-off-by: Ryan Harper <ryanh@xxxxxxxxxx>
---
Add nr_cpus field to physinfo; remove calculation
diff -r 4658569b4e00 tools/python/xen/lowlevel/xc/xc.c
--- a/tools/python/xen/lowlevel/xc/xc.c Tue Sep 26 16:12:14 2006 -0500
+++ b/tools/python/xen/lowlevel/xc/xc.c Wed Sep 27 14:51:34 2006 -0500
@@ -502,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),
diff -r 4658569b4e00 tools/python/xen/xend/XendNode.py
--- a/tools/python/xen/xend/XendNode.py Tue Sep 26 16:12:14 2006 -0500
+++ b/tools/python/xen/xend/XendNode.py Wed Sep 27 14:51:34 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 4658569b4e00 tools/xenmon/xenbaked.c
--- a/tools/xenmon/xenbaked.c Tue Sep 26 16:12:14 2006 -0500
+++ b/tools/xenmon/xenbaked.c Wed Sep 27 14:51:34 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 4658569b4e00 tools/xenstat/libxenstat/src/xenstat.c
--- a/tools/xenstat/libxenstat/src/xenstat.c Tue Sep 26 16:12:14 2006 -0500
+++ b/tools/xenstat/libxenstat/src/xenstat.c Wed Sep 27 14:51:34 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 4658569b4e00 tools/xentrace/xentrace.c
--- a/tools/xentrace/xentrace.c Tue Sep 26 16:12:14 2006 -0500
+++ b/tools/xentrace/xentrace.c Wed Sep 27 14:51:34 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 4658569b4e00 xen/arch/ia64/xen/dom0_ops.c
--- a/xen/arch/ia64/xen/dom0_ops.c Tue Sep 26 16:12:14 2006 -0500
+++ b/xen/arch/ia64/xen/dom0_ops.c Wed Sep 27 14:51:34 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 4658569b4e00 xen/arch/x86/sysctl.c
--- a/xen/arch/x86/sysctl.c Tue Sep 26 16:12:14 2006 -0500
+++ b/xen/arch/x86/sysctl.c Wed Sep 27 14:51:34 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 4658569b4e00 xen/include/public/sysctl.h
--- a/xen/include/public/sysctl.h Tue Sep 26 16:12:14 2006 -0500
+++ b/xen/include/public/sysctl.h Wed Sep 27 14:51:34 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;
diff -r 4658569b4e00 xen/arch/powerpc/sysctl.c
--- a/xen/arch/powerpc/sysctl.c Tue Sep 26 16:12:14 2006 -0500
+++ b/xen/arch/powerpc/sysctl.c Wed Sep 27 14:51:58 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();
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|