[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] Topology-info sysctl cleanups.
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1271147934 -3600 # Node ID 2a4970daad74449a8f827ea649c9f3f35ecba2f4 # Parent d2d8805868f1ee2359d7f5be665af1dde610f1ee Topology-info sysctl cleanups. Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx> --- tools/libxc/xc_pm.c | 20 ---------- tools/libxc/xenctrl.h | 16 -------- tools/misc/xenpm.c | 52 +++++++++++++-------------- tools/python/xen/lowlevel/xc/xc.c | 48 +++++++++++++++++------- tools/python/xen/xend/XendNode.py | 18 ++++----- xen/arch/x86/sysctl.c | 73 +++++++++++--------------------------- xen/drivers/acpi/pmstat.c | 52 --------------------------- xen/include/public/sysctl.h | 25 +------------ 8 files changed, 93 insertions(+), 211 deletions(-) diff -r d2d8805868f1 -r 2a4970daad74 tools/libxc/xc_pm.c --- a/tools/libxc/xc_pm.c Tue Apr 13 08:37:16 2010 +0100 +++ b/tools/libxc/xc_pm.c Tue Apr 13 09:38:54 2010 +0100 @@ -326,26 +326,6 @@ int xc_get_cpufreq_avgfreq(int xc_handle return ret; } -int xc_get_cputopo(int xc_handle, struct xc_get_cputopo *info) -{ - int rc; - DECLARE_SYSCTL; - - sysctl.cmd = XEN_SYSCTL_pm_op; - sysctl.u.pm_op.cmd = XEN_SYSCTL_pm_op_get_cputopo; - sysctl.u.pm_op.cpuid = 0; - set_xen_guest_handle( sysctl.u.pm_op.u.get_topo.cpu_to_core, - info->cpu_to_core ); - set_xen_guest_handle( sysctl.u.pm_op.u.get_topo.cpu_to_socket, - info->cpu_to_socket ); - sysctl.u.pm_op.u.get_topo.max_cpus = info->max_cpus; - - rc = do_sysctl(xc_handle, &sysctl); - info->nr_cpus = sysctl.u.pm_op.u.get_topo.nr_cpus; - - return rc; -} - /* value: 0 - disable sched_smt_power_savings 1 - enable sched_smt_power_savings */ diff -r d2d8805868f1 -r 2a4970daad74 tools/libxc/xenctrl.h --- a/tools/libxc/xenctrl.h Tue Apr 13 08:37:16 2010 +0100 +++ b/tools/libxc/xenctrl.h Tue Apr 13 09:38:54 2010 +0100 @@ -1302,22 +1302,6 @@ int xc_set_cpufreq_para(int xc_handle, i int xc_set_cpufreq_para(int xc_handle, int cpuid, int ctrl_type, int ctrl_value); int xc_get_cpufreq_avgfreq(int xc_handle, int cpuid, int *avg_freq); - -struct xc_get_cputopo { - /* IN: maximum addressable entry in - * the caller-provided cpu_to_core/socket. - */ - uint32_t max_cpus; - uint32_t *cpu_to_core; - uint32_t *cpu_to_socket; - - /* OUT: number of cpus returned - * If OUT is greater than IN then the cpu_to_core/socket is truncated! - */ - uint32_t nr_cpus; -}; - -int xc_get_cputopo(int xc_handle, struct xc_get_cputopo *info); int xc_set_sched_opt_smt(int xc_handle, uint32_t value); int xc_set_vcpu_migration_delay(int xc_handle, uint32_t value); diff -r d2d8805868f1 -r 2a4970daad74 tools/misc/xenpm.c --- a/tools/misc/xenpm.c Tue Apr 13 08:37:16 2010 +0100 +++ b/tools/misc/xenpm.c Tue Apr 13 09:38:54 2010 +0100 @@ -842,32 +842,32 @@ void cpu_topology_func(int argc, char *a { uint32_t cpu_to_core[MAX_NR_CPU]; uint32_t cpu_to_socket[MAX_NR_CPU]; - struct xc_get_cputopo info; - int i, ret; - - info.cpu_to_core = cpu_to_core; - info.cpu_to_socket = cpu_to_socket; - info.max_cpus = MAX_NR_CPU; - ret = xc_get_cputopo(xc_fd, &info); - if (!ret) - { - printf("CPU\tcore\tsocket\n"); - for (i=0; i<info.nr_cpus; i++) - { - if ( info.cpu_to_core[i] != INVALID_TOPOLOGY_ID && - info.cpu_to_socket[i] != INVALID_TOPOLOGY_ID ) - { - printf("CPU%d\t %d\t %d\n", i, info.cpu_to_core[i], - info.cpu_to_socket[i]); - } - } - } - else - { - printf("Can not get Xen CPU topology!\n"); - } - - return ; + uint32_t cpu_to_node[MAX_NR_CPU]; + xc_topologyinfo_t info = { 0 }; + int i; + + set_xen_guest_handle(info.cpu_to_core, cpu_to_core); + set_xen_guest_handle(info.cpu_to_socket, cpu_to_socket); + set_xen_guest_handle(info.cpu_to_node, cpu_to_node); + info.max_cpu_index = MAX_NR_CPU-1; + + if ( xc_topologyinfo(xc_fd, &info) ) + { + printf("Can not get Xen CPU topology: %d\n", errno); + return; + } + + if ( info.max_cpu_index > (MAX_NR_CPU-1) ) + info.max_cpu_index = MAX_NR_CPU-1; + + printf("CPU\tcore\tsocket\tnode\n"); + for ( i = 0; i < info.max_cpu_index; i++ ) + { + if ( cpu_to_core[i] == INVALID_TOPOLOGY_ID ) + continue; + printf("CPU%d\t %d\t %d\t %d\n", + i, cpu_to_core[i], cpu_to_socket[i], cpu_to_node[i]); + } } void set_sched_smt_func(int argc, char *argv[]) diff -r d2d8805868f1 -r 2a4970daad74 tools/python/xen/lowlevel/xc/xc.c --- a/tools/python/xen/lowlevel/xc/xc.c Tue Apr 13 08:37:16 2010 +0100 +++ b/tools/python/xen/lowlevel/xc/xc.c Tue Apr 13 09:38:54 2010 +0100 @@ -1191,7 +1191,7 @@ static PyObject *pyxc_topologyinfo(XcObj static PyObject *pyxc_topologyinfo(XcObject *self) { #define MAX_CPU_INDEX 255 - xc_topologyinfo_t tinfo; + xc_topologyinfo_t tinfo = { 0 }; int i, max_cpu_index; PyObject *ret_obj; PyObject *cpu_to_core_obj, *cpu_to_socket_obj, *cpu_to_node_obj; @@ -1199,7 +1199,6 @@ static PyObject *pyxc_topologyinfo(XcObj xc_cpu_to_socket_t socketmap[MAX_CPU_INDEX + 1]; xc_cpu_to_node_t nodemap[MAX_CPU_INDEX + 1]; - set_xen_guest_handle(tinfo.cpu_to_core, coremap); set_xen_guest_handle(tinfo.cpu_to_socket, socketmap); set_xen_guest_handle(tinfo.cpu_to_node, nodemap); @@ -1218,19 +1217,38 @@ static PyObject *pyxc_topologyinfo(XcObj cpu_to_node_obj = PyList_New(0); for ( i = 0; i < max_cpu_index; i++ ) { - PyObject *pyint; - - pyint = PyInt_FromLong(coremap[i]); - PyList_Append(cpu_to_core_obj, pyint); - Py_DECREF(pyint); - - pyint = PyInt_FromLong(socketmap[i]); - PyList_Append(cpu_to_socket_obj, pyint); - Py_DECREF(pyint); - - pyint = PyInt_FromLong(nodemap[i]); - PyList_Append(cpu_to_node_obj, pyint); - Py_DECREF(pyint); + if ( coremap[i] == INVALID_TOPOLOGY_ID ) + { + PyList_Append(cpu_to_core_obj, Py_None); + } + else + { + PyObject *pyint = PyInt_FromLong(coremap[i]); + PyList_Append(cpu_to_core_obj, pyint); + Py_DECREF(pyint); + } + + if ( socketmap[i] == INVALID_TOPOLOGY_ID ) + { + PyList_Append(cpu_to_socket_obj, Py_None); + } + else + { + PyObject *pyint = PyInt_FromLong(socketmap[i]); + PyList_Append(cpu_to_socket_obj, pyint); + Py_DECREF(pyint); + } + + if ( nodemap[i] == INVALID_TOPOLOGY_ID ) + { + PyList_Append(cpu_to_node_obj, Py_None); + } + else + { + PyObject *pyint = PyInt_FromLong(nodemap[i]); + PyList_Append(cpu_to_node_obj, pyint); + Py_DECREF(pyint); + } } ret_obj = Py_BuildValue("{s:i}", "max_cpu_index", max_cpu_index); diff -r d2d8805868f1 -r 2a4970daad74 tools/python/xen/xend/XendNode.py --- a/tools/python/xen/xend/XendNode.py Tue Apr 13 08:37:16 2010 +0100 +++ b/tools/python/xen/xend/XendNode.py Tue Apr 13 09:38:54 2010 +0100 @@ -879,16 +879,16 @@ class XendNode: return self.format_pairs(self.list_to_rangepairs(list)) def format_cpu_to_core_socket_node(self, tinfo): - try: - nr_cpus=tinfo['max_cpu_index'] - str='\ncpu: core socket node\n' - for i in range(0, nr_cpus): + max_cpu_index=tinfo['max_cpu_index'] + str='\ncpu: core socket node\n' + for i in range(0, max_cpu_index+1): + try: str+='%3d:%8d %8d %8d\n' % (i, - tinfo['cpu_to_core'][i], - tinfo['cpu_to_socket'][i], - tinfo['cpu_to_node'][i]) - except: - str='none\n' + tinfo['cpu_to_core'][i], + tinfo['cpu_to_socket'][i], + tinfo['cpu_to_node'][i]) + except: + pass return str[:-1]; def format_numa_info(self, ninfo): diff -r d2d8805868f1 -r 2a4970daad74 xen/arch/x86/sysctl.c --- a/xen/arch/x86/sysctl.c Tue Apr 13 08:37:16 2010 +0100 +++ b/xen/arch/x86/sysctl.c Tue Apr 13 09:38:54 2010 +0100 @@ -80,64 +80,37 @@ long arch_do_sysctl( case XEN_SYSCTL_topologyinfo: { - uint32_t i, max_cpu_index; - XEN_GUEST_HANDLE_64(uint32) cpu_to_core_arr; - XEN_GUEST_HANDLE_64(uint32) cpu_to_socket_arr; - XEN_GUEST_HANDLE_64(uint32) cpu_to_node_arr; - + uint32_t i, max_cpu_index, last_online_cpu; xen_sysctl_topologyinfo_t *ti = &sysctl->u.topologyinfo; - max_cpu_index = ti->max_cpu_index; - cpu_to_core_arr = ti->cpu_to_core; - cpu_to_socket_arr = ti->cpu_to_socket; - cpu_to_node_arr = ti->cpu_to_node; - - memset(ti, 0, sizeof(*ti)); - ti->cpu_to_core = cpu_to_core_arr; - ti->cpu_to_socket = cpu_to_socket_arr; - ti->cpu_to_node = cpu_to_node_arr; - - max_cpu_index = min_t(uint32_t, max_cpu_index, num_online_cpus()); - ti->max_cpu_index = max_cpu_index; - - ret = 0; - - for ( i = 0; i < max_cpu_index; i++ ) - { - if ( !guest_handle_is_null(cpu_to_core_arr) ) + last_online_cpu = last_cpu(cpu_online_map); + max_cpu_index = min_t(uint32_t, ti->max_cpu_index, last_online_cpu); + ti->max_cpu_index = last_online_cpu; + + for ( i = 0; i <= max_cpu_index; i++ ) + { + if ( !guest_handle_is_null(ti->cpu_to_core) ) { uint32_t core = cpu_online(i) ? cpu_to_core(i) : ~0u; - if ( copy_to_guest_offset(cpu_to_core_arr, i, &core, 1) ) - { - ret = -EFAULT; - break; - } - } - if ( !guest_handle_is_null(cpu_to_socket_arr) ) + if ( copy_to_guest_offset(ti->cpu_to_core, i, &core, 1) ) + break; + } + if ( !guest_handle_is_null(ti->cpu_to_socket) ) { uint32_t socket = cpu_online(i) ? cpu_to_socket(i) : ~0u; - if ( copy_to_guest_offset(cpu_to_socket_arr, i, &socket, 1) ) - { - ret = -EFAULT; - break; - } - } - if ( !guest_handle_is_null(cpu_to_node_arr) ) + if ( copy_to_guest_offset(ti->cpu_to_socket, i, &socket, 1) ) + break; + } + if ( !guest_handle_is_null(ti->cpu_to_node) ) { uint32_t node = cpu_online(i) ? cpu_to_node(i) : ~0u; - if ( copy_to_guest_offset(cpu_to_node_arr, i, &node, 1) ) - { - ret = -EFAULT; - break; - } - } - } - - if (ret) - break; - - if ( copy_to_guest(u_sysctl, sysctl, 1) ) - ret = -EFAULT; + if ( copy_to_guest_offset(ti->cpu_to_node, i, &node, 1) ) + break; + } + } + + ret = ((i <= max_cpu_index) || copy_to_guest(u_sysctl, sysctl, 1)) + ? -EFAULT : 0; } break; diff -r d2d8805868f1 -r 2a4970daad74 xen/drivers/acpi/pmstat.c --- a/xen/drivers/acpi/pmstat.c Tue Apr 13 08:37:16 2010 +0100 +++ b/xen/drivers/acpi/pmstat.c Tue Apr 13 09:38:54 2010 +0100 @@ -419,52 +419,6 @@ static int get_cpufreq_avgfreq(struct xe return 0; } -static int get_cputopo (struct xen_sysctl_pm_op *op) -{ - uint32_t i, nr_cpus; - XEN_GUEST_HANDLE_64(uint32) cpu_to_core_arr; - XEN_GUEST_HANDLE_64(uint32) cpu_to_socket_arr; - int arr_size, ret=0; - - cpu_to_core_arr = op->u.get_topo.cpu_to_core; - cpu_to_socket_arr = op->u.get_topo.cpu_to_socket; - arr_size= min_t(uint32_t, op->u.get_topo.max_cpus, NR_CPUS); - - if ( guest_handle_is_null( cpu_to_core_arr ) || - guest_handle_is_null( cpu_to_socket_arr) ) - { - ret = -EINVAL; - goto out; - } - - nr_cpus = 0; - for ( i = 0; i < arr_size; i++ ) - { - uint32_t core, socket; - if ( cpu_online(i) ) - { - core = cpu_to_core(i); - socket = cpu_to_socket(i); - nr_cpus = i; - } - else - { - core = socket = INVALID_TOPOLOGY_ID; - } - - if ( copy_to_guest_offset(cpu_to_core_arr, i, &core, 1) || - copy_to_guest_offset(cpu_to_socket_arr, i, &socket, 1)) - { - ret = -EFAULT; - goto out; - } - } - - op->u.get_topo.nr_cpus = nr_cpus + 1; -out: - return ret; -} - int do_pm_op(struct xen_sysctl_pm_op *op) { int ret = 0; @@ -510,12 +464,6 @@ int do_pm_op(struct xen_sysctl_pm_op *op break; } - case XEN_SYSCTL_pm_op_get_cputopo: - { - ret = get_cputopo(op); - break; - } - case XEN_SYSCTL_pm_op_set_sched_opt_smt: { uint32_t saved_value; diff -r d2d8805868f1 -r 2a4970daad74 xen/include/public/sysctl.h --- a/xen/include/public/sysctl.h Tue Apr 13 08:37:16 2010 +0100 +++ b/xen/include/public/sysctl.h Tue Apr 13 09:38:54 2010 +0100 @@ -336,22 +336,6 @@ struct xen_set_cpufreq_para { uint32_t ctrl_value; }; -/* Get physical CPU topology information. */ -#define INVALID_TOPOLOGY_ID (~0U) -struct xen_get_cputopo { - /* IN: maximum addressable entry in - * the caller-provided cpu_to_core/socket. - */ - uint32_t max_cpus; - XEN_GUEST_HANDLE_64(uint32) cpu_to_core; - XEN_GUEST_HANDLE_64(uint32) cpu_to_socket; - - /* OUT: number of cpus returned - * If OUT is greater than IN then the cpu_to_core/socket is truncated! - */ - uint32_t nr_cpus; -}; - struct xen_sysctl_pm_op { #define PM_PARA_CATEGORY_MASK 0xf0 #define CPUFREQ_PARA 0x10 @@ -361,9 +345,6 @@ struct xen_sysctl_pm_op { #define SET_CPUFREQ_GOV (CPUFREQ_PARA | 0x02) #define SET_CPUFREQ_PARA (CPUFREQ_PARA | 0x03) #define GET_CPUFREQ_AVGFREQ (CPUFREQ_PARA | 0x04) - - /* get CPU topology */ - #define XEN_SYSCTL_pm_op_get_cputopo 0x20 /* set/reset scheduler power saving option */ #define XEN_SYSCTL_pm_op_set_sched_opt_smt 0x21 @@ -387,7 +368,6 @@ struct xen_sysctl_pm_op { struct xen_set_cpufreq_gov set_gov; struct xen_set_cpufreq_para set_para; uint64_aligned_t get_avgfreq; - struct xen_get_cputopo get_topo; uint32_t set_sched_opt_smt; uint32_t get_max_cstate; uint32_t set_max_cstate; @@ -477,8 +457,8 @@ DEFINE_XEN_GUEST_HANDLE(xen_sysctl_lockp DEFINE_XEN_GUEST_HANDLE(xen_sysctl_lockprof_op_t); #define XEN_SYSCTL_topologyinfo 16 +#define INVALID_TOPOLOGY_ID (~0U) struct xen_sysctl_topologyinfo { - /* * IN: maximum addressable entry in the caller-provided cpu_to_core, * cpu_to_socket & cpu_to_node arrays. @@ -498,8 +478,7 @@ struct xen_sysctl_topologyinfo { */ XEN_GUEST_HANDLE_64(uint32) cpu_to_core; XEN_GUEST_HANDLE_64(uint32) cpu_to_socket; - XEN_GUEST_HANDLE_64(uint32) cpu_to_node; /* node_number */ - + XEN_GUEST_HANDLE_64(uint32) cpu_to_node; }; typedef struct xen_sysctl_topologyinfo xen_sysctl_topologyinfo_t; DEFINE_XEN_GUEST_HANDLE(xen_sysctl_topologyinfo_t); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |