diff options
author | Sukadev Bhattiprolu | 2015-11-25 21:10:39 +0100 |
---|---|---|
committer | Karel Zak | 2015-12-02 11:33:58 +0100 |
commit | bd9b94d12a6158b6080630085f77e59ac1b7de26 (patch) | |
tree | 0587821cdfe45cdc6311ff5eca6ef5b6a6b9181f /sys-utils/lscpu.c | |
parent | Merge branch 'races' of git://github.com/kerolasa/lelux-utiliteetit (diff) | |
download | kernel-qcow2-util-linux-bd9b94d12a6158b6080630085f77e59ac1b7de26.tar.gz kernel-qcow2-util-linux-bd9b94d12a6158b6080630085f77e59ac1b7de26.tar.xz kernel-qcow2-util-linux-bd9b94d12a6158b6080630085f77e59ac1b7de26.zip |
lscpu: Print physical cpu information
lscpu currently prints information for CPUs configured in the system.
In case of KVM or other virtualized guest operating systems, this
refers to the virtual system, and bears no relation to the physical
topology of the system.
It would be useful if lscpu could also display the physical topology
info when available:
$ ./lscpu
Architecture: ppc64le
Byte Order: Little Endian
CPU(s): 16
On-line CPU(s) list: 0-15
Thread(s) per core: 1
Core(s) per socket: 1
Socket(s): 16
NUMA node(s): 1
Model: IBM pSeries (emulated by qemu)
Hypervisor vendor: KVM
Virtualization type: para
L1d cache: 64K
L1i cache: 32K
NUMA node0 CPU(s): 0-15
Physical sockets: 2 <<< New
Physical chips: 4 <<< New
Physical cores/chip: 4 <<< New
For now, physical topology information is available on platforms that
support the following RTAS (Real time abstraction service) call provided
by librtas:
rtas_get_sysparm(PROCESSOR_MODULE_INFO).
Currently this call is available to the PowerVM (pHYP) guests on PowerPC.
With a patch propoosed to PowerKVM, this RTAS call would also be available
to PowerKVM guests.
Based on input from Nishanth Aravamudan and Karel Zak.
Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Diffstat (limited to 'sys-utils/lscpu.c')
-rw-r--r-- | sys-utils/lscpu.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/sys-utils/lscpu.c b/sys-utils/lscpu.c index 47f690d88..d55502259 100644 --- a/sys-utils/lscpu.c +++ b/sys-utils/lscpu.c @@ -52,6 +52,10 @@ # endif #endif +#if defined(HAVE_LIBRTAS) +#include <librtas.h> +#endif + #include <libsmartcols.h> #include "cpuset.h" @@ -242,6 +246,9 @@ struct lscpu_desc { int *polarization; /* cpu polarization */ int *addresses; /* physical cpu addresses */ int *configured; /* cpu configured */ + int physsockets; /* Physical sockets (modules) */ + int physchips; /* Physical chips */ + int physcoresperchip; /* Physical cores per chip */ }; enum { @@ -400,6 +407,45 @@ init_mode(struct lscpu_modifier *mod) return m; } +#if defined(HAVE_LIBRTAS) +#define PROCESSOR_MODULE_INFO 43 +static int strbe16toh(const char *buf, int offset) +{ + return (buf[offset] << 8) + buf[offset+1]; +} + +static void read_physical_info_powerpc(struct lscpu_desc *desc) +{ + char buf[BUFSIZ]; + int rc, len, ntypes; + + desc->physsockets = desc->physchips = desc->physcoresperchip = 0; + + rc = rtas_get_sysparm(PROCESSOR_MODULE_INFO, sizeof(buf), buf); + if (rc < 0) + return; + + len = strbe16toh(buf, 0); + if (len < 8) + return; + + ntypes = strbe16toh(buf, 2); + + assert(ntypes <= 1); + if (!ntypes) + return; + + desc->physsockets = strbe16toh(buf, 4); + desc->physchips = strbe16toh(buf, 6); + desc->physcoresperchip = strbe16toh(buf, 8); +} +#else +static void read_physical_info_powerpc( + struct lscpu_desc *desc __attribute__((__unused__))) +{ +} +#endif + static void read_basicinfo(struct lscpu_desc *desc, struct lscpu_modifier *mod) { @@ -506,6 +552,9 @@ read_basicinfo(struct lscpu_desc *desc, struct lscpu_modifier *mod) desc->dispatching = path_read_s32(_PATH_SYS_CPU "/dispatching"); else desc->dispatching = -1; + + if (mod->system == SYSTEM_LIVE) + read_physical_info_powerpc(desc); } static int @@ -1636,6 +1685,12 @@ print_summary(struct lscpu_desc *desc, struct lscpu_modifier *mod) if (desc->flags) print_s(_("Flags:"), desc->flags); + + if (desc->physsockets) { + print_n(_("Physical sockets:"), desc->physsockets); + print_n(_("Physical chips:"), desc->physchips); + print_n(_("Physical cores/chip:"), desc->physcoresperchip); + } } static void __attribute__((__noreturn__)) usage(FILE *out) |