Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP1:GA
util-linux.3352
util-linux-lscpu-powervm.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File util-linux-lscpu-powervm.patch of Package util-linux.3352
From bd9b94d12a6158b6080630085f77e59ac1b7de26 Mon Sep 17 00:00:00 2001 From: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com> Date: Wed, 25 Nov 2015 12:10:39 -0800 Subject: [PATCH] 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> --- configure.ac | 6 ++++++ sys-utils/Makemodule.am | 2 +- sys-utils/lscpu.1 | 10 ++++++++- sys-utils/lscpu.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 71 insertions(+), 2 deletions(-) Index: util-linux-2.25/configure.ac =================================================================== --- util-linux-2.25.orig/configure.ac +++ util-linux-2.25/configure.ac @@ -337,6 +337,12 @@ AC_FUNC_FSEEKO AC_CHECK_FUNCS([openat fstatat unlinkat], [have_openat=yes], [have_openat=no]) AC_CHECK_FUNCS([ioperm iopl], [have_io=yes]) +AC_CHECK_LIB([rtas], [rtas_get_sysparm], [ + RTAS_LIBS="-lrtas" + AC_DEFINE_UNQUOTED([HAVE_LIBRTAS], [1], [Define if librtas exists]), [], +]) +AC_SUBST([RTAS_LIBS]) + AC_CHECK_MEMBER([struct sockaddr.sa_len], AC_DEFINE_UNQUOTED([HAVE_SA_LEN], [1], [Define if struct sockaddr contains sa_len]), [], [#include <sys/types.h> Index: util-linux-2.25/sys-utils/Makemodule.am =================================================================== --- util-linux-2.25.orig/sys-utils/Makemodule.am +++ util-linux-2.25/sys-utils/Makemodule.am @@ -270,7 +270,7 @@ lscpu_SOURCES = \ sys-utils/lscpu.c \ sys-utils/lscpu.h \ sys-utils/lscpu-dmi.c -lscpu_LDADD = $(LDADD) libcommon.la libsmartcols.la +lscpu_LDADD = $(LDADD) libcommon.la libsmartcols.la $(RTAS_LIBS) lscpu_CFLAGS = $(AM_CFLAGS) -I$(ul_libsmartcols_incdir) dist_man_MANS += sys-utils/lscpu.1 endif Index: util-linux-2.25/sys-utils/lscpu.1 =================================================================== --- util-linux-2.25.orig/sys-utils/lscpu.1 +++ util-linux-2.25/sys-utils/lscpu.1 @@ -12,13 +12,21 @@ lscpu \- display information about the C .BR \-h | \-V .SH DESCRIPTION .B lscpu -gathers CPU architecture information from sysfs and /proc/cpuinfo. The +gathers CPU architecture information from sysfs, /proc/cpuinfo and any +applicable architecture-specific libraries (e.g. librtas on Powerpc). The command output can be optimized for parsing or for easy readability by humans. The information includes, for example, the number of CPUs, threads, cores, sockets, and Non-Uniform Memory Access (NUMA) nodes. There is also information about the CPU caches and cache sharing, family, model, bogoMIPS, byte order, and stepping. +In virtualized environments, the CPU architecture information displayed +reflects the configuration of the guest operating system which is +typically different from the physical (host) system. On architectures that +support retreiving physical topology information, +.B lscpu +also displays the number of physical sockets, chips, cores in the host system. + Options that result in an output table have a \fIlist\fP argument. Use this argument to customize the command output. Specify a comma-separated list of column labels to limit the output table to only the specified columns, arranged Index: util-linux-2.25/sys-utils/lscpu.c =================================================================== --- util-linux-2.25.orig/sys-utils/lscpu.c +++ util-linux-2.25/sys-utils/lscpu.c @@ -48,6 +48,10 @@ # endif #endif +#if defined(HAVE_LIBRTAS) +#include <librtas.h> +#endif + #include <libsmartcols.h> #include "cpuset.h" @@ -238,6 +242,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 { @@ -396,6 +403,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) { @@ -502,6 +548,9 @@ read_basicinfo(struct lscpu_desc *desc, 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 @@ -1616,6 +1665,12 @@ print_summary(struct lscpu_desc *desc, s 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)
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor