[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 2/2] add thread and state info to XEN_SYSCTL_cputopoinfo
Today the topology information obtained via XEN_SYSCTL_cputopoinfo doesn't contain the thread id. Add that. As especially with the boot parameter "smt=0" offline cpus are more common these days add a state indicator (online/offline) to the returned information as well. Signed-off-by: Juergen Gross <jgross@xxxxxxxx> --- tools/libxl/libxl.c | 13 +++++++++++++ tools/libxl/libxl_types.idl | 8 ++++++++ tools/xl/xl_info.c | 8 +++++--- xen/common/sysctl.c | 4 ++++ xen/include/public/sysctl.h | 6 +++++- 5 files changed, 35 insertions(+), 4 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index b41ade9fda..fc38223a06 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -430,10 +430,23 @@ libxl_cputopology *libxl_get_cpu_topology(libxl_ctx *ctx, int *nb_cpu_out) for (i = 0; i < num_cpus; i++) { #define V(map, i, invalid) ( cputopo[i].map == invalid) ? \ LIBXL_CPUTOPOLOGY_INVALID_ENTRY : cputopo[i].map + ret[i].thread = V(thread, i, XEN_INVALID_THREAD_ID); ret[i].core = V(core, i, XEN_INVALID_CORE_ID); ret[i].socket = V(socket, i, XEN_INVALID_SOCKET_ID); ret[i].node = V(node, i, XEN_INVALID_NODE_ID); #undef V + switch (cputopo[i].state) { + case XEN_TOPO_STATE_OFFLINE: + ret[i].state = LIBXL_CPUTOPOLOGY_STATE_TYPE_OFFLINE; + break; + case XEN_TOPO_STATE_ONLINE: + ret[i].state = LIBXL_CPUTOPOLOGY_STATE_TYPE_ONLINE; + break; + default: + LOGE(WARN, "Invalid cpu state"); + ret[i].state = LIBXL_CPUTOPOLOGY_STATE_TYPE_UNKNOWN; + break; + } } *nb_cpu_out = num_cpus; diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl index 4a385801ba..b1a8950ec7 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -1076,10 +1076,18 @@ libxl_numainfo = Struct("numainfo", [ ("dists", Array(uint32, "num_dists")), ], dir=DIR_OUT) +libxl_cputopology_state_type = Enumeration("cputopology_state_type", [ + (0, "unknown"), + (1, "offline"), + (2, "online") + ]) + libxl_cputopology = Struct("cputopology", [ + ("thread", uint32), ("core", uint32), ("socket", uint32), ("node", uint32), + ("state", libxl_cputopology_state_type), ], dir=DIR_OUT) libxl_pcitopology = Struct("pcitopology", [ diff --git a/tools/xl/xl_info.c b/tools/xl/xl_info.c index 6c8be26119..34ef483e49 100644 --- a/tools/xl/xl_info.c +++ b/tools/xl/xl_info.c @@ -280,12 +280,14 @@ static void output_topologyinfo(void) } printf("cpu_topology :\n"); - printf("cpu: core socket node\n"); + printf("cpu: thread core socket node state\n"); for (i = 0; i < nr; i++) { if (cpuinfo[i].core != LIBXL_CPUTOPOLOGY_INVALID_ENTRY) - printf("%3d: %4d %4d %4d\n", i, - cpuinfo[i].core, cpuinfo[i].socket, cpuinfo[i].node); + printf("%3d: %4d %4d %4d %4d %s\n", i, + cpuinfo[i].thread, cpuinfo[i].core, cpuinfo[i].socket, + cpuinfo[i].node, + libxl_cputopology_state_type_to_string(cpuinfo[i].state)); } libxl_cputopology_list_free(cpuinfo, nr); diff --git a/xen/common/sysctl.c b/xen/common/sysctl.c index c0aa6bde4e..8b6263a067 100644 --- a/xen/common/sysctl.c +++ b/xen/common/sysctl.c @@ -360,6 +360,7 @@ long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl) { if ( cpu_present(i) ) { + cputopo.thread = cpu_to_thread(i); cputopo.core = cpu_to_core(i); cputopo.socket = cpu_to_socket(i); cputopo.node = cpu_to_node(i); @@ -368,10 +369,13 @@ long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl) } else { + cputopo.thread = XEN_INVALID_THREAD_ID; cputopo.core = XEN_INVALID_CORE_ID; cputopo.socket = XEN_INVALID_SOCKET_ID; cputopo.node = XEN_INVALID_NODE_ID; } + cputopo.state = cpu_online(i) ? XEN_TOPO_STATE_ONLINE + : XEN_TOPO_STATE_OFFLINE; if ( copy_to_guest_offset(ti->cputopo, i, &cputopo, 1) ) { diff --git a/xen/include/public/sysctl.h b/xen/include/public/sysctl.h index e439e00983..ffb750a212 100644 --- a/xen/include/public/sysctl.h +++ b/xen/include/public/sysctl.h @@ -36,7 +36,7 @@ #include "physdev.h" #include "tmem.h" -#define XEN_SYSCTL_INTERFACE_VERSION 0x00000011 +#define XEN_SYSCTL_INTERFACE_VERSION 0x00000012 /* * Read console content from Xen buffer ring. @@ -434,15 +434,19 @@ struct xen_sysctl_lockprof_op { }; /* XEN_SYSCTL_cputopoinfo */ +#define XEN_TOPO_STATE_OFFLINE 0 +#define XEN_TOPO_STATE_ONLINE 1 #define XEN_INVALID_THREAD_ID (~0U) #define XEN_INVALID_CORE_ID (~0U) #define XEN_INVALID_SOCKET_ID (~0U) #define XEN_INVALID_NODE_ID (~0U) struct xen_sysctl_cputopo { + uint32_t thread; uint32_t core; uint32_t socket; uint32_t node; + uint32_t state; }; typedef struct xen_sysctl_cputopo xen_sysctl_cputopo_t; DEFINE_XEN_GUEST_HANDLE(xen_sysctl_cputopo_t); -- 2.16.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |