import powerpc-utils-1.3.8-5.el8

This commit is contained in:
CentOS Sources 2021-03-30 07:19:40 -04:00 committed by Stepan Oksanichenko
parent f00c91e82d
commit 401fa5149a
41 changed files with 719 additions and 3595 deletions

2
.gitignore vendored
View File

@ -1 +1 @@
SOURCES/powerpc-utils-1.3.6.tar.gz
SOURCES/powerpc-utils-1.3.8.tar.gz

View File

@ -1 +1 @@
67ca5ca55c65fb5f28c77b258784ebeaf1eea208 SOURCES/powerpc-utils-1.3.6.tar.gz
526496eb7a3712d0d5a9ba0b4748b957625ede0e SOURCES/powerpc-utils-1.3.8.tar.gz

View File

@ -1,702 +0,0 @@
From ca2e17833fa81026f0dfcf35b6b01a5f9f6c0806 Mon Sep 17 00:00:00 2001
Message-Id: <ca2e17833fa81026f0dfcf35b6b01a5f9f6c0806.1587532692.git.kamalesh@linux.vnet.ibm.com>
In-Reply-To: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
References: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
From: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
Date: Tue, 21 Apr 2020 07:05:00 -0500
Subject: [PATCH V4 01/14] common/cpu_info_helpers: library to capture CPU
information
To: powerpc-utils-devel@googlegroups.com
Cc: Tyrel Datwyler <tyreld@linux.ibm.com>,
Nathan Lynch <nathanl@linux.ibm.com>,
Naveen N . Rao <naveen.n.rao@linux.vnet.ibm.com>,
Gautham R . Shenoy <ego@linux.vnet.ibm.com>,
Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
ppc64_cpu tool does a lots of heavy lifting in finding the information
about the underlying CPU topology and various other details. These
details might be required by other tools, probing the underlying
platform for similar details. Moving such functions to a common
library, allows sharing across ppc64_cpu and others tools, instead of
multiple implementation of functions capturing same information.
Signed-off-by: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
---
Makefile.am | 4 +-
src/common/cpu_info_helpers.c | 290 ++++++++++++++++++++++++++++++++++
src/common/cpu_info_helpers.h | 46 ++++++
src/ppc64_cpu.c | 227 +-------------------------
4 files changed, 346 insertions(+), 221 deletions(-)
create mode 100644 src/common/cpu_info_helpers.c
create mode 100644 src/common/cpu_info_helpers.h
diff --git a/Makefile.am b/Makefile.am
index a272008..1f0b4f6 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -63,6 +63,8 @@ pseries_platform_SOURCES = src/common/pseries_platform.c src/common/pseries_plat
librtas_error_SOURCES = src/common/librtas_error.c src/common/librtas_error.h
+cpu_info_helpers_SOURCES = src/common/cpu_info_helpers.c src/common/cpu_info_helpers.h
+
src_nvram_SOURCES = src/nvram.c src/nvram.h $(pseries_platform_SOURCES)
src_nvram_LDADD = -lz @LIBDL@
@@ -70,7 +72,7 @@ src_lsprop_SOURCES = src/lsprop.c $(pseries_platform_SOURCES)
src_lparstat_SOURCES = src/lparstat.c src/lparstat.h $(pseries_platform_SOURCES)
-src_ppc64_cpu_SOURCES = src/ppc64_cpu.c $(pseries_platform_SOURCES)
+src_ppc64_cpu_SOURCES = src/ppc64_cpu.c $(pseries_platform_SOURCES) $(cpu_info_helpers_SOURCES)
src_ppc64_cpu_LDADD = -lpthread
diff --git a/src/common/cpu_info_helpers.c b/src/common/cpu_info_helpers.c
new file mode 100644
index 0000000..0bb1dfe
--- /dev/null
+++ b/src/common/cpu_info_helpers.c
@@ -0,0 +1,290 @@
+/**
+ * @file cpu_info_helpers.c
+ * @brief Common routines to capture cpu information
+ *
+ * Copyright (c) 2007, 2020 International Business Machines
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * @author Anton Blanchard <anton@au.ibm.com>
+ * @author Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
+ */
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <sched.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <dirent.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include "cpu_info_helpers.h"
+
+int get_attribute(char *path, const char *fmt, int *value)
+{
+ FILE *fp;
+ int rc;
+
+ rc = access(path, F_OK);
+ if (rc)
+ return -1;
+
+ fp = fopen(path, "r");
+ if (!fp)
+ return -1;
+
+ rc = fscanf(fp, fmt, value);
+ fclose(fp);
+
+ if (rc == EOF)
+ return -1;
+
+ return 0;
+}
+
+static int test_sysattr(char *attribute, int perms, int threads_in_system)
+{
+ char path[SYSFS_PATH_MAX];
+ int i;
+
+ for (i = 0; i < threads_in_system; i++) {
+ sprintf(path, SYSFS_CPUDIR"/%s", i, attribute);
+ if (access(path, F_OK))
+ continue;
+
+ if (access(path, perms))
+ return 0;
+ }
+
+ return 1;
+}
+
+int __sysattr_is_readable(char *attribute, int threads_in_system)
+{
+ return test_sysattr(attribute, R_OK, threads_in_system);
+}
+
+int __sysattr_is_writeable(char *attribute, int threads_in_system)
+{
+ return test_sysattr(attribute, W_OK, threads_in_system);
+}
+
+int cpu_online(int thread)
+{
+ char path[SYSFS_PATH_MAX];
+ int rc, online;
+
+ sprintf(path, SYSFS_CPUDIR"/online", thread);
+ rc = get_attribute(path, "%d", &online);
+
+ /* This attribute does not exist in kernels without hotplug enabled */
+ if (rc && errno == ENOENT)
+ return 1;
+
+ if (rc || !online)
+ return 0;
+
+ return 1;
+}
+
+int is_subcore_capable(void)
+{
+ return access(SYSFS_SUBCORES, F_OK) == 0;
+}
+
+int num_subcores(void)
+{
+ int rc, subcores;
+
+ rc = get_attribute(SYSFS_SUBCORES, "%d", &subcores);
+ if (rc)
+ return -1;
+ return subcores;
+}
+
+int get_cpu_info(int *_threads_per_cpu, int *_cpus_in_system,
+ int *_threads_in_system)
+{
+ DIR *d;
+ struct dirent *de;
+ int first_cpu = 1;
+ int rc;
+ int subcores;
+ int threads_in_system;
+ int threads_per_cpu = 0;
+ int cpus_in_system = 0;
+
+ d = opendir("/proc/device-tree/cpus");
+ if (!d)
+ return -1;
+
+ while ((de = readdir(d)) != NULL) {
+ if (!strncmp(de->d_name, "PowerPC", 7)) {
+ if (first_cpu) {
+ struct stat sbuf;
+ char path[128];
+
+ snprintf(path, sizeof(path), INTSERV_PATH, de->d_name);
+ rc = stat(path, &sbuf);
+ if (!rc)
+ threads_per_cpu = sbuf.st_size / 4;
+
+ first_cpu = 0;
+ }
+
+ cpus_in_system++;
+ }
+ }
+
+ closedir(d);
+ threads_in_system = cpus_in_system * threads_per_cpu;
+
+ subcores = num_subcores();
+ if (is_subcore_capable() && subcores > 0) {
+ threads_per_cpu /= subcores;
+ cpus_in_system *= subcores;
+ }
+
+ *_threads_per_cpu = threads_per_cpu;
+ *_threads_in_system = threads_in_system;
+ *_cpus_in_system = cpus_in_system;
+
+ return 0;
+}
+
+int __is_smt_capable(int threads_in_system)
+{
+ struct stat sb;
+ char path[SYSFS_PATH_MAX];
+ int i;
+
+ for (i = 0; i < threads_in_system; i++) {
+ sprintf(path, SYSFS_CPUDIR"/smt_snooze_delay", i);
+ if (stat(path, &sb))
+ continue;
+ return 1;
+ }
+
+ return 0;
+}
+
+int __get_one_smt_state(int core, int threads_per_cpu)
+{
+ int primary_thread = core * threads_per_cpu;
+ int smt_state = 0;
+ int i;
+
+ if (!__sysattr_is_readable("online", threads_per_cpu)) {
+ perror("Cannot retrieve smt state");
+ return -2;
+ }
+
+ for (i = 0; i < threads_per_cpu; i++) {
+ smt_state += cpu_online(primary_thread + i);
+ }
+
+ return smt_state;
+}
+
+static void print_cpu_list(const cpu_set_t *cpuset, int cpuset_size,
+ int cpus_in_system)
+{
+ int core;
+ const char *comma = "";
+
+ for (core = 0; core < cpus_in_system; core++) {
+ int begin = core;
+ if (CPU_ISSET_S(core, cpuset_size, cpuset)) {
+ while (CPU_ISSET_S(core+1, cpuset_size, cpuset))
+ core++;
+
+ if (core > begin)
+ printf("%s%d-%d", comma, begin, core);
+ else
+ printf("%s%d", comma, core);
+ comma = ",";
+ }
+ }
+}
+
+int __do_smt(bool numeric, int cpus_in_system, int threads_per_cpu,
+ bool print_smt_state)
+{
+ int thread, c, smt_state = 0;
+ cpu_set_t **cpu_states = NULL;
+ int cpu_state_size = CPU_ALLOC_SIZE(cpus_in_system);
+ int start_cpu = 0, stop_cpu = cpus_in_system;
+ int rc = 0;
+
+ cpu_states = (cpu_set_t **)calloc(threads_per_cpu, sizeof(cpu_set_t));
+ if (!cpu_states)
+ return -ENOMEM;
+
+ for (thread = 0; thread < threads_per_cpu; thread++) {
+ cpu_states[thread] = CPU_ALLOC(cpus_in_system);
+ CPU_ZERO_S(cpu_state_size, cpu_states[thread]);
+ }
+
+ for (c = start_cpu; c < stop_cpu; c++) {
+ int threads_online = __get_one_smt_state(c, threads_per_cpu);
+
+ if (threads_online < 0) {
+ rc = threads_online;
+ goto cleanup_get_smt;
+ }
+ if (threads_online)
+ CPU_SET_S(c, cpu_state_size,
+ cpu_states[threads_online - 1]);
+ }
+
+ for (thread = 0; thread < threads_per_cpu; thread++) {
+ if (CPU_COUNT_S(cpu_state_size, cpu_states[thread])) {
+ if (smt_state == 0)
+ smt_state = thread + 1;
+ else if (smt_state > 0)
+ smt_state = -1; /* mix of SMT modes */
+ }
+ }
+
+ if (!print_smt_state)
+ return smt_state;
+
+ if (smt_state == 1) {
+ if (numeric)
+ printf("SMT=1\n");
+ else
+ printf("SMT is off\n");
+ } else if (smt_state == -1) {
+ for (thread = 0; thread < threads_per_cpu; thread++) {
+ if (CPU_COUNT_S(cpu_state_size,
+ cpu_states[thread])) {
+ printf("SMT=%d: ", thread + 1);
+ print_cpu_list(cpu_states[thread],
+ cpu_state_size, cpus_in_system);
+ printf("\n");
+ }
+ }
+ } else {
+ printf("SMT=%d\n", smt_state);
+ }
+
+cleanup_get_smt:
+ for (thread = 0; thread < threads_per_cpu; thread++)
+ CPU_FREE(cpu_states[thread]);
+
+ return rc;
+}
diff --git a/src/common/cpu_info_helpers.h b/src/common/cpu_info_helpers.h
new file mode 100644
index 0000000..8f09d79
--- /dev/null
+++ b/src/common/cpu_info_helpers.h
@@ -0,0 +1,46 @@
+/**
+ * @file cpu_info_helpers.h
+ * @brief Header of common routines to capture cpu information
+ *
+ * Copyright (c) 2007, 2020 International Business Machines
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * @author Anton Blanchard <anton@au.ibm.com>
+ * @author Kamalesh Babulal <kamaleshb@linux.vnet.ibm.com>
+ */
+#ifndef _CPU_INFO_HELPERS_H
+#define _CPU_INFO_HELPERS_H
+
+#define SYSFS_CPUDIR "/sys/devices/system/cpu/cpu%d"
+#define SYSFS_SUBCORES "/sys/devices/system/cpu/subcores_per_core"
+#define INTSERV_PATH "/proc/device-tree/cpus/%s/ibm,ppc-interrupt-server#s"
+
+#define SYSFS_PATH_MAX 128
+
+extern int __sysattr_is_readable(char *attribute, int threads_in_system);
+extern int __sysattr_is_writeable(char *attribute, int threads_in_system);
+extern int cpu_online(int thread);
+extern int is_subcore_capable(void);
+extern int num_subcores(void);
+extern int get_attribute(char *path, const char *fmt, int *value);
+extern int get_cpu_info(int *threads_per_cpu, int *cpus_in_system,
+ int *threads_in_system);
+extern int __is_smt_capable(int threads_in_system);
+extern int __get_one_smt_state(int core, int threads_per_cpu);
+extern int __do_smt(bool numeric, int cpus_in_system, int threads_per_cpu,
+ bool print_smt_state);
+
+#endif /* CPU_INFO_H */
diff --git a/src/ppc64_cpu.c b/src/ppc64_cpu.c
index 6d02235..cacbf1a 100644
--- a/src/ppc64_cpu.c
+++ b/src/ppc64_cpu.c
@@ -47,15 +47,12 @@
#endif
#include <errno.h>
+#include "cpu_info_helpers.h"
#define PPC64_CPU_VERSION "1.2"
-#define SYSFS_CPUDIR "/sys/devices/system/cpu/cpu%d"
-#define SYSFS_SUBCORES "/sys/devices/system/cpu/subcores_per_core"
#define DSCR_DEFAULT_PATH "/sys/devices/system/cpu/dscr_default"
-#define INTSERV_PATH "/proc/device-tree/cpus/%s/ibm,ppc-interrupt-server#s"
-#define SYSFS_PATH_MAX 128
#define MAX_NR_CPUS 1024
#define DIAGNOSTICS_RUN_MODE 42
#define CPU_OFFLINE -1
@@ -80,54 +77,14 @@ static int threads_in_system = 0;
static int do_info(void);
-static int test_sysattr(char *attribute, int perms)
-{
- char path[SYSFS_PATH_MAX];
- int i;
-
- for (i = 0; i < threads_in_system; i++) {
- sprintf(path, SYSFS_CPUDIR"/%s", i, attribute);
- if (access(path, F_OK))
- continue;
-
- if (access(path, perms))
- return 0;
- }
-
- return 1;
-}
-
static int sysattr_is_readable(char *attribute)
{
- return test_sysattr(attribute, R_OK);
+ return __sysattr_is_readable(attribute, threads_in_system);
}
static int sysattr_is_writeable(char *attribute)
{
- return test_sysattr(attribute, W_OK);
-}
-
-static int get_attribute(char *path, const char *fmt, int *value)
-{
- FILE *fp;
- int rc;
-
- rc = access(path, F_OK);
- if (rc)
- return -1;
-
-
- fp = fopen(path, "r");
- if (!fp)
- return -1;
-
- rc = fscanf(fp, fmt, value);
- fclose(fp);
-
- if (rc == EOF)
- return -1;
-
- return 0;
+ return __sysattr_is_writeable(attribute, threads_in_system);
}
static int set_attribute(const char *path, const char *fmt, int value)
@@ -156,24 +113,6 @@ close:
return rc;
}
-static int cpu_online(int thread)
-{
- char path[SYSFS_PATH_MAX];
- int rc, online;
-
- sprintf(path, SYSFS_CPUDIR"/online", thread);
- rc = get_attribute(path, "%d", &online);
-
- /* This attribute does not exist in kernels without hotplug enabled */
- if (rc && errno == ENOENT)
- return 1;
-
- if (rc || !online)
- return 0;
-
- return 1;
-}
-
static int get_system_attribute(char *attribute, const char *fmt, int *value,
int *inconsistent)
{
@@ -316,93 +255,14 @@ static int offline_thread(const char *path)
return set_attribute(path, "%d", 0);
}
-static int is_subcore_capable(void)
-{
- return access(SYSFS_SUBCORES, F_OK) == 0;
-}
-
-static int num_subcores(void)
-{
- int rc, subcores;
- rc = get_attribute(SYSFS_SUBCORES, "%d", &subcores);
- if (rc)
- return -1;
- return subcores;
-}
-
-static int get_cpu_info(void)
-{
- DIR *d;
- struct dirent *de;
- int first_cpu = 1;
- int rc;
- int subcores;
-
- d = opendir("/proc/device-tree/cpus");
- if (!d)
- return -1;
-
- while ((de = readdir(d)) != NULL) {
- if (!strncmp(de->d_name, "PowerPC", 7)) {
- if (first_cpu) {
- struct stat sbuf;
- char path[128];
-
- sprintf(path, INTSERV_PATH, de->d_name);
- rc = stat(path, &sbuf);
- if (!rc)
- threads_per_cpu = sbuf.st_size / 4;
-
- first_cpu = 0;
- }
-
- cpus_in_system++;
- }
- }
-
- closedir(d);
- threads_in_system = cpus_in_system * threads_per_cpu;
-
- subcores = num_subcores();
- if (is_subcore_capable() && subcores > 0) {
- threads_per_cpu /= subcores;
- cpus_in_system *= subcores;
- }
- return 0;
-}
-
static int is_smt_capable(void)
{
- struct stat sb;
- char path[SYSFS_PATH_MAX];
- int i;
-
- for (i = 0; i < threads_in_system; i++) {
- sprintf(path, SYSFS_CPUDIR"/smt_snooze_delay", i);
- if (stat(path, &sb))
- continue;
- return 1;
- }
-
- return 0;
+ return __is_smt_capable(threads_in_system);
}
static int get_one_smt_state(int core)
{
- int primary_thread = core * threads_per_cpu;
- int smt_state = 0;
- int i;
-
- if (!sysattr_is_readable("online")) {
- perror("Cannot retrieve smt state");
- return -2;
- }
-
- for (i = 0; i < threads_per_cpu; i++) {
- smt_state += cpu_online(primary_thread + i);
- }
-
- return smt_state;
+ return __get_one_smt_state(core, threads_per_cpu);
}
static int get_smt_state(void)
@@ -513,26 +373,6 @@ static int is_dscr_capable(void)
return 0;
}
-void print_cpu_list(const cpu_set_t *cpuset, int cpuset_size)
-{
- int core;
- const char *comma = "";
-
- for (core = 0; core < cpus_in_system; core++) {
- int begin = core;
- if (CPU_ISSET_S(core, cpuset_size, cpuset)) {
- while (CPU_ISSET_S(core+1, cpuset_size, cpuset))
- core++;
-
- if (core > begin)
- printf("%s%d-%d", comma, begin, core);
- else
- printf("%s%d", comma, core);
- comma = ",";
- }
- }
-}
-
static int do_smt(char *state, bool numeric)
{
int rc = 0;
@@ -547,60 +387,7 @@ static int do_smt(char *state, bool numeric)
}
if (!state) {
- int thread, c;
- cpu_set_t *cpu_states[threads_per_cpu];
- int cpu_state_size = CPU_ALLOC_SIZE(cpus_in_system);
- int start_cpu = 0, stop_cpu = cpus_in_system;
-
- for (thread = 0; thread < threads_per_cpu; thread++) {
- cpu_states[thread] = CPU_ALLOC(cpus_in_system);
- CPU_ZERO_S(cpu_state_size, cpu_states[thread]);
- }
-
- for (c = start_cpu; c < stop_cpu; c++) {
- int threads_online = get_one_smt_state(c);
-
- if (threads_online < 0) {
- rc = threads_online;
- goto cleanup_get_smt;
- }
- if (threads_online)
- CPU_SET_S(c, cpu_state_size,
- cpu_states[threads_online - 1]);
- }
-
- for (thread = 0; thread < threads_per_cpu; thread++) {
- if (CPU_COUNT_S(cpu_state_size, cpu_states[thread])) {
- if (smt_state == 0)
- smt_state = thread + 1;
- else if (smt_state > 0)
- smt_state = -1; /* mix of SMT modes */
- }
- }
-
- if (smt_state == 1) {
- if (numeric)
- printf("SMT=1\n");
- else
- printf("SMT is off\n");
- } else if (smt_state == -1) {
- for (thread = 0; thread < threads_per_cpu; thread++) {
- if (CPU_COUNT_S(cpu_state_size,
- cpu_states[thread])) {
- printf("SMT=%d: ", thread + 1);
- print_cpu_list(cpu_states[thread],
- cpu_state_size);
- printf("\n");
- }
- }
- } else {
- printf("SMT=%d\n", smt_state);
- }
-
-cleanup_get_smt:
- for (thread = 0; thread < threads_per_cpu; thread++)
- CPU_FREE(cpu_states[thread]);
-
+ rc = __do_smt(numeric, cpus_in_system, threads_per_cpu, true);
} else {
if (!strcmp(state, "on"))
smt_state = threads_per_cpu;
@@ -1510,7 +1297,7 @@ int main(int argc, char *argv[])
return 0;
}
- rc = get_cpu_info();
+ rc = get_cpu_info(&threads_per_cpu, &cpus_in_system, &threads_in_system);
if (rc) {
printf("Could not determine system cpu/thread information.\n");
return rc;
--
2.25.3

View File

@ -0,0 +1,78 @@
From 21c860888425762468d339950518ab8b0940ecea Mon Sep 17 00:00:00 2001
From: Tyrel Datwyler <tyreld@linux.ibm.com>
Date: Mon, 5 Oct 2020 13:03:45 -0700
Subject: [PATCH] ofpathname: Use NVMe controller physical nsid
Linux creates logical block devices of the the form nvmeXnYpZ such that X = the
controller, Y = namepsace, and Z = partition. For example:
/dev/nvme0n1p1
The Linux namespace numbering scheme for namespaces always starts at 1 and
increases monotonically regardless of the actual numbering scheme of the
namespaces as seen by the physical NVMe controller. Accordingly, the Open
firmware path binding utilizes the namespace id as seen by the controller and
not the necessarily the one given in the logical block device name.
As such we need to use the "nsid" attribute in the sysfs entry for the logical
device to properly map back and forth from OP pathnames.
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
---
scripts/ofpathname | 24 ++++++++++++++++--------
1 file changed, 16 insertions(+), 8 deletions(-)
diff --git a/scripts/ofpathname b/scripts/ofpathname
index 2ceae25..41b8c5c 100755
--- a/scripts/ofpathname
+++ b/scripts/ofpathname
@@ -659,6 +659,11 @@ l2of_nvme()
devspec=`$CAT $PWD/device/devspec | tr -d '\000'`
if [[ -n $devspec ]]; then
found=1
+ if [[ -n $devnsid ]]; then
+ # Linux logical nsid might not match nvme controller nsid
+ goto_dir $dir "nsid"
+ devnsid=`$CAT $PWD/nsid | tr -d '\000'`
+ fi
break
fi
done
@@ -1609,16 +1614,9 @@ of2l_nvme()
local dir
local link
- for dir in `$FIND /sys/block -name "nvme*n$nsid"`; do
+ for dir in `$FIND /sys/class/nvme -name "nvme[0-9]*"`; do
cd $dir
- link=`get_link "device"` # points to nvme[0-9]+ (non-namespace)
- if [[ -n $link ]]; then
- cd $link
- else
- continue
- fi
-
link=`get_link "device"` # points to pci address dir
if [[ -n $link ]]; then
cd $link
@@ -1635,6 +1633,16 @@ of2l_nvme()
fi
done
+ for dir in `$FIND /sys/block -name "${LOGICAL_DEVNAME}n[0-9]*"`; do
+ cd $dir
+
+ local devnsid=`$CAT ./nsid 2>/dev/null`
+ if [[ $devnsid = $nsid ]]; then
+ LOGICAL_DEVNAME="${dir##*/}"
+ break
+ fi
+ done
+
if [[ -n $LOGICAL_DEVNAME ]] \
&& [[ -n $part ]]; then
--
1.8.3.1

View File

@ -1,85 +0,0 @@
From 4fe0e76e1d02787b4cf60eafd2fb3667897becf4 Mon Sep 17 00:00:00 2001
From: Michael Bringmann <mwb@linux.vnet.ibm.com>
Date: Tue, 23 Jul 2019 15:58:21 -0500
Subject: [PATCH 1/1] powerpc-utils: Suppress errors reading kernel
files
A problem was observed with the evaluation of the '${devspec}'
by the script 'ofpathname'. This patch provided improved
handling of errors within that script, and by some of the
follow-on uses of the tool by the 'bootlist' script.
* Deal with error messages returned sometimes by evaluation
of ${devspec} in 'ofpathname'.
* Strip embedded nulls from values provided by kernel files,
especially, /proc/device-tree${devspec}/namespace/name,
in 'ofpathname'.
* Redirect more error messages to /dev/null
Signed-off-by: Michael Bringmann <mwb@linux.vnet.ibm.com>
---
scripts/bootlist | 8 ++++----
scripts/ofpathname | 4 ++--
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/scripts/bootlist b/scripts/bootlist
index 65926d7..5ce20cf 100755
--- a/scripts/bootlist
+++ b/scripts/bootlist
@@ -169,7 +169,7 @@ get_logical_device_name()
local devname=$1
local logical_name
- logical_name=`$OFPATHNAME -l $devname 2>/dev/null`
+ logical_name=`$OFPATHNAME -l $devname 2>/dev/null | tr -d '\000'`
if [[ $? -ne 0 ]]; then
echo ""
else
@@ -207,11 +207,11 @@ show_bootlist()
local devlist=$1
local i
- for i in `$NVRAM --print-config=${devlist} | sed 's/ /\n/g'`; do
+ for i in `$NVRAM --print-config=${devlist} 2> /dev/null | sed 's/ /\n/g'`; do
if [[ $TRANSLATE_NAMES = "yes" ]]; then
name=`get_logical_device_name $i`
if [[ -z $name ]]; then
- echo "Could not translate $i to logical device name"
+ echo "Could not translate $i to logical device name" 2>&1
else
case $name in
eth*) parse_eth_info $name $i ;;
@@ -230,7 +230,7 @@ show_bootlist()
. $PSERIES_PLATFORM
if [[ $platform != $PLATFORM_PSERIES_LPAR ]]; then
- echo "bootlist: is not supported on the $platform_name platform"
+ echo "bootlist: is not supported on the $platform_name platform" 2>&1
exit 1
fi
diff --git a/scripts/ofpathname b/scripts/ofpathname
index c37c6bd..09c0209 100755
--- a/scripts/ofpathname
+++ b/scripts/ofpathname
@@ -656,7 +656,7 @@ l2of_nvme()
goto_dir $PWD "device/devspec"
- devspec=`$CAT $PWD/device/devspec`
+ devspec=`$CAT $PWD/device/devspec | tr -d '\000'`
if [[ -n $devspec ]]; then
found=1
break
@@ -681,7 +681,7 @@ l2of_nvme()
# Device type is usually 'namespace'.
# Get it from device-tree just in case.
- devtype=`$CAT /proc/device-tree${devspec}/namespace/name`
+ devtype=`$CAT /proc/device-tree${devspec}/namespace/name | tr -d '\000'` 2> /dev/null
if [[ -z $devtype ]]; then
err $ERR_NO_OFPATH
fi
--
1.8.3.1

View File

@ -1,34 +0,0 @@
From 9a509d69ef675291a4fa842f6f281b2a968f4b52 Mon Sep 17 00:00:00 2001
From: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
Date: Mon, 24 Feb 2020 19:57:57 +0530
Subject: [PATCH] update_flash: Fix warning
With recent bash `update_flash -v -f <image>` is throwing below warning.
update_flash_nv: line 316: warning: command substitution: ignored null byte in input
bash enhancement: https://lists.gnu.org/archive/html/bug-bash/2016-09/msg00015.html
This patch fixes above issue.
Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
---
scripts/update_flash_nv | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/scripts/update_flash_nv b/scripts/update_flash_nv
index bb9dfee..8be9e8e 100755
--- a/scripts/update_flash_nv
+++ b/scripts/update_flash_nv
@@ -313,7 +313,7 @@ fsp_validate_flash() {
echo 1 > $SYS_VALIDATE_FLASH 2>/dev/null
# Display appropriate message, exiting if necessary
- output="$(cat $SYS_VALIDATE_FLASH)"
+ output="$(tr -d '\0' < $SYS_VALIDATE_FLASH)"
fsp_echo_validate_return_status "$output"
}
--
2.21.1

View File

@ -1,165 +0,0 @@
From 5cd8f63b62394840de818328d275d7f20efe79a7 Mon Sep 17 00:00:00 2001
Message-Id: <5cd8f63b62394840de818328d275d7f20efe79a7.1587532692.git.kamalesh@linux.vnet.ibm.com>
In-Reply-To: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
References: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
From: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
Date: Tue, 21 Apr 2020 07:10:54 -0500
Subject: [PATCH V4 02/14] lparstat: Remove ppc64_cpu tool dependency
To: powerpc-utils-devel@googlegroups.com
Cc: Tyrel Datwyler <tyreld@linux.ibm.com>,
Nathan Lynch <nathanl@linux.ibm.com>,
Naveen N . Rao <naveen.n.rao@linux.vnet.ibm.com>,
Gautham R . Shenoy <ego@linux.vnet.ibm.com>,
Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
get_smt_mode(), calls ppc64_cpu tool to get the current SMT mode, this
method of probing has its disadvantages like tightly coupling lparstat
with ppc64_cpu to mention one. Use, the internal library to fetch this
information.
Signed-off-by: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
---
Makefile.am | 3 ++-
src/lparstat.c | 54 ++++++++++++++++++++++++++++++++++----------------
src/lparstat.h | 2 +-
3 files changed, 40 insertions(+), 19 deletions(-)
diff --git a/Makefile.am b/Makefile.am
index 1f0b4f6..15f8bcc 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -70,7 +70,8 @@ src_nvram_LDADD = -lz @LIBDL@
src_lsprop_SOURCES = src/lsprop.c $(pseries_platform_SOURCES)
-src_lparstat_SOURCES = src/lparstat.c src/lparstat.h $(pseries_platform_SOURCES)
+src_lparstat_SOURCES = src/lparstat.c src/lparstat.h $(pseries_platform_SOURCES) \
+ $(cpu_info_helpers_SOURCES)
src_ppc64_cpu_SOURCES = src/ppc64_cpu.c $(pseries_platform_SOURCES) $(cpu_info_helpers_SOURCES)
src_ppc64_cpu_LDADD = -lpthread
diff --git a/src/lparstat.c b/src/lparstat.c
index ffb2cfa..b7cb2d2 100644
--- a/src/lparstat.c
+++ b/src/lparstat.c
@@ -31,6 +31,7 @@
#include <sys/time.h>
#include "lparstat.h"
#include "pseries_platform.h"
+#include "cpu_info_helpers.h"
#define LPARCFG_FILE "/proc/ppc64/lparcfg"
#define SE_NOT_FOUND "???"
@@ -38,6 +39,10 @@
static bool o_legacy = false;
+static int threads_per_cpu;
+static int cpus_in_system;
+static int threads_in_system;
+
struct sysentry *get_sysentry(char *name)
{
struct sysentry *se = &system_data[0];
@@ -73,6 +78,16 @@ void get_sysdata(char *name, char **descr, char *value)
*descr = se->descr;
}
+static int is_smt_capable(void)
+{
+ return __is_smt_capable(threads_in_system);
+}
+
+static int parse_smt_state(void)
+{
+ return __do_smt(false, cpus_in_system, threads_per_cpu, false);
+}
+
void get_time()
{
struct timeval t;
@@ -522,32 +537,23 @@ void get_mem_total(struct sysentry *se, char *buf)
void get_smt_mode(struct sysentry *se, char *buf)
{
- FILE *f;
- char line[128];
- char *cmd = "/usr/sbin/ppc64_cpu --smt";
- char *first_line;
+ int smt_state = 0;
- f = popen(cmd, "r");
- if (!f) {
- fprintf(stderr, "Failed to execute %s\n", cmd);
+ if (!is_smt_capable()) {
+ sprintf(buf, "1");
return;
}
- first_line = fgets(line, 128, f);
- pclose(f);
-
- if (!first_line) {
- fprintf(stderr, "Could not read output of %s\n", cmd);
+ smt_state = parse_smt_state();
+ if (smt_state < 0) {
+ fprintf(stderr, "Failed to get smt state\n");
return;
}
- /* The output is either "SMT=x" or "SMT is off", we can cheat
- * by looking at line[8] for an 'f'.
- */
- if (line[8] == 'f')
+ if (smt_state == 1)
sprintf(buf, "Off");
else
- sprintf(buf, "%c", line[4]);
+ sprintf(buf, "%d", smt_state);
}
long long get_cpu_time_diff()
@@ -574,6 +580,19 @@ void get_cpu_stat(struct sysentry *se, char *buf)
sprintf(buf, "%.2f", percent);
}
+void init_sysinfo(void)
+{
+ int rc = 0;
+
+ /* probe one time system cpu information */
+ rc = get_cpu_info(&threads_per_cpu, &cpus_in_system,
+ &threads_in_system);
+ if (rc) {
+ fprintf(stderr, "Failed to capture system CPUs information\n");
+ exit(rc);
+ }
+}
+
void init_sysdata(void)
{
get_time();
@@ -746,6 +765,7 @@ int main(int argc, char *argv[])
if (optind < argc)
count = atoi(argv[optind++]);
+ init_sysinfo();
init_sysdata();
if (i_option)
diff --git a/src/lparstat.h b/src/lparstat.h
index 3aee192..ae84caf 100644
--- a/src/lparstat.h
+++ b/src/lparstat.h
@@ -184,7 +184,7 @@ struct sysentry system_data[] = {
.descr = "Online Memory",
.get = &get_mem_total},
- /* ppc64_cpu --smt */
+ /* smt mode, cpu_info_helpers::__do_smt() */
{.name = "smt_state",
.descr = "SMT",
.get = &get_smt_mode},
--
2.25.3

View File

@ -0,0 +1,13 @@
diff -up powerpc-utils-1.3.8/src/sys_ident.c.me powerpc-utils-1.3.8/src/sys_ident.c
--- powerpc-utils-1.3.8/src/sys_ident.c.me 2020-10-06 15:35:56.620350621 +0200
+++ powerpc-utils-1.3.8/src/sys_ident.c 2020-10-06 15:36:31.468849936 +0200
@@ -267,7 +267,8 @@ print_proc_sn_value(void)
"parameter from RTAS\n");
return 2;
}
- pos = strstr(buf, "uid=");
+ /* Ignore length field (first 2 bytes) */
+ pos = strstr(buf +2, "uid=");
if (pos == NULL) {
fprintf(stderr, "Parameter from RTAS does "
"not contain uid\n");

View File

@ -1,99 +0,0 @@
From 9263de80d08451beacc29e4eb83492234d648796 Mon Sep 17 00:00:00 2001
Message-Id: <9263de80d08451beacc29e4eb83492234d648796.1587532692.git.kamalesh@linux.vnet.ibm.com>
In-Reply-To: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
References: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
From: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
Date: Tue, 21 Apr 2020 07:54:01 -0500
Subject: [PATCH V4 03/14] lparstat: Read the online cores
To: powerpc-utils-devel@googlegroups.com
Cc: Tyrel Datwyler <tyreld@linux.ibm.com>,
Nathan Lynch <nathanl@linux.ibm.com>,
Naveen N . Rao <naveen.n.rao@linux.vnet.ibm.com>,
Gautham R . Shenoy <ego@linux.vnet.ibm.com>,
Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
The accumulation of PURR/SPURR values are total of all online CPU in
the system, hence the timebase also needs to be scaled to the number
of cores. Add a helper to read the online cores.
Signed-off-by: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
---
src/lparstat.c | 32 ++++++++++++++++++++++++++++++++
src/lparstat.h | 4 ++++
2 files changed, 36 insertions(+)
diff --git a/src/lparstat.c b/src/lparstat.c
index b7cb2d2..1d0b3a7 100644
--- a/src/lparstat.c
+++ b/src/lparstat.c
@@ -88,6 +88,11 @@ static int parse_smt_state(void)
return __do_smt(false, cpus_in_system, threads_per_cpu, false);
}
+static int get_one_smt_state(int core)
+{
+ return __get_one_smt_state(core, threads_per_cpu);
+}
+
void get_time()
{
struct timeval t;
@@ -556,6 +561,31 @@ void get_smt_mode(struct sysentry *se, char *buf)
sprintf(buf, "%d", smt_state);
}
+void get_online_cores(void)
+{
+ struct sysentry *se;
+ int *core_state;
+ int online_cores = 0;
+ int i;
+
+ core_state = calloc(cpus_in_system, sizeof(int));
+ if (!core_state) {
+ fprintf(stderr, "Failed to read online cores\n");
+ return;
+ }
+
+ for (i = 0; i < cpus_in_system; i++) {
+ core_state[i] = (get_one_smt_state(i) > 0);
+ if (core_state[i])
+ online_cores++;
+ }
+
+ se = get_sysentry("online_cores");
+ sprintf(se->value, "%d", online_cores);
+
+ free(core_state);
+}
+
long long get_cpu_time_diff()
{
long long old_total = 0, new_total = 0;
@@ -591,6 +621,8 @@ void init_sysinfo(void)
fprintf(stderr, "Failed to capture system CPUs information\n");
exit(rc);
}
+
+ get_online_cores();
}
void init_sysdata(void)
diff --git a/src/lparstat.h b/src/lparstat.h
index ae84caf..6b65b48 100644
--- a/src/lparstat.h
+++ b/src/lparstat.h
@@ -189,6 +189,10 @@ struct sysentry system_data[] = {
.descr = "SMT",
.get = &get_smt_mode},
+ /* online cores, cpu_info_helpers::get_one_smt_state() */
+ {.name = "online_cores",
+ .descr = "Online Cores"},
+
/* /proc/stat */
{.name = "cpu_total",
.descr = "CPU Total Time"},
--
2.25.3

View File

@ -1,94 +0,0 @@
From e8f0f534bab72cecdaf6b5822324d71884cb9133 Mon Sep 17 00:00:00 2001
Message-Id: <e8f0f534bab72cecdaf6b5822324d71884cb9133.1587532692.git.kamalesh@linux.vnet.ibm.com>
In-Reply-To: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
References: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
From: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
Date: Tue, 21 Apr 2020 07:55:28 -0500
Subject: [PATCH V4 04/14] lparstat: Capture nominal frequency
To: powerpc-utils-devel@googlegroups.com
Cc: Tyrel Datwyler <tyreld@linux.ibm.com>,
Nathan Lynch <nathanl@linux.ibm.com>,
Naveen N . Rao <naveen.n.rao@linux.vnet.ibm.com>,
Gautham R . Shenoy <ego@linux.vnet.ibm.com>,
Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
Capture the nominal frequency/clock from the /proc/cpuinfo. This value
will be used later to calculate the effective/current frequency at which
the processor is running.
Signed-off-by: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
---
src/lparstat.c | 36 ++++++++++++++++++++++++++++++++++++
src/lparstat.h | 2 ++
2 files changed, 38 insertions(+)
diff --git a/src/lparstat.c b/src/lparstat.c
index 1d0b3a7..24c48ad 100644
--- a/src/lparstat.c
+++ b/src/lparstat.c
@@ -171,6 +171,38 @@ void get_sys_uptime(struct sysentry *unused_se, char *uptime)
fclose(f);
}
+int get_nominal_frequency(void)
+{
+ FILE *f;
+ char buf[80];
+ struct sysentry *se;
+ char *nfreq = NULL;
+
+ f = fopen("/proc/cpuinfo", "r");
+ if (!f) {
+ fprintf(stderr, "Could not open /proc/cpuinfo\n");
+ return -1;
+ }
+
+ while ((fgets(buf, 80, f)) != NULL) {
+ if (!strncmp(buf, "clock", 5)) {
+ nfreq = strchr(buf, ':') + 2;
+ break;
+ }
+ }
+
+ fclose(f);
+
+ if (!nfreq) {
+ fprintf(stderr, "Failed to read Nominal frequency\n");
+ return -1;
+ }
+
+ se = get_sysentry("nominal_freq");
+ snprintf(se->value, sizeof(se->value), "%s", nfreq);
+
+ return 0;
+}
void get_cpu_physc(struct sysentry *unused_se, char *buf)
{
@@ -623,6 +655,10 @@ void init_sysinfo(void)
}
get_online_cores();
+
+ rc = get_nominal_frequency();
+ if (rc)
+ exit(rc);
}
void init_sysdata(void)
diff --git a/src/lparstat.h b/src/lparstat.h
index 6b65b48..c1bac28 100644
--- a/src/lparstat.h
+++ b/src/lparstat.h
@@ -242,6 +242,8 @@ struct sysentry system_data[] = {
/* /proc/cpuinfo */
{.name = "timebase",
.descr = "Timebase"},
+ {.name = "nominal_freq",
+ .descr = "Nominal Frequency"},
/* /proc/interrupts */
{.name = "phint",
--
2.25.3

View File

@ -1,215 +0,0 @@
From 8f0bf6a9dd14c16ee95092f43c45ee256f10637b Mon Sep 17 00:00:00 2001
Message-Id: <8f0bf6a9dd14c16ee95092f43c45ee256f10637b.1587532692.git.kamalesh@linux.vnet.ibm.com>
In-Reply-To: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
References: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
From: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
Date: Tue, 21 Apr 2020 07:58:19 -0500
Subject: [PATCH V4 05/14] lparstat: Assign file descriptors to speed up read
To: powerpc-utils-devel@googlegroups.com
Cc: Tyrel Datwyler <tyreld@linux.ibm.com>,
Nathan Lynch <nathanl@linux.ibm.com>,
Naveen N . Rao <naveen.n.rao@linux.vnet.ibm.com>,
Gautham R . Shenoy <ego@linux.vnet.ibm.com>,
Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
For every sampling interval, three per-cpu sysfs files is read to
capture spurr, idle_purr and idle_spurr values. Every read takes
three file operation such as open, read, close, future this scales
with number of CPUs in the system. To reduce the latency involved
in open and close, assign a permanent file descriptors per online cpu.
without caching file descriptors
---------------------------------
System Configuration
type=Dedicated mode=Capped smt=8 lcpu=4 mem=8302464 kB cpus=0 ent=4.00
---Actual--- -Normalized-
%busy %idle Frequency %busy %idle
------ ------ ------------- ------ ------
0.04 99.95 3.16GHz[100%] 0.04 99.95 1.1003219
0.15 99.85 3.16GHz[100%] 0.15 99.85 1.1003222
0.04 99.96 3.16GHz[100%] 0.04 99.96 1.1003179
0.03 99.97 3.16GHz[100%] 0.03 99.97 1.1003183
0.03 99.97 3.16GHz[100%] 0.03 99.97 1.1003166
with caching file descriptors
------------------------------
System Configuration
type=Dedicated mode=Capped smt=8 lcpu=4 mem=8302464 kB cpus=0 ent=4.00
---Actual--- -Normalized-
%busy %idle Frequency %busy %idle
------ ------ ------------- ------ ------
0.03 99.96 3.16GHz[100%] 0.03 99.97 1.1001793
0.03 99.97 3.16GHz[100%] 0.03 99.97 1.1001775
0.03 99.97 3.16GHz[100%] 0.03 99.97 1.1001775
0.02 99.98 3.16GHz[100%] 0.02 99.98 1.1001766
0.02 99.98 3.16GHz[100%] 0.02 99.98 1.1001762
Signed-off-by: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
---
src/lparstat.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++
src/lparstat.h | 12 +++++++
2 files changed, 100 insertions(+)
diff --git a/src/lparstat.c b/src/lparstat.c
index 24c48ad..f5c0ce5 100644
--- a/src/lparstat.c
+++ b/src/lparstat.c
@@ -27,6 +27,8 @@
#include <string.h>
#include <getopt.h>
#include <unistd.h>
+#include <fcntl.h>
+#include <signal.h>
#include <sys/stat.h>
#include <sys/time.h>
#include "lparstat.h"
@@ -43,6 +45,8 @@ static int threads_per_cpu;
static int cpus_in_system;
static int threads_in_system;
+static cpu_sysfs_fd *cpu_sysfs_fds;
+
struct sysentry *get_sysentry(char *name)
{
struct sysentry *se = &system_data[0];
@@ -93,6 +97,80 @@ static int get_one_smt_state(int core)
return __get_one_smt_state(core, threads_per_cpu);
}
+static int assign_read_fd(const char *path)
+{
+ int rc = 0;
+
+ rc = access(path, R_OK);
+ if (rc)
+ return -1;
+
+ rc = open(path, O_RDONLY);
+ return rc;
+}
+
+static void close_cpu_sysfs_fds(int threads_in_system)
+{
+ int i;
+
+ for (i = 0; i < threads_in_system && cpu_sysfs_fds[i].spurr; i++) {
+ close(cpu_sysfs_fds[i].spurr);
+ close(cpu_sysfs_fds[i].idle_purr);
+ close(cpu_sysfs_fds[i].idle_spurr);
+ }
+
+ free(cpu_sysfs_fds);
+}
+
+static int assign_cpu_sysfs_fds(int threads_in_system)
+{
+ int cpu_idx, i;
+ char sysfs_file_path[SYSFS_PATH_MAX];
+
+ cpu_sysfs_fds =
+ (cpu_sysfs_fd*)calloc(sizeof(cpu_sysfs_fd), threads_in_system);
+ if (!cpu_sysfs_fds) {
+ fprintf(stderr, "Failed to allocate memory for sysfs file descriptors\n");
+ return -1;
+ }
+
+ for (cpu_idx = 0, i = 0; i < threads_in_system; i++) {
+ if (!cpu_online(i))
+ continue;
+
+ cpu_sysfs_fds[cpu_idx].cpu = i;
+
+ snprintf(sysfs_file_path, SYSFS_PATH_MAX, SYSFS_PERCPU_SPURR, i);
+ cpu_sysfs_fds[cpu_idx].spurr = assign_read_fd(sysfs_file_path);
+ if (cpu_sysfs_fds[cpu_idx].spurr == -1)
+ goto error;
+
+ snprintf(sysfs_file_path, SYSFS_PATH_MAX, SYSFS_PERCPU_IDLE_PURR, i);
+ cpu_sysfs_fds[cpu_idx].idle_purr = assign_read_fd(sysfs_file_path);
+ if (cpu_sysfs_fds[cpu_idx].idle_purr == -1)
+ goto error;
+
+ snprintf(sysfs_file_path, SYSFS_PATH_MAX, SYSFS_PERCPU_IDLE_SPURR, i);
+ cpu_sysfs_fds[cpu_idx].idle_spurr = assign_read_fd(sysfs_file_path);
+ if (cpu_sysfs_fds[cpu_idx].idle_spurr == -1)
+ goto error;
+
+ cpu_idx++;
+ }
+
+ return 0;
+error:
+ fprintf(stderr, "Failed to open %s\n", sysfs_file_path);
+ close_cpu_sysfs_fds(threads_in_system);
+ return -1;
+}
+
+static void sig_int_handler(int signal)
+{
+ close_cpu_sysfs_fds(threads_in_system);
+ exit(1);
+}
+
void get_time()
{
struct timeval t;
@@ -659,6 +737,15 @@ void init_sysinfo(void)
rc = get_nominal_frequency();
if (rc)
exit(rc);
+
+ if (signal(SIGINT, sig_int_handler) == SIG_ERR) {
+ fprintf(stderr, "Failed to add signal handler\n");
+ exit(-1);
+ }
+
+ rc = assign_cpu_sysfs_fds(threads_in_system);
+ if (rc)
+ exit(rc);
}
void init_sysdata(void)
@@ -841,5 +928,6 @@ int main(int argc, char *argv[])
else
print_default_output(interval, count);
+ close_cpu_sysfs_fds(threads_in_system);
return 0;
}
diff --git a/src/lparstat.h b/src/lparstat.h
index c1bac28..617737b 100644
--- a/src/lparstat.h
+++ b/src/lparstat.h
@@ -25,6 +25,10 @@
#define SYSDATA_NAME_SZ 64
#define SYSDATA_DESCR_SZ 128
+#define SYSFS_PERCPU_SPURR "/sys/devices/system/cpu/cpu%d/spurr"
+#define SYSFS_PERCPU_IDLE_PURR "/sys/devices/system/cpu/cpu%d/idle_purr"
+#define SYSFS_PERCPU_IDLE_SPURR "/sys/devices/system/cpu/cpu%d/idle_spurr"
+
struct sysentry {
char value[SYSDATA_VALUE_SZ]; /* value from file */
char old_value[SYSDATA_VALUE_SZ]; /* previous value from file */
@@ -33,6 +37,14 @@ struct sysentry {
void (*get)(struct sysentry *, char *);
};
+struct cpu_sysfs_file_desc {
+ int cpu; /* cpu number */
+ int spurr; /* per-cpu /sys/devices/system/cpu/cpuX/spurr file descriptor */
+ int idle_purr; /* per-cpu /sys/devices/system/cpu/cpuX/idle_purr file descriptor */
+ int idle_spurr; /* per-cpu /sys/devices/system/cpu/cpuX/idle_spurr file descriptor */
+};
+typedef struct cpu_sysfs_file_desc cpu_sysfs_fd;
+
extern void get_smt_state(struct sysentry *, char *);
extern void get_capped_mode(struct sysentry *, char *);
extern void get_memory_mode(struct sysentry *, char *);
--
2.25.3

View File

@ -1,134 +0,0 @@
From 6bc0d4f1e181c2254b7e35f9b3f77128f663a525 Mon Sep 17 00:00:00 2001
Message-Id: <6bc0d4f1e181c2254b7e35f9b3f77128f663a525.1587532692.git.kamalesh@linux.vnet.ibm.com>
In-Reply-To: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
References: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
From: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
Date: Tue, 21 Apr 2020 08:00:49 -0500
Subject: [PATCH V4 06/14] lparstat: Read SPURR, Idle_{PURR, SPURR} values
To: powerpc-utils-devel@googlegroups.com
Cc: Tyrel Datwyler <tyreld@linux.ibm.com>,
Nathan Lynch <nathanl@linux.ibm.com>,
Naveen N . Rao <naveen.n.rao@linux.vnet.ibm.com>,
Gautham R . Shenoy <ego@linux.vnet.ibm.com>,
Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
Parse per-cpu
/sys/devices/system/cpu/cpu/{spurr, idle_purr, idle_spurr} files to
accumulate system wide SPURR, Idle PURR, Idle SPURR values like
PURR value captured in /proc/powerpc/lparcfg. Calculating scaled
utilization metrics, need them.
Signed-off-by: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
---
src/lparstat.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++
src/lparstat.h | 11 +++++++++
2 files changed, 71 insertions(+)
diff --git a/src/lparstat.c b/src/lparstat.c
index f5c0ce5..7c55a8c 100644
--- a/src/lparstat.c
+++ b/src/lparstat.c
@@ -165,6 +165,61 @@ error:
return -1;
}
+int parse_sysfs_values(void)
+{
+ unsigned long long spurr, idle_spurr, idle_purr, value;
+ char line[SYSDATA_VALUE_SZ];
+ struct sysentry *se;
+ int i, rc;
+
+ spurr = idle_spurr = idle_purr = 0UL;
+
+ for (i = 0; cpu_sysfs_fds[i].spurr > 0; i++) {
+ rc = pread(cpu_sysfs_fds[i].spurr, (void *)line, sizeof(line), 0);
+ if (rc == -1) {
+ fprintf(stderr, "Failed to /sys/devices/system/cpu/cpu%d/spurr\n",
+ cpu_sysfs_fds[i].cpu);
+ goto error;
+ }
+
+ value = strtoll(line, NULL, 16);
+ spurr += value;
+
+ rc = pread(cpu_sysfs_fds[i].idle_purr, (void *)line, sizeof(line), 0);
+ if (rc == -1) {
+ fprintf(stderr, "Failed to /sys/devices/system/cpu/cpu%d/idle_purr\n",
+ cpu_sysfs_fds[i].cpu);
+ goto error;
+ }
+
+ value = strtoll(line, NULL, 16);
+ idle_purr += value;
+
+ rc = pread(cpu_sysfs_fds[i].idle_spurr, (void *)line, sizeof(line), 0);
+ if (rc == -1) {
+ fprintf(stderr, "Failed to /sys/devices/system/cpu/cpu%d/idle_spurr\n",
+ cpu_sysfs_fds[i].cpu);
+ goto error;
+ }
+
+ value = strtoll(line, NULL, 16);
+ idle_spurr += value;
+ }
+
+ se = get_sysentry("spurr");
+ sprintf(se->value, "%llu", spurr);
+ se = get_sysentry("idle_purr");
+ sprintf(se->value, "%llu", idle_purr);
+ se = get_sysentry("idle_spurr");
+ sprintf(se->value, "%llu", idle_spurr);
+
+ return 0;
+
+error:
+ close_cpu_sysfs_fds(threads_in_system);
+ return -1;
+}
+
static void sig_int_handler(int signal)
{
close_cpu_sysfs_fds(threads_in_system);
@@ -750,11 +805,16 @@ void init_sysinfo(void)
void init_sysdata(void)
{
+ int rc = 0;
+
get_time();
parse_lparcfg();
parse_proc_stat();
parse_proc_ints();
get_time_base();
+ rc = parse_sysfs_values();
+ if (rc)
+ exit(rc);
}
void update_sysdata(void)
diff --git a/src/lparstat.h b/src/lparstat.h
index 617737b..eec59d6 100644
--- a/src/lparstat.h
+++ b/src/lparstat.h
@@ -266,6 +266,17 @@ struct sysentry system_data[] = {
.descr = "System Uptime",
.get = &get_sys_uptime},
+ /* /sys/devices/system/cpu/cpu<n>/ */
+ /* Sum of per CPU SPURR registers */
+ {.name = "spurr",
+ .descr = "Scaled Processor Utilization Resource Register"},
+ /* Sum of per CPU Idle PURR Values */
+ {.name = "idle_purr",
+ .descr = "Processor Utilization Resource Idle Values"},
+ /* Sum of per CPU Idle SPURR Values */
+ {.name = "idle_spurr",
+ .descr = "Scaled Processor Utilization Resource Idle Values"},
+
{.name[0] = '\0'},
};
--
2.25.3

View File

@ -1,51 +0,0 @@
From b79f34df37d605954beaa381e6309d50386434b2 Mon Sep 17 00:00:00 2001
Message-Id: <b79f34df37d605954beaa381e6309d50386434b2.1587532692.git.kamalesh@linux.vnet.ibm.com>
In-Reply-To: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
References: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
From: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
Date: Tue, 21 Apr 2020 08:02:51 -0500
Subject: [PATCH V4 07/14] lparstat: Add helper function to calculate delta
To: powerpc-utils-devel@googlegroups.com
Cc: Tyrel Datwyler <tyreld@linux.ibm.com>,
Nathan Lynch <nathanl@linux.ibm.com>,
Naveen N . Rao <naveen.n.rao@linux.vnet.ibm.com>,
Gautham R . Shenoy <ego@linux.vnet.ibm.com>,
Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
Add a helper function for one of the most often used arithmetics of
calculating delta of a sysentry.
Signed-off-by: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
---
src/lparstat.c | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/src/lparstat.c b/src/lparstat.c
index 7c55a8c..152e5fa 100644
--- a/src/lparstat.c
+++ b/src/lparstat.c
@@ -226,6 +226,21 @@ static void sig_int_handler(int signal)
exit(1);
}
+long long get_delta_value(char *se_name)
+{
+ long long value, old_value;
+ struct sysentry *se;
+
+ se = get_sysentry(se_name);
+ if (se->value[0] == '\0')
+ return 0LL;
+
+ value = strtoll(se->value, NULL, 0);
+ old_value = strtoll(se->old_value, NULL, 0);
+
+ return (value - old_value);
+}
+
void get_time()
{
struct timeval t;
--
2.25.3

View File

@ -1,89 +0,0 @@
From 9f4055e95380a19a824f13cd3e629d2e73be075f Mon Sep 17 00:00:00 2001
Message-Id: <9f4055e95380a19a824f13cd3e629d2e73be075f.1587532692.git.kamalesh@linux.vnet.ibm.com>
In-Reply-To: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
References: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
From: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
Date: Tue, 21 Apr 2020 08:05:45 -0500
Subject: [PATCH V4 08/14] lparstat: Derive effective frequency
To: powerpc-utils-devel@googlegroups.com
Cc: Tyrel Datwyler <tyreld@linux.ibm.com>,
Nathan Lynch <nathanl@linux.ibm.com>,
Naveen N . Rao <naveen.n.rao@linux.vnet.ibm.com>,
Gautham R . Shenoy <ego@linux.vnet.ibm.com>,
Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
Effective/current operating frequency is derived by following:
Effective frequency = (delta SPURR / delta PURR) * nominal frequency
it required to calculate the scaled variants using SPURR, whereas
the currently computed values based on the PURR.
performed.
Effective frequency is derived from PURR/SPURR values, hence call
get_frequency() after function updating sysfs values.
Signed-off-by: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
---
src/lparstat.c | 23 +++++++++++++++++++++++
src/lparstat.h | 3 +++
2 files changed, 26 insertions(+)
diff --git a/src/lparstat.c b/src/lparstat.c
index 152e5fa..0f9dffc 100644
--- a/src/lparstat.c
+++ b/src/lparstat.c
@@ -352,6 +352,28 @@ int get_nominal_frequency(void)
return 0;
}
+void get_effective_frequency()
+{
+ struct sysentry *se;
+ double delta_purr, delta_spurr;
+ double nominal_freq, effective_freq;
+
+ se = get_sysentry("nominal_freq");
+ nominal_freq = strtol(se->value, NULL, 10);
+
+ /*
+ * Calculate the Effective Frequency (EF)
+ * EF = (delta SPURR / delta PURR) * nominal frequency
+ */
+ delta_purr = get_delta_value("purr");
+ delta_spurr = get_delta_value("spurr");
+
+ effective_freq = (delta_spurr / delta_purr) * nominal_freq;
+
+ se = get_sysentry("effective_freq");
+ sprintf(se->value, "%f", effective_freq);
+}
+
void get_cpu_physc(struct sysentry *unused_se, char *buf)
{
struct sysentry *se;
@@ -830,6 +852,7 @@ void init_sysdata(void)
rc = parse_sysfs_values();
if (rc)
exit(rc);
+ get_effective_frequency();
}
void update_sysdata(void)
diff --git a/src/lparstat.h b/src/lparstat.h
index eec59d6..5e91d67 100644
--- a/src/lparstat.h
+++ b/src/lparstat.h
@@ -256,6 +256,9 @@ struct sysentry system_data[] = {
.descr = "Timebase"},
{.name = "nominal_freq",
.descr = "Nominal Frequency"},
+ /* derived from nominal freq */
+ {.name = "effective_freq",
+ .descr = "Effective Frequency"},
/* /proc/interrupts */
{.name = "phint",
--
2.25.3

View File

@ -1,57 +0,0 @@
From 39cb3fba241a3fa77be3b3065e638aa4d807dae7 Mon Sep 17 00:00:00 2001
Message-Id: <39cb3fba241a3fa77be3b3065e638aa4d807dae7.1587532692.git.kamalesh@linux.vnet.ibm.com>
In-Reply-To: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
References: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
From: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
Date: Tue, 21 Apr 2020 08:06:40 -0500
Subject: [PATCH V4 09/14] lparstat: Add helper to calculate scaled timebase
To: powerpc-utils-devel@googlegroups.com
Cc: Tyrel Datwyler <tyreld@linux.ibm.com>,
Nathan Lynch <nathanl@linux.ibm.com>,
Naveen N . Rao <naveen.n.rao@linux.vnet.ibm.com>,
Gautham R . Shenoy <ego@linux.vnet.ibm.com>,
Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
Timebase is used to derive system wide CPU utilization, scale it to
the number of online cores too like the PURR/SPURR registers values
accumulated across all online CPU cores. This helper also scales the
timebase register value to the interval passed.
Timebase = (Timebase * Elapsed Time) * online cores
Signed-off-by: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
---
src/lparstat.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/src/lparstat.c b/src/lparstat.c
index 0f9dffc..7628afa 100644
--- a/src/lparstat.c
+++ b/src/lparstat.c
@@ -294,6 +294,23 @@ int get_time_base()
return 0;
}
+double get_scaled_tb(void)
+{
+ double elapsed, timebase;
+ struct sysentry *se;
+ int online_cores;
+
+ se = get_sysentry("online_cores");
+ online_cores = atoi(se->value);
+
+ elapsed = elapsed_time() / 1000000.0;
+
+ se = get_sysentry("timebase");
+ timebase = atoi(se->value);
+
+ return (timebase * elapsed) * online_cores;
+}
+
void get_sys_uptime(struct sysentry *unused_se, char *uptime)
{
FILE *f;
--
2.25.3

View File

@ -1,164 +0,0 @@
From ec05852c7d2e10c924e9521c32fe002e0f8cde71 Mon Sep 17 00:00:00 2001
Message-Id: <ec05852c7d2e10c924e9521c32fe002e0f8cde71.1587532692.git.kamalesh@linux.vnet.ibm.com>
In-Reply-To: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
References: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
From: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
Date: Tue, 21 Apr 2020 08:08:12 -0500
Subject: [PATCH V4 10/14] lparstat: Add helpers to derive PURR/SPURR values
To: powerpc-utils-devel@googlegroups.com
Cc: Tyrel Datwyler <tyreld@linux.ibm.com>,
Nathan Lynch <nathanl@linux.ibm.com>,
Naveen N . Rao <naveen.n.rao@linux.vnet.ibm.com>,
Gautham R . Shenoy <ego@linux.vnet.ibm.com>,
Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
For every interval specified by the user, the PURR/SPURR delta values
are needed to be calculated. Add helpers to derive them.
Signed-off-by: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
---
src/lparstat.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++
src/lparstat.h | 22 +++++++++++++
2 files changed, 109 insertions(+)
diff --git a/src/lparstat.c b/src/lparstat.c
index 7628afa..84a6544 100644
--- a/src/lparstat.c
+++ b/src/lparstat.c
@@ -471,6 +471,93 @@ void get_cpu_app(struct sysentry *unused_se, char *buf)
sprintf(buf, "%.2f", app);
}
+static double round_off_freq(void)
+{
+ double effective_freq, nominal_freq, freq;
+ struct sysentry *se;
+
+ se = get_sysentry("effective_freq");
+ effective_freq = strtod(se->value, NULL);
+
+ se = get_sysentry("nominal_freq");
+ nominal_freq = strtod(se->value, NULL);
+
+ freq = ((int)((effective_freq/nominal_freq * 100)+ 0.44) -
+ (effective_freq/nominal_freq * 100)) /
+ (effective_freq/nominal_freq * 100) * 100;
+
+ return freq;
+}
+
+void get_cpu_util_purr(struct sysentry *unused_se, char *buf)
+{
+ double delta_tb, delta_purr, delta_idle_purr;
+ double physc;
+
+ delta_tb = get_scaled_tb();
+ delta_purr = get_delta_value("purr");
+ delta_idle_purr = get_delta_value("idle_purr");
+
+ physc = (delta_purr - delta_idle_purr) / delta_tb;
+ physc *= 100.00;
+
+ sprintf(buf, "%.2f", physc);
+}
+
+void get_cpu_idle_purr(struct sysentry *unused_se, char *buf)
+{
+ double delta_tb, delta_purr, delta_idle_purr;
+ double physc, idle;
+
+ delta_tb = get_scaled_tb();
+ delta_purr = get_delta_value("purr");
+ delta_idle_purr = get_delta_value("idle_purr");
+
+ physc = (delta_purr - delta_idle_purr) / delta_tb;
+ idle = (delta_purr / delta_tb) - physc;
+ idle *= 100.00;
+
+ sprintf(buf, "%.2f", idle);
+}
+
+void get_cpu_util_spurr(struct sysentry *unused_se, char *buf)
+{
+ double delta_tb, delta_spurr, delta_idle_spurr;
+ double physc, rfreq;
+
+ delta_tb = get_scaled_tb();
+ delta_spurr = get_delta_value("spurr");
+ delta_idle_spurr = get_delta_value("idle_spurr");
+
+ physc = (delta_spurr - delta_idle_spurr) / delta_tb;
+ physc *= 100.00;
+
+ rfreq = round_off_freq();
+ physc += ((physc * rfreq) / 100);
+
+ sprintf(buf, "%.2f", physc);
+}
+
+void get_cpu_idle_spurr(struct sysentry *unused_se, char *buf)
+{
+ double delta_tb, delta_spurr, delta_idle_spurr;
+ double physc, idle;
+ double rfreq;
+
+ delta_tb = get_scaled_tb();
+ delta_spurr = get_delta_value("spurr");
+ delta_idle_spurr = get_delta_value("idle_spurr");
+
+ physc = (delta_spurr - delta_idle_spurr) / delta_tb;
+ idle = (delta_spurr / delta_tb) - physc;
+ idle *= 100.00;
+
+ rfreq = round_off_freq();
+ idle += ((idle * rfreq) / 100);
+
+ sprintf(buf, "%.2f", idle);
+}
+
int parse_lparcfg()
{
FILE *f;
diff --git a/src/lparstat.h b/src/lparstat.h
index 5e91d67..9b7117f 100644
--- a/src/lparstat.h
+++ b/src/lparstat.h
@@ -60,6 +60,10 @@ extern void get_cpu_physc(struct sysentry *, char *);
extern void get_per_entc(struct sysentry *, char *);
extern void get_cpu_app(struct sysentry *, char *);
extern void get_sys_uptime(struct sysentry *, char *);
+extern void get_cpu_util_purr(struct sysentry *unused_se, char *buf);
+extern void get_cpu_idle_purr(struct sysentry *unused_se, char *buf);
+extern void get_cpu_util_spurr(struct sysentry *unused_se, char *buf);
+extern void get_cpu_idle_spurr(struct sysentry *uunused_se, char *buf);
struct sysentry system_data[] = {
/* System Names */
@@ -280,6 +284,24 @@ struct sysentry system_data[] = {
{.name = "idle_spurr",
.descr = "Scaled Processor Utilization Resource Idle Values"},
+ /* Dervied from above sysfs values */
+ /* PURR Utilization */
+ {.name = "purr_cpu_util",
+ .descr = "Physical CPU consumed - PURR",
+ .get = &get_cpu_util_purr},
+ /* PURR Idle time */
+ {.name = "purr_cpu_idle",
+ .descr = "Idle CPU value - PURR",
+ .get = &get_cpu_idle_purr},
+ /* SPURR Utilization */
+ {.name = "spurr_cpu_util",
+ .descr = "Physical CPU consumed - SPURR",
+ .get = &get_cpu_util_spurr},
+ /* SPURR Idle time */
+ {.name = "spurr_cpu_idle",
+ .descr = "Idle CPU value - SPURR",
+ .get = &get_cpu_idle_spurr},
+
{.name[0] = '\0'},
};
--
2.25.3

View File

@ -1,66 +0,0 @@
From 1b176657dea3da2fc8b2c00bf6f0d8b25c92ee74 Mon Sep 17 00:00:00 2001
Message-Id: <1b176657dea3da2fc8b2c00bf6f0d8b25c92ee74.1587532692.git.kamalesh@linux.vnet.ibm.com>
In-Reply-To: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
References: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
From: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
Date: Tue, 21 Apr 2020 08:09:12 -0500
Subject: [PATCH V4 11/14] lparstat: Move displaying system configuration
details to new func
To: powerpc-utils-devel@googlegroups.com
Cc: Tyrel Datwyler <tyreld@linux.ibm.com>,
Nathan Lynch <nathanl@linux.ibm.com>,
Naveen N . Rao <naveen.n.rao@linux.vnet.ibm.com>,
Gautham R . Shenoy <ego@linux.vnet.ibm.com>,
Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
System configuration details is required while displaying the
scaled metrics too. Move it to a new function, to be called by both
default, scaled metrics too.
Signed-off-by: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
---
src/lparstat.c | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/src/lparstat.c b/src/lparstat.c
index 84a6544..3768b79 100644
--- a/src/lparstat.c
+++ b/src/lparstat.c
@@ -989,16 +989,13 @@ int print_iflag_data()
return 0;
}
-void print_default_output(int interval, int count)
+void print_system_configuration(void)
{
- char *fmt = "%5s %5s %5s %8s %8s %5s %5s %5s %5s %5s\n";
char *descr;
char buf[128];
int offset, smt, active_proc;
char type[32];
char value[32];
- char user[32], sys[32], wait[32], idle[32], physc[32], entc[32];
- char lbusy[32], app[32], vcsw[32], phint[32];
memset(buf, 0, 128);
get_sysdata("shared_processor_mode", &descr, value);
@@ -1031,6 +1028,16 @@ void print_default_output(int interval, int count)
offset += sprintf(buf + offset, "ent=%s ", value);
fprintf(stdout, "\nSystem Configuration\n%s\n\n", buf);
+}
+
+void print_default_output(int interval, int count)
+{
+ char *fmt = "%5s %5s %5s %8s %8s %5s %5s %5s %5s %5s\n";
+ char *descr;
+ char user[32], sys[32], wait[32], idle[32], physc[32], entc[32];
+ char lbusy[32], app[32], vcsw[32], phint[32];
+
+ print_system_configuration();
fprintf(stdout, fmt, "\%user", "\%sys", "\%wait", "\%idle", "physc",
"\%entc", "lbusy", "app", "vcsw", "phint");
--
2.25.3

View File

@ -1,161 +0,0 @@
From 9ffdec9aca02761034cd5e87d8f6da0b54a4f770 Mon Sep 17 00:00:00 2001
Message-Id: <9ffdec9aca02761034cd5e87d8f6da0b54a4f770.1587532692.git.kamalesh@linux.vnet.ibm.com>
In-Reply-To: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
References: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
From: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
Date: Tue, 21 Apr 2020 08:15:25 -0500
Subject: [PATCH V4 12/14] lparstat: Add switch to print Scaled metrics
To: powerpc-utils-devel@googlegroups.com
Cc: Tyrel Datwyler <tyreld@linux.ibm.com>,
Nathan Lynch <nathanl@linux.ibm.com>,
Naveen N . Rao <naveen.n.rao@linux.vnet.ibm.com>,
Gautham R . Shenoy <ego@linux.vnet.ibm.com>,
Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
Add '-E' command line switch to print scaled version of meterics, this
switch prints CPU utilization/Idle based on Actual (PURR) and Scaled
(SPURR) values along with the current effective frequency of the system.
output:
~ # lparstat -E 1 3
System Configuration
type=Dedicated mode=Capped smt=8 lcpu=2 mem=4324928 kB cpus=0 ent=2.00
---Actual--- -Normalized-
%busy %idle Frequency %busy %idle
------ ------ ------------- ------ ------
0.10 99.90 2.13GHz[ 70%] 0.10 69.91
0.07 99.92 2.10GHz[ 69%] 0.05 68.95
0.08 99.92 2.10GHz[ 69%] 0.05 68.95
Signed-off-by: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
---
src/lparstat.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 57 insertions(+), 4 deletions(-)
diff --git a/src/lparstat.c b/src/lparstat.c
index 3768b79..5390b9f 100644
--- a/src/lparstat.c
+++ b/src/lparstat.c
@@ -40,6 +40,7 @@
#define SE_NOT_VALID "-"
static bool o_legacy = false;
+static bool o_scaled = false;
static int threads_per_cpu;
static int cpus_in_system;
@@ -928,6 +929,10 @@ void init_sysinfo(void)
exit(rc);
}
+ /* refer to init_sysdata for explanation */
+ if (!o_scaled)
+ return;
+
get_online_cores();
rc = get_nominal_frequency();
@@ -953,6 +958,12 @@ void init_sysdata(void)
parse_proc_stat();
parse_proc_ints();
get_time_base();
+
+ /* Skip reading spurr, purr, idle_{purr,spurr} and calculating
+ * effective frequency for default option */
+ if (!o_scaled)
+ return;
+
rc = parse_sysfs_values();
if (rc)
exit(rc);
@@ -1067,6 +1078,42 @@ void print_default_output(int interval, int count)
} while (--count > 0);
}
+void print_scaled_output(int interval, int count)
+{
+ char purr[32], purr_idle[32], spurr[32], spurr_idle[32];
+ char nominal_f[32], effective_f[32];
+ double nominal_freq, effective_freq;
+ char *descr;
+
+ print_system_configuration();
+
+ fprintf(stdout, "---Actual--- -Normalized-\n");
+ fprintf(stdout, "%%busy %%idle Frequency %%busy %%idle\n");
+ fprintf(stdout, "------ ------ ------------- ------ ------\n");
+ do {
+ if (interval) {
+ sleep(interval);
+ update_sysdata();
+ }
+
+ get_sysdata("purr_cpu_util", &descr, purr);
+ get_sysdata("purr_cpu_idle", &descr, purr_idle);
+ get_sysdata("spurr_cpu_util", &descr, spurr);
+ get_sysdata("spurr_cpu_idle", &descr, spurr_idle);
+ get_sysdata("nominal_freq", &descr, nominal_f);
+ get_sysdata("effective_freq", &descr, effective_f);
+ nominal_freq = strtod(nominal_f, NULL);
+ effective_freq = strtod(effective_f, NULL);
+
+ fprintf(stdout, "%6s %6s %5.2fGHz[%3d%%] %6s %6s\n",
+ purr, purr_idle,
+ effective_freq/1000,
+ (int)((effective_freq/nominal_freq * 100)+ 0.44 ),
+ spurr, spurr_idle );
+ fflush(stdout);
+ } while (--count > 0);
+}
+
static void usage(void)
{
printf("Usage: lparstat [ options ]\n\tlparstat <interval> [ count ]\n\n"
@@ -1074,6 +1121,7 @@ static void usage(void)
"\t-h, --help Show this message and exit.\n"
"\t-V, --version \tDisplay lparstat version information.\n"
"\t-i Lists details on the LPAR configuration.\n"
+ "\t-E Print SPURR metrics.\n"
"\t-l, --legacy Print the report in legacy format.\n"
"interval The interval parameter specifies the amount of time between each report.\n"
"count The count parameter specifies how many reports will be displayed.\n");
@@ -1098,7 +1146,7 @@ int main(int argc, char *argv[])
exit(1);
}
- while ((c = getopt_long(argc, argv, "iVhl",
+ while ((c = getopt_long(argc, argv, "iEVhl",
long_opts, &opt_index)) != -1) {
switch(c) {
case 'i':
@@ -1107,6 +1155,9 @@ int main(int argc, char *argv[])
case 'l':
o_legacy = true;
break;
+ case 'E':
+ o_scaled = true;
+ break;
case 'V':
printf("lparstat - %s\n", VERSION);
return 0;
@@ -1134,9 +1185,11 @@ int main(int argc, char *argv[])
if (i_option)
print_iflag_data();
- else
+ else if (o_scaled) {
+ print_scaled_output(interval, count);
+ close_cpu_sysfs_fds(threads_in_system);
+ } else {
print_default_output(interval, count);
-
- close_cpu_sysfs_fds(threads_in_system);
+ }
return 0;
}
--
2.25.3

View File

@ -1,177 +0,0 @@
From 179d461b79387bd3877cd239da933a8dfceae05c Mon Sep 17 00:00:00 2001
Message-Id: <179d461b79387bd3877cd239da933a8dfceae05c.1587532692.git.kamalesh@linux.vnet.ibm.com>
In-Reply-To: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
References: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
From: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
Date: Tue, 21 Apr 2020 08:23:24 -0500
Subject: [PATCH V4 13/14] lparstat: Add support for cpu-hotplug
To: powerpc-utils-devel@googlegroups.com
Cc: Tyrel Datwyler <tyreld@linux.ibm.com>,
Nathan Lynch <nathanl@linux.ibm.com>,
Naveen N . Rao <naveen.n.rao@linux.vnet.ibm.com>,
Gautham R . Shenoy <ego@linux.vnet.ibm.com>,
Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
For optimizing the read of sysfs file, the file descriptors are
assigned at the beginning of the run but they do not change dynamically
in event of a cpu hotplug, resulting under-estimated load average in
case of new cpus onlined or error in case of cpu removed. This can be
solved by checking for the online cpus every interval and re-assign
the file descriptors again with new set of cpu on hotplug event.
Signed-off-by: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
---
src/lparstat.c | 78 +++++++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 71 insertions(+), 7 deletions(-)
diff --git a/src/lparstat.c b/src/lparstat.c
index 5390b9f..51caa3d 100644
--- a/src/lparstat.c
+++ b/src/lparstat.c
@@ -21,6 +21,7 @@
* @author Nathan Fontenot <nfont@linux.vnet.ibm.com>
*/
+#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
@@ -28,6 +29,7 @@
#include <getopt.h>
#include <unistd.h>
#include <fcntl.h>
+#include <sched.h>
#include <signal.h>
#include <sys/stat.h>
#include <sys/time.h>
@@ -47,6 +49,7 @@ static int cpus_in_system;
static int threads_in_system;
static cpu_sysfs_fd *cpu_sysfs_fds;
+static cpu_set_t *online_cpus;
struct sysentry *get_sysentry(char *name)
{
@@ -180,7 +183,7 @@ int parse_sysfs_values(void)
if (rc == -1) {
fprintf(stderr, "Failed to /sys/devices/system/cpu/cpu%d/spurr\n",
cpu_sysfs_fds[i].cpu);
- goto error;
+ goto check_cpu_hotplug;
}
value = strtoll(line, NULL, 16);
@@ -190,7 +193,7 @@ int parse_sysfs_values(void)
if (rc == -1) {
fprintf(stderr, "Failed to /sys/devices/system/cpu/cpu%d/idle_purr\n",
cpu_sysfs_fds[i].cpu);
- goto error;
+ goto check_cpu_hotplug;
}
value = strtoll(line, NULL, 16);
@@ -200,7 +203,7 @@ int parse_sysfs_values(void)
if (rc == -1) {
fprintf(stderr, "Failed to /sys/devices/system/cpu/cpu%d/idle_spurr\n",
cpu_sysfs_fds[i].cpu);
- goto error;
+ goto check_cpu_hotplug;
}
value = strtoll(line, NULL, 16);
@@ -216,9 +219,11 @@ int parse_sysfs_values(void)
return 0;
-error:
- close_cpu_sysfs_fds(threads_in_system);
- return -1;
+check_cpu_hotplug:
+ if(!cpu_online(cpu_sysfs_fds[i].cpu))
+ return 1;
+
+ return rc;
}
static void sig_int_handler(int signal)
@@ -917,6 +922,52 @@ void get_cpu_stat(struct sysentry *se, char *buf)
sprintf(buf, "%.2f", percent);
}
+int has_cpu_topology_changed(void)
+{
+ int i, changed = 1;
+ cpu_set_t *tmp_cpuset;
+ size_t online_cpus_size = CPU_ALLOC_SIZE(threads_in_system);
+
+ if (!online_cpus) {
+ online_cpus = CPU_ALLOC(threads_in_system);
+ if (!online_cpus) {
+ fprintf(stderr, "Failed to allocate memory for cpu_set\n");
+ return -1;
+ }
+
+ CPU_ZERO_S(online_cpus_size, online_cpus);
+
+ for (i = 0; i < threads_in_system; i++) {
+ if (!cpu_online(i))
+ continue;
+ CPU_SET_S(i, online_cpus_size, online_cpus);
+ }
+
+ return changed;
+ }
+
+ tmp_cpuset = CPU_ALLOC(threads_in_system);
+ if (!tmp_cpuset) {
+ fprintf(stderr, "Failed to allocate memory for cpu_set\n");
+ return -1;
+ }
+
+ CPU_ZERO_S(online_cpus_size, tmp_cpuset);
+
+ for (i = 0; i < threads_in_system; i++) {
+ if (!cpu_online(i))
+ continue;
+ CPU_SET_S(i, online_cpus_size, tmp_cpuset);
+ }
+
+ changed = CPU_EQUAL_S(online_cpus_size, online_cpus, tmp_cpuset);
+
+ CPU_FREE(online_cpus);
+ online_cpus = tmp_cpuset;
+
+ return changed;
+}
+
void init_sysinfo(void)
{
int rc = 0;
@@ -964,10 +1015,23 @@ void init_sysdata(void)
if (!o_scaled)
return;
+ rc = has_cpu_topology_changed();
+ if (!rc)
+ goto cpu_hotplug_restart;
+
rc = parse_sysfs_values();
- if (rc)
+ if (rc == -1)
exit(rc);
+ else if (rc)
+ goto cpu_hotplug_restart;
+
get_effective_frequency();
+
+ return;
+
+cpu_hotplug_restart:
+ close_cpu_sysfs_fds(threads_in_system);
+ init_sysinfo();
}
void update_sysdata(void)
--
2.25.3

View File

@ -1,148 +0,0 @@
From 1ee9fc2d08a1a4aa34e17fce2234ba5abec9b4ae Mon Sep 17 00:00:00 2001
Message-Id: <1ee9fc2d08a1a4aa34e17fce2234ba5abec9b4ae.1587532692.git.kamalesh@linux.vnet.ibm.com>
In-Reply-To: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
References: <cover.1587532692.git.kamalesh@linux.vnet.ibm.com>
From: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
Date: Tue, 21 Apr 2020 08:24:43 -0500
Subject: [PATCH V4 14/14] lparstat: Use get_delta_value() helper
To: powerpc-utils-devel@googlegroups.com
Cc: Tyrel Datwyler <tyreld@linux.ibm.com>,
Nathan Lynch <nathanl@linux.ibm.com>,
Naveen N . Rao <naveen.n.rao@linux.vnet.ibm.com>,
Gautham R . Shenoy <ego@linux.vnet.ibm.com>,
Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
Use get_delta_value(), helper, to calculate the delta of interested
values instead of duplicating it in various functions. This reduces
the amount of duplication and makes code more readable.
Signed-off-by: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
---
src/lparstat.c | 61 ++++++++++++++------------------------------------
1 file changed, 17 insertions(+), 44 deletions(-)
diff --git a/src/lparstat.c b/src/lparstat.c
index 51caa3d..29e6365 100644
--- a/src/lparstat.c
+++ b/src/lparstat.c
@@ -259,18 +259,6 @@ void get_time()
(long long)t.tv_sec * 1000000LL + (long long)t.tv_usec);
}
-long long elapsed_time()
-{
- long long newtime, oldtime = 0;
- struct sysentry *se;
-
- se = get_sysentry("time");
- newtime = strtoll(se->value, NULL, 0);
- oldtime = strtoll(se->old_value, NULL, 0);
-
- return newtime - oldtime;
-}
-
int get_time_base()
{
FILE *f;
@@ -309,7 +297,8 @@ double get_scaled_tb(void)
se = get_sysentry("online_cores");
online_cores = atoi(se->value);
- elapsed = elapsed_time() / 1000000.0;
+ elapsed = get_delta_value("time");
+ elapsed = elapsed / 1000000.0;
se = get_sysentry("timebase");
timebase = atoi(se->value);
@@ -401,27 +390,25 @@ void get_cpu_physc(struct sysentry *unused_se, char *buf)
{
struct sysentry *se;
float elapsed;
- float new_purr, old_purr;
+ float delta_purr;
float timebase, physc;
- float new_tb, old_tb;
+ float delta_tb;
- se = get_sysentry("purr");
- new_purr = strtoll(se->value, NULL, 0);
- old_purr = strtoll(se->old_value, NULL, 0);
+ delta_purr = get_delta_value("purr");
se = get_sysentry("tbr");
if (se->value[0] != '\0') {
- new_tb = strtoll(se->value, NULL, 0);
- old_tb = strtoll(se->old_value, NULL, 0);
+ delta_tb = get_delta_value("tbr");
- physc = (new_purr - old_purr) / (new_tb - old_tb);
+ physc = delta_purr / delta_tb;
} else {
- elapsed = elapsed_time() / 1000000.0;
+ elapsed = get_delta_value("time");
+ elapsed = elapsed / 1000000.0;
se = get_sysentry("timebase");
timebase = atoi(se->value);
- physc = (new_purr - old_purr)/timebase/elapsed;
+ physc = delta_purr/timebase/elapsed;
}
sprintf(buf, "%.2f", physc);
@@ -443,7 +430,7 @@ void get_cpu_app(struct sysentry *unused_se, char *buf)
{
struct sysentry *se;
float timebase, app, elapsed_time;
- long long new_app, old_app, newtime, oldtime;
+ long long new_app, old_app, delta_time;
char *descr, uptime[32];
se = get_sysentry("time");
@@ -457,9 +444,8 @@ void get_cpu_app(struct sysentry *unused_se, char *buf)
}
elapsed_time = atof(uptime);
} else {
- newtime = strtoll(se->value, NULL, 0);
- oldtime = strtoll(se->old_value, NULL, 0);
- elapsed_time = (newtime - oldtime) / 1000000.0;
+ delta_time = get_delta_value("time");
+ elapsed_time = delta_time / 1000000.0;
}
se = get_sysentry("timebase");
@@ -898,27 +884,14 @@ void get_online_cores(void)
free(core_state);
}
-long long get_cpu_time_diff()
-{
- long long old_total = 0, new_total = 0;
- struct sysentry *se;
-
- se = get_sysentry("cpu_total");
- new_total = strtoll(se->value, NULL, 0);
- old_total = strtoll(se->old_value, NULL, 0);
-
- return new_total - old_total;
-}
-
void get_cpu_stat(struct sysentry *se, char *buf)
{
float percent;
- long long total, old_val, new_val;
+ long long total, delta_val;
- total = get_cpu_time_diff();
- new_val = atoll(se->value);
- old_val = atoll(se->old_value);
- percent = ((new_val - old_val)/(long double)total) * 100;
+ total = get_delta_value("cpu_total");
+ delta_val = get_delta_value(se->name);
+ percent = (delta_val/(long double)total) * 100;
sprintf(buf, "%.2f", percent);
}
--
2.25.3

View File

@ -1,35 +0,0 @@
From ae66fdee8e73ba460b2fbc592f1bc79574c5e02d Mon Sep 17 00:00:00 2001
From: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
Date: Mon, 16 Nov 2015 18:29:17 +0530
Subject: [PATCH] Makefile fix
Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
---
Makefile.am | 10 +++++++++-
Makefile.in | 10 +++++++++-
1 files changed, 9 insertions(+), 1 deletions(-)
diff --git a/Makefile.am b/Makefile.am
index e6be23e..b521794 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -43,7 +43,15 @@ man_MANS = \
man/lsslot.8 \
man/ppc64_cpu.8 \
man/errinjct.8 \
- man/rtas_dbg.8
+ man/rtas_dbg.8 \
+ man/lsdevinfo.8 \
+ man/rtas_event_decode.8 \
+ man/ls-vdev.8 \
+ man/lsprop.8 \
+ man/drmgr.8 \
+ man/ls-veth.8 \
+ man/nvsetenv.8 \
+ man/ls-vscsi.8
EXTRA_DIST += $(bin_SCRIPTS) $(sbin_SCRIPTS) $(man_MANS)
--
2.1.0

View File

@ -1,14 +0,0 @@
diff -up powerpc-utils-1.3.5/Makefile.am.me powerpc-utils-1.3.5/Makefile.am
--- powerpc-utils-1.3.5/Makefile.am.me 2018-11-30 16:51:45.760141937 +0100
+++ powerpc-utils-1.3.5/Makefile.am 2018-11-30 17:09:07.396294356 +0100
@@ -52,7 +52,9 @@ man_MANS = \
man/drmgr.8 \
man/ls-veth.8 \
man/nvsetenv.8 \
- man/ls-vscsi.8
+ man/ls-vscsi.8 \
+ man/pseries_platform.8 \
+ man/update_flash_nv.8
EXTRA_DIST += $(bin_SCRIPTS) $(sbin_SCRIPTS) $(man_MANS)

View File

@ -1,12 +0,0 @@
diff -up powerpc-utils-1.3.6/scripts/ofpathname.me powerpc-utils-1.3.6/scripts/ofpathname
--- powerpc-utils-1.3.6/scripts/ofpathname.me 2020-06-24 09:53:03.145041606 +0200
+++ powerpc-utils-1.3.6/scripts/ofpathname 2020-06-24 09:55:11.040981495 +0200
@@ -286,7 +286,7 @@ get_usb_storage_no()
# $3 on_exit behavior on error
goto_dir()
{
- local start_dir=$1
+ local start_dir=$(readlink -f $1)
local fname=$2
local found=0
local on_exit=1

View File

@ -0,0 +1,162 @@
commit 4b2d10942e2d964ecc1fe58c9460c34993ff10be
Author: Mingming Cao <mmc@linux.vnet.ibm.com>
Date: Thu Nov 19 21:38:24 2020 -0800
Disable vnic as backup vdevice for migratable SR_IOV
In version 1.0 we only allow configure ibmveth as
migritable SR_IOV backup vdevice. When ibmvnic become
more stablized we will enable vnic as backup.
Signed-off-by: Mingming Cao <mmc@linux.vnet.ibm.com>
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
diff --git a/scripts/hcnmgr b/scripts/hcnmgr
index 1135a85..0c09d8c 100644
--- a/scripts/hcnmgr
+++ b/scripts/hcnmgr
@@ -37,6 +37,8 @@ DRC_INDEX=0
DEVNAME=""
MODE=""
PHYSLOC=""
+VIO_TYPE=""
+VNIC_SPT=""
# Usage statements
usage() {
@@ -80,6 +82,7 @@ E_EPERM=1 # Platform not supported
E_BUSY=16 # Device busy
E_ENODEV=19 # Failed get device name
E_NOMODULE=5 # Failed to load bonding module
+E_INVAL_DEV=6 # Vdevice not supported
E_ENETUNREACH=101 # No network management command nmcli
#
@@ -93,19 +96,22 @@ err() {
case $eno in
"$E_INVAL")
- e_mesg="$HCNCMD:error code $eno, hybrid network ID HCNID does not exist"
+ e_mesg="$HCNCMD:error code $eno, Hybrid network ID HCNID does not exist"
+ ;;
+ "$E_INVAL_DEV")
+ e_mesg="$HCNCMD:error code $eno, Backing vdevice not supported"
;;
"$E_EPERM")
- e_mesg="$HCNCMD:error code $eno, platform is not supported"
+ e_mesg="$HCNCMD:error code $eno, Platform is not supported"
;;
"$E_BUSY")
- e_mesg="$HCNCMD:error code $eno, network device busy, no backup device"
+ e_mesg="$HCNCMD:error code $eno, Network device busy, no backup device"
;;
"$E_ENODEV")
- e_mesg="$HCNCMD:error code $eno, failed to find device or get device name"
+ e_mesg="$HCNCMD:error code $eno, Failed to find device or get device name"
;;
"$E_NOMODULE")
- e_mesg="$HCNCMD:error code $eno, failed to load bonding module"
+ e_mesg="$HCNCMD:error code $eno, Failed to load bonding module"
;;
"$E_ENETUNREACH")
e_mesg="$HCNCMD:error code $eno, nmcli command not installed"
@@ -147,6 +153,7 @@ hcnlog() {
esac
}
+
# function search_dev:
# Given DRX_INDEX, Search for device-tree, looking for migratable SR_IOV
# backend vnic or ibmveth device to configure hybrid network
@@ -171,6 +178,7 @@ search_dev() {
if [ -e "$dev"/ibm,hcn-id ] && get_dev_hcn "$dev"; then
hcnlog DEBUG "search_dev: found device "
hcnlog DEBUG "search_dev: exit"
+ VIO_TYPE="SRIOV"
return $E_SUCCESS
fi
done
@@ -184,6 +192,7 @@ search_dev() {
if [[ $index == "$1" ]]; then
hcnlog DEBUG "found matching drc_index $index in $dev"
if [ -e "$dev"/ibm,hcn-id ] && get_dev_hcn "$dev"; then
+ VIO_TYPE="VNIC"
hcnlog DEBUG "search_dev: found device "
hcnlog DEBUG "search_dev: exit"
return $E_SUCCESS
@@ -201,6 +210,7 @@ search_dev() {
if [ -e "$dev"/ibm,hcn-id ] && get_dev_hcn "$dev"; then
hcnlog DEBUG "search_dev: found device "
hcnlog DEBUG "search_dev: exit"
+ VIO_TYPE="L_LAN"
return $E_SUCCESS
fi
fi
@@ -340,6 +350,10 @@ do_config_vdevice() {
cfghcn() {
hcnlog DEBUG "cfghcn: enter $1"
search_dev "$1"
+ if [[ $VIO_TYPE == "VNIC" && $VNIC_SPT == "OFF" ]]; then
+ hcnlog WARN "Backing device $VIO_TYPE for Migratable VF is not supported in hcnmgr version $VERSION"
+ err $E_INVAL_DEV
+ fi
do_config_vdevice
return $E_SUCCESS
}
@@ -512,23 +526,10 @@ scanhcn() {
done
done
- hcnlog DEBUG "search vnic device with ibm,hcn-id propterty......"
+ hcnlog DEBUG "search ibmveth device with ibm,hcn-id propterty......"
# Look at every vNIC device with ibm,hcn-id propterty
# join or create bond for this hcnid if not exist, add vnic device as
# slave for this bond accosiated with hcnid, if not already to
- for dev in "$DT_PATH"/vdevice/vnic*; do
- [ -d "$dev" ] || continue
- if [ -e "$dev"/ibm,hcn-id ] && get_dev_hcn "$dev"; then
- hcnlog DEBUG "scanhcn found vnic device with hcnid "
- hcnlog INFO "scanhcn configure HCN and vnic device"
- do_config_vdevice
- fi
- done
-
- # Look at every veth device with ibm,hcn-id propterty
- # join or create bond for this hcnid if not exist, add ibmveth device as
- # slave for this bond accosiated with hcnid, if not already to
- hcnlog DEBUG "search ibmveth device with ibm,hcn-id propterty......"
for dev in "$DT_PATH"/vdevice/l-lan*; do
[ -d "$dev" ] || continue
if [ -e "$dev"/ibm,hcn-id ] && get_dev_hcn "$dev"; then
@@ -538,6 +539,21 @@ scanhcn() {
fi
done
+ if [[ $VNIC_SPT != "OFF" ]]; then
+ hcnlog DEBUG "search vnic device with ibm,hcn-id propterty......"
+ # Look at every vNIC device with ibm,hcn-id propterty
+ # join or create bond for this hcnid if not exist, add vnic device as
+ # slave for this bond accosiated with hcnid, if not already to
+ for dev in "$DT_PATH"/vdevice/vnic*; do
+ [ -d "$dev" ] || continue
+ if [ -e "$dev"/ibm,hcn-id ] && get_dev_hcn "$dev"; then
+ hcnlog DEBUG "scanhcn found vnic device with hcnid "
+ hcnlog INFO "scanhcn configure HCN and vnic device"
+ do_config_vdevice
+ fi
+ done
+ fi
+
# Next clean up dead connections left from orgitinal LPAR after inactive miration
# list of all HCN ids
@@ -583,6 +599,9 @@ fi
if ! nmcli --version >/dev/null 2>&1; then
err $E_ENETUNREACH
fi
+if [[ $VERSION == "1.0" ]]; then
+ VNIC_SPT="OFF"
+fi
#Validate bonding module is loaded
if ! lsmod | grep -q bonding; then

View File

@ -0,0 +1,86 @@
commit e51995667279164a6c8ce4c3ba0217fffda22d6d
Author: Mingming Cao <mmc@linux.vnet.ibm.com>
Date: Thu Nov 19 21:41:31 2020 -0800
Clean up dead network config interface after inactive migration
With inactive parition migration, we found there are
dead network interface asscoiated with the SR_IOV from
source LPAR that still exist.
We need to cleanup the old network interface
related to this devname from source LPAR. Normally
in the active parition migration case, this was done
when HMC issue commands to OS remove the
VF from hybrid network. Because of the inactive
migration, the OS was not notified before migration
that the VF was removed, thus leaves the dead network
interface belongs on the original MVF on source lpar
not cleaned up. This cause the confusion of the network
manager to bring up the bondings with new MVFs at destination
LPAR.
After inactive parition migration the same devname
could possiblily used at the destination LPAR.
It can be assigned to a different hybrid
network (different hcnid). At the OS boot time,
the same devname but with different hcnid will
be configured. However the old network work interface
associated with the same devname from the source LPAR
has not been cleaned up yet.
This patch fix this by during the boot time scan and
if found an VFs has more than two bonding interfaces,
or has old VF ifcfg, removed the expired one.
Signed-off-by: Mingming Cao <mmc@linux.vnet.ibm.com>
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
diff --git a/scripts/hcnmgr b/scripts/hcnmgr
index 0c09d8c..a76505e 100644
--- a/scripts/hcnmgr
+++ b/scripts/hcnmgr
@@ -518,6 +518,27 @@ scanhcn() {
[ -d "$dev" ] || continue
if [ -e "$dev"/ibm,hcn-id ] && get_dev_hcn "$dev"; then
hcnlog DEBUG "scanhcn found sr-iov device with hcnid "
+
+ # After online from inactive migration, destination
+ # LPAR may have same mvf devname but associated with different
+ # bonding than from source LPAR
+ # clean up expired bonding SR_IOV connections
+
+ for cfg in $(ls $IFCONFIG_PATH | grep "$DEVNAME" | grep "bond"); do
+ hid=$(echo "$cfg" | sed -e 's/ifcfg-//' | cut -d '-' -f 1 | sed -e 's/bond//')
+ if [ -e "$IFCONFIG_PATH/ifcfg-$DEVNAME" ]; then
+ rm "$IFCONFIG_PATH/ifcfg-$DEVNAME"
+ fi
+ if [[ $hid != "" && $hid != "$HCNID" ]] ; then
+ hcnlog INFO "Delete dead bonding slave ifcfg file $IFCONFIG_PATH/$cfg"
+ rm $IFCONFIG_PATH/"$cfg"
+ if nmcli -f NAME con show | grep -q "bond$hid-$DEVNAME\s"; then
+ hcnlog INFO "Delete dead bonding connection $connection"
+ nmcli con delete "bond$hid-$DEVNAME"
+ fi
+ fi
+ done
+
hcnlog INFO "scanhcn configure HCN and sr-iov device"
do_config_vdevice
# Save found HCN ids in array HcnIds
@@ -558,13 +579,12 @@ scanhcn() {
# list of all HCN ids
ids="${HcnIds[*]}"
-
# After inactive migration, LPAR may have old bonding connections
# with network device on original LPAR
- # clean up dead bonding connections
+ # clean up dead bonding connections
for connection in $(nmcli -f NAME con show | grep "${ids// /\\|}"); do
dev=$(echo "$connection" | cut -d '-' -f 2)
- if [ ! -e /sys/class/net/"$dev" ]; then
+ if [[ $dev != "NAME" && ! -e /sys/class/net/"$dev" ]]; then
hcnlog INFO "Delete dead bonding connection $connection"
nmcli con delete "$connection"
fi

View File

@ -0,0 +1,94 @@
commit f1ec5f04fdac3e87c3c85c2d85f79339d916e864
Author: Mingming Cao <mmc@linux.vnet.ibm.com>
Date: Thu Nov 19 21:30:40 2020 -0800
HNV fixes for qrydev and remove lsdevinfo
This patch fixes a few issues found during testing:
1) Fix qrydev checking for active interface error
2) Skip collecting lsdevinfo right before migration
When the LPARs has large number of devices, this can
take quite a long time and flood the log message.
3) Wait for OS ready to lookup device name for configure
HNV device. We need give OS longer time to prepare pci
device after DLPAR to show up for ofpathname(). We have
run into several issues HNV issues the hcncfgdrc command
to configure the vdevices before ofpathname able
to find the device name yet.
4) Currently the hybrid network virtualization is only
supported on PowerVM LPAR. We should allow exit the hcnmgr
gracefully on other power platform instead of return error.
Signed-off-by: Mingming Cao <mmc@linux.vnet.ibm.com>
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
diff --git a/scripts/hcnmgr b/scripts/hcnmgr
index e699c6a..1135a85 100644
--- a/scripts/hcnmgr
+++ b/scripts/hcnmgr
@@ -218,7 +218,7 @@ search_dev() {
# $1 path to device-tree device
#
get_dev_hcn() {
- local wait=30
+ local wait=12
local dev=$1
hcnlog DEBUG "get_dev_hcn: enter $1"
@@ -235,7 +235,7 @@ get_dev_hcn() {
fi
hcnlog DEBUG "ofpathname return $?, devname is $DEVNAME rety counter $wait"
- sleep 1
+ sleep 15
((wait--))
if [[ $wait == 0 ]]; then
@@ -393,7 +393,7 @@ qrydev() {
BOND_PATH=$BOND_BASEPATH/$BONDNAME/bonding
hcnlog DEBUG "check if the network interface for this SR_IOV is not up, return success"
- if ! nmcli -f DEVICE con show --active | grep -q "$BONDNAME-$DEVNAME"; then
+ if ! nmcli -f DEVICE con show --active | grep -q "$DEVNAME"; then
hcnlog DEBUG "network connection $BONDNAME-$DEVNAME is inactive or nonexist"
hcnlog DEBUG "HCNID $HCNID devname $DEVNAME mode $MODE physloc $PHYSLOC"
hcnlog DEBUG "qryhcn: exit"
@@ -435,7 +435,6 @@ show_hcnstatus() {
nmcli connection show >>$LOG_FILE
nmcli device status >>$LOG_FILE
ip addr show >>$LOG_FILE
- lsdevinfo >>$LOG_FILE
}
#
@@ -569,10 +568,15 @@ exec &> >(tee -a $LOG_FILE)
NOW=$(date +"%m-%d-%Y %T")
echo "=======================$NOW============================"
+HCNCMD=$(basename "$0")
+hcnlog DEBUG "$HCNCMD enter"
+
#Validate this tool is running on powerpc platform
. "$PSERIES_PLATFORM"
if [ "$platform" != "$PLATFORM_PSERIES_LPAR" ]; then
- err $E_EPERM
+ hcnlog INFO "HNV is only supported on PowerVM LPAR"
+ hcnlog INFO "$HCNCMD exit"
+ exit 0
fi
#Validate NMCLI packages is install to manage networking
@@ -588,9 +592,6 @@ if ! lsmod | grep -q bonding; then
fi
fi
-HCNCMD=$(basename "$0")
-hcnlog DEBUG "$HCNCMD enter"
-
#getops for help and version
while getopts "sVhd:" arg; do
case "$arg" in

View File

@ -0,0 +1,96 @@
commit bfabc531021ee9cfc4c8dd83803e9daf7e45d91e
Author: Mingming Cao <mmc@linux.vnet.ibm.com>
Date: Thu Jan 28 12:49:07 2021 -0800
Fix boot-time bonding interface cleanup and avoid use ifcfg
This patch fix three issues
1) Avoid cleanup bond interface at the boot time when there is no HNV exists
2) Using nmcli instead of ifconfig file to check bond configuration as it
has been officially deprecated. This makes HNV configure bonding
indpendant of where bonding cfg file located.
3) At the time of calling ofpathname to look up for devicename, wait
for sys fs device ready. Otherwise the OS may in the middle of device
renaming.
Signed-off-by: Mingming Cao <mmc@linux.vnet.ibm.com>
diff --git a/scripts/hcnmgr b/scripts/hcnmgr
index a76505e..e4b56d6 100644
--- a/scripts/hcnmgr
+++ b/scripts/hcnmgr
@@ -241,7 +241,10 @@ get_dev_hcn() {
# Let's retry a few times.
while [ $wait != 0 ]; do
if DEVNAME=$(ofpathname -l "$(echo "$1" | sed -e "s/\/proc\/device-tree//")" 2>/dev/null); then
- break
+ if [ -e /sys/class/net/"$DEVNAME" ]; then
+ hcnlog DEBUG "ofpathname waiting for /sys/class/net device $DEVNAME ready"
+ break
+ fi
fi
hcnlog DEBUG "ofpathname return $?, devname is $DEVNAME rety counter $wait"
@@ -278,9 +281,7 @@ do_config_vdevice() {
BOND_PATH=$BOND_BASEPATH/$BONDNAME/bonding
hcnlog DEBUG "Check if there is bond $BONDNAME with hcn id $HCNID"
-
- hcnlog DEBUG "ifconfig file $IFCONFIG_PATH/ifconfig-$BONDNAME"
- if [ ! -e "$IFCONFIG_PATH/ifcfg-$BONDNAME" ]; then
+ if ! nmcli -f NAME con show --active | grep -q "$BONDNAME\s"; then
hcnlog INFO "nmcli con add type bond con-name $BONDNAME ifname $BONDNAME"
nmcli con add type bond con-name "$BONDNAME" ifname "$BONDNAME"
@@ -375,7 +376,10 @@ rmhcn() {
fi
hcnlog INFO "rmhcn: delete bond $BONDNAME and slaves "
- nmcli -f NAME con show | grep "$BONDNAME" | xargs sudo nmcli con delete
+ for connection in $(nmcli -f NAME con show | grep "$BONDNAME"); do
+ hcnlog INFO "Delete bonding connection $connection"
+ nmcli con delete "$connection"
+ done
hcnlog DEBUG "rmhcn: exit"
return $E_SUCCESS
}
@@ -576,19 +580,24 @@ scanhcn() {
fi
# Next clean up dead connections left from orgitinal LPAR after inactive miration
-
- # list of all HCN ids
- ids="${HcnIds[*]}"
- # After inactive migration, LPAR may have old bonding connections
- # with network device on original LPAR
- # clean up dead bonding connections
- for connection in $(nmcli -f NAME con show | grep "${ids// /\\|}"); do
- dev=$(echo "$connection" | cut -d '-' -f 2)
- if [[ $dev != "NAME" && ! -e /sys/class/net/"$dev" ]]; then
- hcnlog INFO "Delete dead bonding connection $connection"
- nmcli con delete "$connection"
- fi
- done
+ # Only do this when the HNV ID array is not empty
+
+ if [[ ${HcnIds[[@]} ]]; then
+ hcnlog INFO "hcnscan finished. Found HNV devices on this LPAR"
+
+ # list of all HCN ids
+ ids="${HcnIds[*]}"
+ # After inactive migration, LPAR may have old bonding connections
+ # with network device on original LPAR
+ # clean up dead bonding connections
+ for connection in $(nmcli -f NAME con show | grep "${ids// /\\|}"); do
+ dev=$(echo "$connection" | cut -d '-' -f 2)
+ if [[ $dev != "NAME" && ! -e /sys/class/net/"$dev" ]]; then
+ hcnlog INFO "Delete dead bonding connection $connection"
+ nmcli con delete "$connection"
+ fi
+ done
+ fi
hcnlog DEBUG "scanhcn: scan for hybrid virtual network finished"
}

View File

@ -0,0 +1,52 @@
diff -up powerpc-utils-1.3.8/man/hcnmgr.8.me powerpc-utils-1.3.8/man/hcnmgr.8
--- powerpc-utils-1.3.8/man/hcnmgr.8.me 2020-10-01 13:09:19.969454947 +0200
+++ powerpc-utils-1.3.8/man/hcnmgr.8 2020-10-01 13:09:29.969148204 +0200
@@ -0,0 +1,35 @@
+.TH hcnmgr "01 October 2020" "Linux" "Linux on Power Service Tools"
+.RS
+hcnmgr contains a set of commands to support migratable SR_IOV logical port.
+The new commands configure/query/remove network devices. New commands should
+be called from the HMC, rather than directly from linux LPAR
+.PP
+Usage: hcncfgdrc DRC_INDEX=<drc_index> [STAKE_TOKEN=NULL] [\fB-d\fP]
+Configure a device to hybrid network HCN
+.PP
+Usage: hcnrmhcn HCN_ID=<hcnid>
+Remove a hybrid network HCN given an HCN ID
+.PP
+Usage: hcnrmdev DRC_INDEX=<drc_index> HCN_ID=<hcnid>
+Unconfigure device from HCN
+.PP
+Usage: hcnqrydev DRC_INDEX=<drc_index> HCN_ID=<hcnid>
+Query a device given a DRC_INDEX or HCN ID
+.PP
+Usage: hcnversion
+get the current version of the HCN support
+.PP
+Optional arguments.
+.RS
+.TP
+.B
+\fB-s\fP
+scan device-tree and configure HCN
+.TP
+.B
+\fB-V\fP
+Display version information and exit
+.TP
+.B
+\fB-h\fP
+Display this help information and exit
diff -up powerpc-utils-1.3.8/Makefile.am.me powerpc-utils-1.3.8/Makefile.am
--- powerpc-utils-1.3.8/Makefile.am.me 2020-10-01 13:33:29.444024403 +0200
+++ powerpc-utils-1.3.8/Makefile.am 2020-10-01 13:34:08.284854506 +0200
@@ -56,7 +56,8 @@ man_MANS = \
man/nvsetenv.8 \
man/ls-vscsi.8 \
man/pseries_platform.8 \
- man/update_flash_nv.8
+ man/update_flash_nv.8 \
+ man/hcnmgr.8
EXTRA_DIST += $(bin_SCRIPTS) $(sbin_SCRIPTS) $(man_MANS)

View File

@ -0,0 +1,14 @@
diff -up powerpc-utils-1.3.8/Makefile.am.me powerpc-utils-1.3.8/Makefile.am
--- powerpc-utils-1.3.8/Makefile.am.me 2020-09-04 11:37:54.042763518 +0200
+++ powerpc-utils-1.3.8/Makefile.am 2020-09-04 11:39:06.262151924 +0200
@@ -54,7 +54,9 @@ man_MANS = \
man/lsprop.8 \
man/ls-veth.8 \
man/nvsetenv.8 \
- man/ls-vscsi.8
+ man/ls-vscsi.8 \
+ man/pseries_platform.8 \
+ man/update_flash_nv.8
EXTRA_DIST += $(bin_SCRIPTS) $(sbin_SCRIPTS) $(man_MANS)

View File

@ -0,0 +1,19 @@
diff -up powerpc-utils-1.3.8/Makefile.am.me powerpc-utils-1.3.8/Makefile.am
--- powerpc-utils-1.3.8/Makefile.am.me 2020-09-04 11:34:16.575570705 +0200
+++ powerpc-utils-1.3.8/Makefile.am 2020-09-04 11:35:36.499111663 +0200
@@ -47,7 +47,14 @@ man_MANS = \
man/errinjct.8 \
man/vcpustat.8 \
man/rtas_dbg.8 \
- man/drmgr.8
+ man/drmgr.8 \
+ man/lsdevinfo.8 \
+ man/rtas_event_decode.8 \
+ man/ls-vdev.8 \
+ man/lsprop.8 \
+ man/ls-veth.8 \
+ man/nvsetenv.8 \
+ man/ls-vscsi.8
EXTRA_DIST += $(bin_SCRIPTS) $(sbin_SCRIPTS) $(man_MANS)

View File

@ -1,67 +1,3 @@
diff -up powerpc-utils-1.2.15/man/drmgr.8.man powerpc-utils-1.2.15/man/drmgr.8
--- powerpc-utils-1.2.15/man/drmgr.8.man 2013-01-16 15:31:13.886591137 +0100
+++ powerpc-utils-1.2.15/man/drmgr.8 2013-01-16 15:31:13.886591137 +0100
@@ -0,0 +1,60 @@
+.TH DRMGR "8" "Oct 2010" "Linux" "Linux on Power Service Tools"
+.SH NAME
+drmgr \- Dynamic Resource Manager. Utility used to perform DLPAR operations on a client partition.
+
+.SH SYNOPSIS
+.B drmgr
+.RB [ \-w
+.IR minutes ]
+.RB [ \-d
+.IR detail_level ]
+.RB [ \-C | \-\-capabilities ]
+.RB [ \-h | \-\-help ]
+
+.B drmgr
+.RB { \-c " {" port " | " slot " | " phb " | " pci " | " mem " | " cpu }
+.RB | \-m }
+
+.B drmgr \-c
+.RB { port " | " slot " | " phb }
+.RB { \-a " | " \-r " | " \-Q "} " \-s
+.I drc_name
+
+.B drmgr \-c pci \-s
+.I slot
+.RB { \-i " | " \-a " [" \-I "] | " \-r " [" \-I "] | " \-R " [" \-I "]}"
+
+.B drmgr \-c mem
+.RB { \-a " | " \-r "} {" \-q
+.I quantity
+.BR \-p
+.RI { variable_weight " | " ent_capacity "} |"
+.RB { \-q
+.I quantity
+.RB "| " \-s
+.IR drc_name }}
+
+.B drmgr \-c cpu
+.RB { \-a " | " \-r "} {" \-q
+.I quantity
+.BR \-p
+.RI { variable_weight " | " ent_capacity }
+.RB [ \-s
+.IR drc_names ]
+
+
+
+.SH OVERVIEW
+.B drmgr
+program is a member of the ppc64-utils suite of utils.
+Use it to list DLPAR and hotplug capable slots.
+
+.SH DESCRIPTION
+.B drmgr
+is a utility to list DLPAR and hotplug capable slots.
+
+.SH AUTHOR
+.B drmgr
+was written by IBM Corporation
+.PP
+This manual page was written by Roman Rakus <rrakus@redhat.com>
diff -up powerpc-utils-1.2.15/man/lsdevinfo.8.man powerpc-utils-1.2.15/man/lsdevinfo.8
--- powerpc-utils-1.2.15/man/lsdevinfo.8.man 2013-01-16 15:31:13.886591137 +0100
+++ powerpc-utils-1.2.15/man/lsdevinfo.8 2013-01-16 15:31:13.886591137 +0100

View File

@ -1,198 +0,0 @@
commit 1d4147370a148b3a2ebadcf02abd4a6c9a763e6d
Author: Sourabh Jain <sourabhjain@linux.ibm.com>
Date: Sat Apr 27 10:18:32 2019 +0530
lparstat: add an option to print the lparstat report similar to legacy lparstat tool
This patch adds a new command line option (-l, --legacy) to allow
users to print the report similar to legacy lprastat tool without
affecting existing report format.
Changes done to make the current report format similar to legacy
report format are listed below:
1) The memory attribute will be printed in MB instead of KB.
2) cpus attribute will be referred as psize in legacy report format
and only printed in shared lpar environment.
3) On legacy lparstat tool the lcpu attribute is a combination of
two attributes, smt and number of online processor. Formula used
to calculate the lcpu is given below.
lcpu = smt * number of online processors
Signed-off-by: Sourabh Jain <sourabhjain@linux.ibm.com>
Reviewed-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
Signed-off-by: Tyrel Datwyler <tyreld@linux.vnet.ibm.com>
diff --git a/man/lparstat.8 b/man/lparstat.8
index 467f570..0f4c923 100644
--- a/man/lparstat.8
+++ b/man/lparstat.8
@@ -36,6 +36,11 @@ Online Memory Capacity.
.TP
cpus
Number of online physical processors in the pool.
+.RS
+This attribute is referred as
+.B psize
+in legacy mode and only available in shared LPAR environment.
+.RE
.TP
ent
Entitled processing capacity in processor units. This information is displayed only if the partition type is shared.
@@ -204,6 +209,26 @@ The variable memory capacity weight of the LPAR.
.TP
.SH
.TP
+\fB\-l, --legacy\fR
+Display the report in legacy format.
+.RS
+.RS
+Memory attribute in MB instead of KB.
+.RS
+.RE
+.B cpus
+attribute is referred as
+.B psize
+and only available for shared LPAR.
+.RS
+.RE
+.B lcpu
+attribute calculation: lcpu = smt * number of online processors.
+.RE
+.TP
+.RS
+.SH
+.TP
\fB\-h, --help\fR
Display the usage of lparstat.
.RS
diff --git a/src/lparstat.c b/src/lparstat.c
index 1abe54d..ffb2cfa 100644
--- a/src/lparstat.c
+++ b/src/lparstat.c
@@ -23,6 +23,7 @@
#include <stdlib.h>
#include <stdio.h>
+#include <stdbool.h>
#include <string.h>
#include <getopt.h>
#include <unistd.h>
@@ -35,6 +36,8 @@
#define SE_NOT_FOUND "???"
#define SE_NOT_VALID "-"
+static bool o_legacy = false;
+
struct sysentry *get_sysentry(char *name)
{
struct sysentry *se = &system_data[0];
@@ -479,7 +482,7 @@ void get_mem_total(struct sysentry *se, char *buf)
{
FILE *f;
char line[128];
- char *mem, *nl, *first_line;
+ char *mem, *nl, *first_line, *unit;
f = fopen("/proc/meminfo", "r");
if (!f) {
@@ -500,10 +503,21 @@ void get_mem_total(struct sysentry *se, char *buf)
mem++;
} while (*mem == ' ');
- nl = strchr(mem, '\n');
+ unit = strchr(mem, ' ');
+ *unit = '\0';
+
+ do {
+ unit++;
+ } while (*unit == ' ');
+
+ nl = strchr(unit, '\n');
*nl = '\0';
- sprintf(buf, "%s", mem);
+ if (o_legacy) {
+ sprintf(buf, "%d %s", atoi(mem) / 1024, "MB");
+ } else {
+ sprintf(buf, "%s %s", mem, unit);
+ }
}
void get_smt_mode(struct sysentry *se, char *buf)
@@ -604,7 +618,8 @@ void print_default_output(int interval, int count)
char *fmt = "%5s %5s %5s %8s %8s %5s %5s %5s %5s %5s\n";
char *descr;
char buf[128];
- int offset;
+ int offset, smt, active_proc;
+ char type[32];
char value[32];
char user[32], sys[32], wait[32], idle[32], physc[32], entc[32];
char lbusy[32], app[32], vcsw[32], phint[32];
@@ -612,16 +627,30 @@ void print_default_output(int interval, int count)
memset(buf, 0, 128);
get_sysdata("shared_processor_mode", &descr, value);
offset = sprintf(buf, "type=%s ", value);
+ sprintf(type, "%s", value);
get_sysdata("capped", &descr, value);
offset += sprintf(buf + offset, "mode=%s ", value);
get_sysdata("smt_state", &descr, value);
offset += sprintf(buf + offset, "smt=%s ", value);
+ if (!strcmp(value, "Off"))
+ smt = 1;
+ else
+ smt = atoi(value);
get_sysdata("partition_active_processors", &descr, value);
- offset += sprintf(buf + offset, "lcpu=%s ", value);
+ active_proc = atoi(value);
+ if (o_legacy)
+ offset += sprintf(buf + offset, "lcpu=%d ", active_proc*smt);
+ else
+ offset += sprintf(buf + offset, "lcpu=%s ", value);
get_sysdata("MemTotal", &descr, value);
offset += sprintf(buf + offset, "mem=%s ", value);
get_sysdata("active_cpus_in_pool", &descr, value);
- offset += sprintf(buf + offset, "cpus=%s ", value);
+ if (o_legacy) {
+ if (strcmp(type, "Dedicated"))
+ offset += sprintf(buf + offset, "psize=%s ", value);
+ } else {
+ offset += sprintf(buf + offset, "cpus=%s ", value);
+ }
get_sysdata("DesEntCap", &descr, value);
offset += sprintf(buf + offset, "ent=%s ", value);
@@ -662,6 +691,7 @@ static void usage(void)
"\t-h, --help Show this message and exit.\n"
"\t-V, --version \tDisplay lparstat version information.\n"
"\t-i Lists details on the LPAR configuration.\n"
+ "\t-l, --legacy Print the report in legacy format.\n"
"interval The interval parameter specifies the amount of time between each report.\n"
"count The count parameter specifies how many reports will be displayed.\n");
}
@@ -669,6 +699,7 @@ static void usage(void)
static struct option long_opts[] = {
{"version", no_argument, NULL, 'V'},
{"help", no_argument, NULL, 'h'},
+ {"legacy", no_argument, NULL, 'l'},
{0, 0, 0, 0},
};
@@ -684,12 +715,15 @@ int main(int argc, char *argv[])
exit(1);
}
- while ((c = getopt_long(argc, argv, "iVh",
+ while ((c = getopt_long(argc, argv, "iVhl",
long_opts, &opt_index)) != -1) {
switch(c) {
case 'i':
i_option = 1;
break;
+ case 'l':
+ o_legacy = true;
+ break;
case 'V':
printf("lparstat - %s\n", VERSION);
return 0;

View File

@ -1,94 +0,0 @@
commit 8b7978b114e5df89218daa9b4b48cc0e918ba917
Author: Sourabh Jain <sourabhjain@linux.ibm.com>
Date: Mon Feb 4 16:15:14 2019 +0530
lparstat: introduce the help command line option to print lparstat usage
This patch adds a function to print the usage of lparstat. Also,
a new element is added to structure option to handle long command
line argument for help.
Signed-off-by: Sourabh Jain <sourabhjain@linux.ibm.com>
Signed-off-by: Tyrel Datwyler <tyreld@linux.vnet.ibm.com>
diff --git a/man/lparstat.8 b/man/lparstat.8
index 9721580..467f570 100644
--- a/man/lparstat.8
+++ b/man/lparstat.8
@@ -9,8 +9,9 @@
.SH NAME
lparstat \- Reports logical partition ( LPAR ) related information and statistics.
.SH SYNOPSIS
-.B /usr/sbin/lparstat
-[ -i ] [ interval [ count ] ]
+.B /usr/sbin/lparstat [ options ]
+.HP
+.B /usr/sbin/lparstat <interval> [ count ]
.SH DESCRIPTION
The \fIlparstat\fR command provides a report of LPAR related information and utilization statistics. This command provides a display of current LPAR related parameters and Hypervisor information, as well as utilization statistics for the LPAR.
@@ -202,6 +203,17 @@ Desired Variable Capacity Weight
The variable memory capacity weight of the LPAR.
.TP
.SH
+.TP
+\fB\-h, --help\fR
+Display the usage of lparstat.
+.RS
+.SH
+.TP
+\fB\-V, --version\fR
+Display the lparstat version information.
+.RS
+.SH
+.TP
interval
The
.B interval
diff --git a/src/lparstat.c b/src/lparstat.c
index c9b86fd..1abe54d 100644
--- a/src/lparstat.c
+++ b/src/lparstat.c
@@ -655,8 +655,20 @@ void print_default_output(int interval, int count)
} while (--count > 0);
}
+static void usage(void)
+{
+ printf("Usage: lparstat [ options ]\n\tlparstat <interval> [ count ]\n\n"
+ "options:\n"
+ "\t-h, --help Show this message and exit.\n"
+ "\t-V, --version \tDisplay lparstat version information.\n"
+ "\t-i Lists details on the LPAR configuration.\n"
+ "interval The interval parameter specifies the amount of time between each report.\n"
+ "count The count parameter specifies how many reports will be displayed.\n");
+}
+
static struct option long_opts[] = {
{"version", no_argument, NULL, 'V'},
+ {"help", no_argument, NULL, 'h'},
{0, 0, 0, 0},
};
@@ -672,7 +684,7 @@ int main(int argc, char *argv[])
exit(1);
}
- while ((c = getopt_long(argc, argv, "iV",
+ while ((c = getopt_long(argc, argv, "iVh",
long_opts, &opt_index)) != -1) {
switch(c) {
case 'i':
@@ -681,7 +693,12 @@ int main(int argc, char *argv[])
case 'V':
printf("lparstat - %s\n", VERSION);
return 0;
+ case 'h':
+ usage();
+ return 0;
case '?':
+ usage();
+ return 1;
default:
break;
}

View File

@ -1,272 +0,0 @@
commit b0586b5938e9d371e55671422b2f0a5d2cd10c54
Author: Michael Bringmann <mwb@linux.vnet.ibm.com>
Date: Wed Oct 2 16:54:52 2019 -0500
powerpc-utils/devtree: Parse 'ibm,drc-info' property
Parse new DRC Info: Define data structures to support parsing
the new "ibm,drc-info" device tree property. Integrate the new
property information into the existing search mechanisms of the
userspace 'drmgr' driver.
Signed-off-by: Michael Bringmann <mwb@linux.vnet.ibm.com>
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
diff --git a/src/drmgr/common_ofdt.c b/src/drmgr/common_ofdt.c
index 8c9e224..c110bc0 100644
--- a/src/drmgr/common_ofdt.c
+++ b/src/drmgr/common_ofdt.c
@@ -41,6 +41,16 @@ struct drc_prop_grp {
struct of_list_prop drc_domains;
};
+struct drc_info {
+ char *drc_type;
+ char *drc_name_prefix;
+ int drc_index_start;
+ int drc_name_suffix_start;
+ int n_seq_elems;
+ int seq_inc;
+ int drc_power_domain;
+};
+
struct dr_connector *all_drc_lists = NULL;
/**
@@ -186,6 +196,169 @@ build_connectors_list(struct drc_prop_grp *group, int n_entries,
return 0;
}
+/**
+ * drc_info_connectors_v1
+ *
+ * @param full_path
+ * @param ofdt_path
+ * @param list
+ * @returns 0 on success, !0 otherwise
+ */
+static int drc_info_connectors_v1(char *full_path, char *ofdt_path,
+ struct dr_connector **list)
+{
+ struct dr_connector *out_list = NULL;
+ struct drc_prop_grp prop_grp;
+ struct of_list_prop *drc_names;
+ int n_drcs;
+ int rc = 0;
+
+ rc = get_drc_prop_grp(full_path, &prop_grp);
+ if (rc) {
+ say(DEBUG,
+ "Could not find DRC property group in path: %s.\n",
+ full_path);
+ goto done;
+ }
+
+ drc_names = &prop_grp.drc_names;
+ n_drcs = drc_names->n_entries;
+
+ out_list = zalloc(n_drcs * sizeof(struct dr_connector));
+ if (out_list == NULL)
+ goto done;
+
+ build_connectors_list(&prop_grp, n_drcs, out_list);
+
+done:
+ if (rc) {
+ free_drc_props(&prop_grp);
+ free(out_list);
+ } else {
+ snprintf(out_list->ofdt_path, DR_PATH_MAX, "%s", ofdt_path);
+ *list = out_list;
+ }
+
+ return rc;
+}
+
+/**
+ * drc_info_connectors_v2
+ *
+ * @param full_path
+ * @param ofdt_path
+ * @param list
+ * @returns 0 on success, !0 otherwise
+ */
+static int drc_info_connectors_v2(char *full_path, char *ofdt_path,
+ struct dr_connector **list)
+{
+ struct dr_connector *out_list = NULL;
+ struct drc_info info;
+ char *prop_name = "ibm,drc-info";
+ char *prop_data, *data_ptr;
+ int i, j, n_entries, size, connector_size, ics, rc;
+
+ size = get_property_size(full_path, prop_name);
+ prop_data = zalloc(size);
+ if (prop_data == NULL)
+ return -1;
+ rc = get_property(full_path, prop_name, prop_data, size);
+ if (rc) {
+ free(prop_data);
+ return -1;
+ }
+
+ /* Num of DRC-info sets */
+ data_ptr = prop_data;
+ n_entries = be32toh(*(uint *)data_ptr);
+ data_ptr += 4;
+
+ /* Extract drc-info data */
+ for (j = 0, connector_size = 0; j < n_entries; j++) {
+ info.drc_type = data_ptr;
+ data_ptr += strlen(info.drc_type)+1;
+ info.drc_name_prefix = data_ptr;
+ data_ptr += strlen(info.drc_name_prefix)+1;
+ data_ptr += 4; /* Skip drc-index-start */
+ data_ptr += 4; /* Skip drc-name-suffix-start */
+ info.n_seq_elems = be32toh(*(uint *)data_ptr);
+ data_ptr += 4; /* Advance over n-seq-elems */
+ data_ptr += 4; /* Skip sequential-increment */
+ data_ptr += 4; /* Skip drc-power-domain */
+ if (info.n_seq_elems <= 0)
+ continue;
+ connector_size += info.n_seq_elems;
+ }
+
+ /* Allocate list entry */
+ out_list = zalloc(connector_size * sizeof(struct dr_connector));
+ if (out_list == NULL) {
+ rc = -1;
+ goto done;
+ }
+
+ /* Extract drc-info data */
+ data_ptr = prop_data;
+ data_ptr += 4;
+ for (j = 0, ics = 0; j < n_entries; j++) {
+ info.drc_type = data_ptr;
+ data_ptr += strlen(info.drc_type)+1;
+ info.drc_name_prefix = data_ptr;
+ data_ptr += strlen(info.drc_name_prefix)+1;
+
+ info.drc_index_start = be32toh(*(uint *)data_ptr);
+ data_ptr += 4;
+
+ info.drc_name_suffix_start = be32toh(*(uint *)data_ptr);
+ data_ptr += 4;
+
+ info.n_seq_elems = be32toh(*(uint *)data_ptr);
+ data_ptr += 4;
+
+ info.seq_inc = be32toh(*(uint *)data_ptr);
+ data_ptr += 4;
+
+ info.drc_power_domain = be32toh(*(uint *)data_ptr);
+ data_ptr += 4;
+
+ /* Build connector list */
+ if (info.n_seq_elems <= 0)
+ continue;
+
+ for (i = 0; i < info.n_seq_elems; i++, ics++) {
+ out_list[ics].index = info.drc_index_start+
+ (i*info.seq_inc);
+ out_list[ics].powerdomain = info.drc_power_domain;
+
+ sprintf(out_list[ics].name, "%s%d",
+ info.drc_name_prefix,
+ info.drc_name_suffix_start+(i*info.seq_inc));
+
+ strncpy(out_list[ics].type, info.drc_type, DRC_STR_MAX);
+
+ out_list[ics].next = &out_list[ics+1];
+ }
+ }
+ if (ics > 0)
+ out_list[ics-1].next = NULL;
+
+done:
+ if (prop_data)
+ free(prop_data);
+
+ if (rc) {
+ free(out_list);
+ *list = NULL;
+ } else {
+ snprintf(out_list->ofdt_path, DR_PATH_MAX, "%s", ofdt_path);
+ *list = out_list;
+ }
+
+ return rc;
+}
+
+
/**
* of_to_full_path
*
@@ -232,11 +405,12 @@ of_to_full_path(const char *of_path)
struct dr_connector *
get_drc_info(const char *of_path)
{
- struct dr_connector *list = NULL;
- struct of_list_prop *drc_names;
- struct drc_prop_grp prop_grp;
+ struct stat sbuf;
+ char fname[DR_PATH_MAX];
+ char ofdt_path[DR_PATH_MAX];
char *full_path = NULL;
- int rc, n_drcs;
+ struct dr_connector *list = NULL;
+ int rc;
for (list = all_drc_lists; list; list = list->all_next) {
if (! strcmp(list->ofdt_path, of_path))
@@ -246,33 +420,24 @@ get_drc_info(const char *of_path)
full_path = of_to_full_path(of_path);
if (full_path == NULL)
return NULL;
-
- rc = get_drc_prop_grp(full_path, &prop_grp);
- if (rc) {
- say(DEBUG, "Could not find DRC property group in path: %s.\n",
- full_path);
- goto done;
- }
- drc_names = &prop_grp.drc_names;
- n_drcs = drc_names->n_entries;
-
- list = zalloc(n_drcs * sizeof(struct dr_connector));
- if (list == NULL)
- goto done;
-
- /* XXX Unchecked rc */
- rc = build_connectors_list(&prop_grp, n_drcs, list);
-
- snprintf(list->ofdt_path, DR_PATH_MAX, "%s", of_path);
-
- list->all_next = all_drc_lists;
- all_drc_lists = list;
+ /* ibm,drc-info vs the old implementation */
+ sprintf(fname, "%s/%s", full_path, "ibm,drc-info");
+ snprintf(ofdt_path, DR_PATH_MAX, "%s", of_path);
+ rc = stat(fname, &sbuf);
+ if (rc)
+ rc = drc_info_connectors_v1(full_path, ofdt_path, &list);
+ else
+ rc = drc_info_connectors_v2(full_path, ofdt_path, &list);
-done:
- free_drc_props(&prop_grp);
- if (full_path)
- free(full_path);
+ if (rc == 0) {
+ list->all_next = all_drc_lists;
+ all_drc_lists = list;
+ } else {
+ if (full_path)
+ free(full_path);
+ list = NULL;
+ }
return list;
}

View File

@ -1,31 +0,0 @@
commit b5fea40ac98d1c9a685d98c011e88180c31ca0be
Author: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
Date: Wed Feb 20 15:44:17 2019 +0530
man/update_flash: Add details to extract rpm format image
Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
Signed-off-by: Tyrel Datwyler <tyreld@linux.vnet.ibm.com>
diff --git a/man/update_flash.8 b/man/update_flash.8
index 254fbac..4ae10d8 100644
--- a/man/update_flash.8
+++ b/man/update_flash.8
@@ -225,6 +225,17 @@ following the steps outlined here:
.P
http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/index.jsp?topic=/p7hatl/iphblresetserverp6.htm
+.P
+.B RPM format image
+.fi
+For "rpm format" images, the file will have a .rpm extension. It can be extracted
+using below command:
+
+ rpm2cpio <rpm filename> | cpio -idmv
+.fi
+.P
+This will extract files under current directory. Pass <image>.img file to this script.
+
.P
.B AIX format image
.fi

View File

@ -1,40 +0,0 @@
commit bc928b06605371b72c7fe8ec7e81886114a9e9d4
Author: Sourabh Jain <sourabhjain@linux.ibm.com>
Date: Thu Jan 31 14:25:21 2019 +0530
lparstat: restrict the physc and entc attribute values to two decimal places
Print format of physical processors consumed (physc) and percentage of
the entitled capacity consumed (entc) attributes has changed from six
decimal places to two.
The least possible value allowed for processor entitlement to a LPAR
is 0.05 so printing physc and entc values with such a high precision
is incorrect.
Signed-off-by: Sourabh Jain <sourabhjain@linux.ibm.com>
Reviewed-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
Signed-off-by: Tyrel Datwyler <tyreld@linux.vnet.ibm.com>
diff --git a/src/lparstat.c b/src/lparstat.c
index ec57c1a..c9b86fd 100644
--- a/src/lparstat.c
+++ b/src/lparstat.c
@@ -176,7 +176,7 @@ void get_cpu_physc(struct sysentry *unused_se, char *buf)
physc = (new_purr - old_purr)/timebase/elapsed;
}
- sprintf(buf, "%.6f", physc);
+ sprintf(buf, "%.2f", physc);
}
void get_per_entc(struct sysentry *unused_se, char *buf)
@@ -188,7 +188,7 @@ void get_per_entc(struct sysentry *unused_se, char *buf)
get_sysdata("DesEntCap", &descr, entc);
get_sysdata("physc", &descr, physc);
- sprintf(buf, "%.6f", atof(physc) / atof(entc) * 100.0);
+ sprintf(buf, "%.2f", atof(physc) / atof(entc) * 100.0);
}
void get_cpu_app(struct sysentry *unused_se, char *buf)

View File

@ -1,195 +0,0 @@
commit dd6da6b329bac2743d1c80b5556b494c923c11ad
Author: Michael Bringmann <mwb@linux.vnet.ibm.com>
Date: Mon Apr 29 11:25:18 2019 -0500
scripts: Improve handling of errors from subsidiary scripts
This patch is to fix the handling of errors by 'lsdevinfo' from
invocations of 'ofpathname' that also encounter errors. Error
messages from 'ofpathname' were being sent through 'stdout', and
interpreted as valid data by a number of script instructions in
'lsdevinfo'. Following is an example of such a failure when the
error results were forwarded to an associated HMC.
2019-02-19 22:05:38.212 [TID-5f68--72195] VIOS_CACHE: CacheVios.<-> saveCacheData 3*9080-M9S*130A068 cmd=lsdevinfo -c -q physloc=U78CD.001.FZH0128-P1-C1-T3-S4 -F status
2019-02-19 22:05:38.212 [TID-5f68--72195] RMC_VIOS: PIRmcViosClient.stdErr=/bin/ls: cannot access /sys/class/net/ofpathname:: No such file or directory
/bin/ls: cannot access Could: No such file or directory
/bin/ls: cannot access not: No such file or directory
/bin/ls: cannot access retrieve: No such file or directory
/bin/ls: cannot access logical: No such file or directory
/bin/ls: cannot access device: No such file or directory
/bin/ls: cannot access name: No such file or directory
/bin/ls: cannot access for: No such file or directory
/bin/ls: cannot access Open: No such file or directory
/bin/ls: cannot access Firmware: No such file or directory
/bin/ls: cannot access path: No such file or directory
/bin/ls: cannot access "/pci@800000029008004/ethernet@0"./device/driver: No such file or directory
This patch makes the following changes:
* Redirects the error messages from 'ofpathname' to stderr
* Adds more checks to 'lsdevinfo' to filter out stderr text
from input to various parsing commands.
Signed-off-by: Michael Bringmann <mwb@linux.vnet.ibm.com>
Signed-off-by: Tyrel Datwyler <tyreld@linux.vnet.ibm.com>
diff --git a/scripts/lsdevinfo b/scripts/lsdevinfo
index 4ef98d7..85019e9 100755
--- a/scripts/lsdevinfo
+++ b/scripts/lsdevinfo
@@ -225,7 +225,7 @@ show_eth ()
# Look at every vNIC device
for dev in $($LS -d /proc/device-tree/vdevice/vnic* 2> /dev/null); do
# use ofpathname to get the device name (i.e. eth0)
- name=$($OFPATHNAME -l $(echo $dev | $SED -e "s/\/proc\/device-tree//"))
+ name=$($OFPATHNAME -l $(echo $dev | $SED -e "s/\/proc\/device-tree//") 2> /dev/null)
connection=$(echo $dev | $SED -e "s/\/proc\/device-tree\/vdevice\/l-lan@//")
parent="vio"
@@ -246,7 +246,7 @@ done
# Look at every ibmveth (Virtual Ethernet) device
for dev in $($LS -d /proc/device-tree/vdevice/l-lan* 2> /dev/null); do
# use ofpathname to get the device name (i.e. eth0)
- name=$($OFPATHNAME -l $(echo $dev | $SED -e "s/\/proc\/device-tree//"))
+ name=$($OFPATHNAME -l $(echo $dev | $SED -e "s/\/proc\/device-tree//") 2> /dev/null)
connection=$(echo $dev | $SED -e "s/\/proc\/device-tree\/vdevice\/l-lan@//")
parent="vio"
@@ -268,7 +268,7 @@ done
for pci_dev in $($LS -d /proc/device-tree/pci* 2> /dev/null); do
for dev in $($LS -d $pci_dev/ethernet* 2> /dev/null); do
# use ofpathname to get the device name (i.e. eth0)
- name=$($OFPATHNAME -l $(echo $dev | $SED -e "s/\/proc\/device-tree//"))
+ name=$($OFPATHNAME -l $(echo $dev | $SED -e "s/\/proc\/device-tree//") 2> /dev/null)
connection=$(echo $pci_dev | $SED -e "s/\/proc\/device-tree\/pci@//")
parent="pci"
@@ -280,7 +280,7 @@ for pci_dev in $($LS -d /proc/device-tree/pci* 2> /dev/null); do
class="adapter"
subclass="pci"
prefix="eth"
- driver=$($LS -l /sys/class/net/$name/device/driver |
+ driver=$($LS -l /sys/class/net/$name/device/driver 2> /dev/null |
$SED -e "s/^.*\///")
status=1
@@ -312,11 +312,11 @@ for dev in $($LS -d /proc/device-tree/vdevice/v-scsi* 2> /dev/null) ; do
prefix="host"
driver="ibmvscsic"
- host=$($LS -d /sys/devices/vio/$slot/host*/)
+ host=$($LS -d /sys/devices/vio/$slot/host*/ 2> /dev/null)
if [[ -d $host/scsi_host ]]; then
- scsihost=$($LS -d $host/scsi_host/host*/)
+ scsihost=$($LS -d $host/scsi_host/host*/ 2> /dev/null)
else
- scsihost=$($LS -d $host/scsi_host*/)
+ scsihost=$($LS -d $host/scsi_host*/ 2> /dev/null)
fi
if [[ $(cat $scsihost/state) == "running" ]] ; then
@@ -365,12 +365,12 @@ for dev in $($LS -d /proc/device-tree/vdevice/v-scsi* 2> /dev/null) ; do
fi
# loop through the targets for this host.
- for t in $($LS -d $host/target*); do
+ for t in $($LS -d $host/target* 2> /dev/null); do
target=$(echo $($LS -d $t/$($LS $t | $GREP -v uevent | $GREP -v power | $GREP -v subsystem)))
if [[ ! -d $target/block ]]; then
- name=$(echo $($LS -d $target/block*) | $SED -e "s/.*://")
+ name=$(echo $($LS -d $target/block* 2> /dev/null) | $SED -e "s/.*://")
else
- name=$($LS $target/block)
+ name=$($LS $target/block 2> /dev/null)
fi
conn=$($OFPATHNAME /dev/$name 2> /dev/null | $SED -e "s/.*disk@//")
@@ -446,7 +446,7 @@ for dev in $($LS -d /proc/device-tree/vdevice/vfc-client* 2> /dev/null) ; do
slot=$(echo $dev | $SED -e "s/\/proc\/device-tree\/vdevice\/vfc-client@//")
# there is only one host per device, assign it to the path's name
- for host in $($LS -d /sys/devices/vio/$slot/host*) ; do
+ for host in $($LS -d /sys/devices/vio/$slot/host* 2> /dev/null) ; do
parent=$(echo $host | $SED -e "s/.*\///")
name=$parent
@@ -457,11 +457,11 @@ for dev in $($LS -d /proc/device-tree/vdevice/vfc-client* 2> /dev/null) ; do
prefix="host"
driver="ibmvfc"
- host=$($LS -d /sys/devices/vio/$slot/host*/)
+ host=$($LS -d /sys/devices/vio/$slot/host*/ 2> /dev/null)
if [[ -d $host/scsi_host ]]; then
- scsihost=$($LS -d $host/scsi_host/host*/)
+ scsihost=$($LS -d $host/scsi_host/host*/ 2> /dev/null)
else
- scsihost=$($LS -d $host/scsi_host*/)
+ scsihost=$($LS -d $host/scsi_host*/ 2> /dev/null)
fi
if [[ $(cat $scsihost/state) == "running" ]] ; then
@@ -510,16 +510,16 @@ for dev in $($LS -d /proc/device-tree/vdevice/vfc-client* 2> /dev/null) ; do
fi
# As opposed to ibmvscsi, there are multiple rports in each host
- for rport in $($LS -d $host/rport*); do
+ for rport in $($LS -d $host/rport* 2> /dev/null); do
# in ibmvfc there are two layers of directories before getting to
# the targets
- for t in $($LS -d $rport/target*); do
+ for t in $($LS -d $rport/target* 2> /dev/null); do
for target in $($LS $t | $GREP "[0-9]*:[0-9]*:[0-9]*:[0-9]*"); do
if [[ ! -d $t/$target/block ]]; then
name=$(echo $($LS -d $t/$target/block*) | $SED -e "s/.*://")
else
- name=$($LS $t/$target/block)
+ name=$($LS $t/$target/block 2> /dev/null)
fi
connection=$($OFPATHNAME /dev/$name 2> /dev/null | $SED -e "s/.*disk@//")
diff --git a/scripts/ofpathname b/scripts/ofpathname
index 1b2a1dd..c37c6bd 100755
--- a/scripts/ofpathname
+++ b/scripts/ofpathname
@@ -84,20 +84,20 @@ err()
fi
case $emsg in
- 1) echo "$OFPATHNAME: Could not retrieve Open Firmware device path"
- echo " for logical device \"$DEVNAME_ARG\"." ;;
+ 1) echo "$OFPATHNAME: Could not retrieve Open Firmware device path" 1>&2
+ echo " for logical device \"$DEVNAME_ARG\"." 1>&2 ;;
- 2) echo "$OFPATHNAME: sysfs (/sys) is needed and does not appear"
- echo " to be mounted on this system." ;;
+ 2) echo "$OFPATHNAME: sysfs (/sys) is needed and does not appear" 1>&2
+ echo " to be mounted on this system." 1>&2 ;;
- 3) echo "$OFPATHNAME: Could not find sysfs information for logical"
- echo " device \"$DEVNAME_ARG\"." ;;
+ 3) echo "$OFPATHNAME: Could not find sysfs information for logical" 1>&2
+ echo " device \"$DEVNAME_ARG\"." 1>&2 ;;
- 4) echo "$OFPATHANME: Logical device \"$DEVNAME_ARG\" does not appear"
- echo " to be configured." ;;
+ 4) echo "$OFPATHANME: Logical device \"$DEVNAME_ARG\" does not appear" 1>&2
+ echo " to be configured." 1>&2 ;;
- 5) echo "$OFPATHNAME: Could not retrieve logical device name for"
- echo " Open Firmware path \"$DEVNAME_ARG\"."
+ 5) echo "$OFPATHNAME: Could not retrieve logical device name for" 1>&2
+ echo " Open Firmware path \"$DEVNAME_ARG\"." 1>&2 ;;
esac
exit 1
@@ -1631,7 +1631,7 @@ of2l_nvme()
#
. $PSERIES_PLATFORM
if [[ $platform = $PLATFORM_POWERNV ]]; then
- echo "$OFPATHNAME: is not supported on the $platform_name platform"
+ echo "$OFPATHNAME: is not supported on the $platform_name platform" 1>&2
exit 1
fi

View File

@ -1,64 +0,0 @@
commit ea4db66e941720313af2c6b1afb32a74f3e360f4
Author: Michael Bringmann <mwb@linux.vnet.ibm.com>
Date: Tue Sep 10 14:31:42 2019 -0500
Safe bootlist update
This patch is intended to prevent problems with identifying or parsing
the bootlist devices from propagating into the system NVRAM configuration.
A number of such problems have been observed when processing USB devices.
* If 'bootlist' encounters an invalid OF_DEVPATH entry, it will print
an notice, but still continue on to write invalid data to nvram.
Changed to abort the script before writing bad data to nvram.
* When 'ofpathname' encounters an invalid 'devspec' file or invalid
value in a 'devspec' file, while trying to find the logical pathname
for a scsi device, it may continue to return the invalid 'devspec'
value to the caller/invoking script.
Changed to abort with an error message instead of returning that
invalid value to a caller like 'bootlist'.
Example:
# bootlist -m normal sdb
# bootlist -m normal -o
Could not translate (null)/scsi@0/sd@0,0 to logical device name
Signed-off-by: Tyrel Datwyler <tyreld@linux.vnet.ibm.com>
diff --git a/scripts/bootlist b/scripts/bootlist
index 65926d7..acdaf89 100755
--- a/scripts/bootlist
+++ b/scripts/bootlist
@@ -459,6 +459,7 @@ if [[ ${#LOGICAL_NAMES[*]} -ne 0 ]]; then
if [[ -z ${OF_DEVPATH[$ctr]} ]]; then
echo "Device ${LOGICAL_NAMES[$ctr]} does not appear to be valid." >&2
+ exit 1
else
# See if this is an ethernet adapter. If so, the next entries
# may be parameters for the bootlist entry.
diff --git a/scripts/ofpathname b/scripts/ofpathname
index c37c6bd..dc452c4 100755
--- a/scripts/ofpathname
+++ b/scripts/ofpathname
@@ -803,9 +803,16 @@ l2of_scsi()
# move up directories until we find one with devspec information
goto_dir $PWD "devspec"
- OF_PATH=`$CAT $PWD/devspec`
+ if [[ -e $PWD/devspec ]]; then
+ OF_PATH=`$CAT $PWD/devspec`
+ else
+ err $ERR_NO_OFPATH
+ fi
+
if [[ -z $OF_PATH ]]; then
err $ERR_NO_OFPATH
+ elif [[ ! -e /proc/device-tree/$OF_PATH ]]; then
+ err $ERR_NO_OFPATH
fi
local vdev=${OF_PATH%/*}

View File

@ -1,40 +0,0 @@
commit f567bdb8b2a3effdb4af06e2cf935b0350f2f881
Author: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
Date: Wed Feb 20 15:44:09 2019 +0530
man/update_flash: Fix man page
Add heading to NOTES section.
Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
Signed-off-by: Tyrel Datwyler <tyreld@linux.vnet.ibm.com>
diff --git a/man/update_flash.8 b/man/update_flash.8
index 0e5ccf6..254fbac 100644
--- a/man/update_flash.8
+++ b/man/update_flash.8
@@ -196,11 +196,15 @@ PowerNV
/sys/firmware/opal/{validate/manage/update}_flash
.fi
.SH NOTES
+.B Download firmware
+.fi
Firmware may be downloaded from the IBM website. Instructions for
downloading and installing the firmware image are also there, and
information there will be more up-to-date than this page.
.P
+.B Firmware update failure
+.fi
Various conditions can lead to a firmware update failure. If you
receive an authentication-related error, such as:
.P
@@ -222,6 +226,8 @@ following the steps outlined here:
http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/index.jsp?topic=/p7hatl/iphblresetserverp6.htm
.P
+.B AIX format image
+.fi
For older "AIX format" images, the file will have a .BIN extension. This
zip file happens to be an AIX binary, but it can be extracted with the
unzip command (with password from the web page):

View File

@ -1,30 +0,0 @@
commit c97fe35b5b6d767b88419fa2084a59e986ac3da0
Author: Nathan Lynch <nathanl@linux.ibm.com>
Date: Mon Apr 27 20:48:04 2020 -0500
ofpathname: speed up l2of_scsi()
There is no need to search the entire /sys hierarchy for kernel device
names like "sda". We know that if it is present it will be in
/sys/class/block.
In an environment with more than 800 scsi devices, this brings the
execution time for a command like "lsdevinfo -F name -c -q
parent=host1" from over 20 minutes to under two minutes.
Signed-off-by: Nathan Lynch <nathanl@linux.ibm.com>
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
diff --git a/scripts/ofpathname b/scripts/ofpathname
index 7c6345e..bd61ee0 100755
--- a/scripts/ofpathname
+++ b/scripts/ofpathname
@@ -773,7 +773,7 @@ l2of_scsi()
local devtype
# There may be many instances of DEVICE under /sys
- for dir in `$FIND /sys -name $DEVICE`; do
+ for dir in `$FIND /sys/class/block -name $DEVICE`; do
# Move up until we find one with a device link
goto_dir $dir "device" 0
if [ $? -eq 0 ]; then

View File

@ -1,7 +1,7 @@
Name: powerpc-utils
Version: 1.3.6
Release: 11%{?dist}
Summary: Utilities for PowerPC platforms
Version: 1.3.8
Release: 5%{?dist}
Summary: PERL-based scripts for maintaining and servicing PowerPC systems
Group: System Environment/Base
License: GPLv2
@ -11,64 +11,45 @@ Source1: nvsetenv
ExclusiveArch: ppc %{power64}
BuildRequires: gcc
BuildRequires: make
BuildRequires: automake
BuildRequires: doxygen
BuildRequires: zlib-devel
BuildRequires: librtas-devel >= 1.4.0
BuildRequires: libservicelog-devel >= 1.0.1-2
BuildRequires: perl-generators
BuildRequires: systemd
Requires: which
# rtas_dump explicit dependency
Requires: perl(Data::Dumper)
Requires: %{name}-core = %{version}-%{release}
Patch1: powerpc-utils-1.2.15-man.patch
Patch2: powerpc-utils-1.2.27-makefile.patch
# missing man pages: update_flash_nv, pseries_platform
Patch1: powerpc-utils-1.3.8-man.patch
Patch2: powerpc-utils-1.3.8-makefile.patch
Patch3: powerpc-utils-1.3.5-pseries_platform-man.patch
Patch4: powerpc-utils-1.3.5-update_flash_nv.patch
Patch5: powerpc-utils-1.3.5-install-man.patch
# lparstat and update_flash fixes
Patch6: powerpc-utils-f567bdb8b2a3effdb4af06e2cf935b0350f2f881.patch
Patch7: powerpc-utils-b5fea40ac98d1c9a685d98c011e88180c31ca0be.patch
Patch8: powerpc-utils-bc928b06605371b72c7fe8ec7e81886114a9e9d4.patch
Patch9: powerpc-utils-8b7978b114e5df89218daa9b4b48cc0e918ba917.patch
Patch10: powerpc-utils-1d4147370a148b3a2ebadcf02abd4a6c9a763e6d.patch
# Improve handling of errors from subsidiary scripts
Patch11: powerpc-utils-dd6da6b329bac2743d1c80b5556b494c923c11ad.patch
Patch12: 0001-powerpc-utils-Suppress-errors-reading-kern.v2.patch
Patch13: powerpc-utils-ea4db66e941720313af2c6b1afb32a74f3e360f4.patch
Patch14: 0001-update_flash-Fix-warning.patch
Patch15: powerpc-utils-b0586b5938e9d371e55671422b2f0a5d2cd10c54.patch
# Track and expose idle PURR and SPURR ticks
Patch17: 0001-common-cpu_info_helpers-library-to-capture-CPU-infor.patch
Patch18: 0002-lparstat-Remove-ppc64_cpu-tool-dependency.patch
Patch19: 0003-lparstat-Read-the-online-cores.patch
Patch20: 0004-lparstat-Capture-nominal-frequency.patch
Patch21: 0005-lparstat-Assign-file-descriptors-to-speed-up-read.patch
Patch22: 0006-lparstat-Read-SPURR-Idle_-PURR-SPURR-values.patch
Patch23: 0007-lparstat-Add-helper-function-to-calculate-delta.patch
Patch24: 0008-lparstat-Derive-effective-frequency.patch
Patch25: 0009-lparstat-Add-helper-to-calculate-scaled-timebase.patch
Patch26: 0010-lparstat-Add-helpers-to-derive-PURR-SPURR-values.patch
Patch27: 0011-lparstat-Move-displaying-system-configuration-detail.patch
Patch28: 0012-lparstat-Add-switch-to-print-Scaled-metrics.patch
Patch29: 0013-lparstat-Add-support-for-cpu-hotplug.patch
Patch30: 0014-lparstat-Use-get_delta_value-helper.patch
# ofpathname: speed up l2of_scsi()
Patch31: powerpc-utils-ofpathname-c97fe35b5b6d767b88419fa2084a59e986ac3da0.patch
# Update man page with -E option
Patch32: powerpc-utils-manpage-lparstat.patch
Patch33: powerpc-utils-1.3.6-bz#1847604.patch
Patch5: powerpc-utils-1.3.8-install-man.patch
Patch6: powerpc-utils-manpage-lparstat.patch
Patch7: powerpc-utils-1.3.8-hcnmgr.patch
Patch8: 0001-ofpathname-Use-NVMe-controller-physical-nsid.patch
Patch9: 0002-sys_ident--skip-length-field-from-search.patch
Patch10: powerpc-utils-1.3.8-f1ec5f04fdac3e87c3c85c2d85f79339d916e864.patch
Patch11: powerpc-utils-1.3.8-4b2d10942e2d964ecc1fe58c9460c34993ff10be.patch
Patch12: powerpc-utils-1.3.8-e51995667279164a6c8ce4c3ba0217fffda22d6d.patch
Patch13: powerpc-utils-1.3.8-fix_boot-time_bonding_interface_cleanup_and_avoid_use_ifcfg.patch
%description
Utilities for PowerPC platforms.
PERL-based scripts for maintaining and servicing PowerPC systems.
%package core
Summary: Core utilities for PowerPC platforms
Summary: Core utilities for maintaining and servicing PowerPC systems
Requires(post): systemd
Requires(preun): systemd
Requires(postun): systemd
Requires: kmod
Requires: which
Requires: /usr/bin/awk
Requires: /usr/bin/basename
Requires: /usr/bin/bc
@ -85,7 +66,7 @@ Requires: /usr/bin/udevadm
%description core
Core utilities for PowerPC platforms.
Core utilities for maintaining and servicing PowerPC systems.
%prep
@ -95,7 +76,7 @@ Core utilities for PowerPC platforms.
%build
export CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing"
./autogen.sh
%configure
%configure --with-systemd=%{_unitdir} --disable-werror
make %{?_smp_mflags}
@ -118,15 +99,54 @@ rm -rf $RPM_BUILD_ROOT/etc/init.d/ibmvscsis.sh $RPM_BUILD_ROOT/usr/sbin/vscsisad
# nvsetenv is just a wrapper to nvram
ln -s nvram.8.gz $RPM_BUILD_ROOT/%{_mandir}/man8/nvsetenv.8.gz
# symlink uspchrp
ln -s serv_config %{buildroot}%{_sbindir}/uspchrp
ln -s serv_config.8 %{buildroot}%{_mandir}/man8/uspchrp.8
# deprecated, use sosreport instead
rm -f $RPM_BUILD_ROOT%{_sbindir}/snap $RPM_BUILD_ROOT%{_mandir}/man8/snap.8*
%post core
systemctl daemon-reload >/dev/null 2>&1 || :
systemctl start hcn-init.service >/dev/null 2>&1 || :
systemctl enable hcn-init.service >/dev/null 2>&1 || :
# update the smt.state file with current SMT
/usr/sbin/smtstate --save >/dev/null 2>&1 || :
%preun core
svc=$(systemctl list-units -la | grep -Fq smtstate.service; echo $?)
if [ "$svc" = "0" ]; then
systemctl stop smtstate.service >/dev/null 2>&1 || :
systemctl disable smtstate.service >/dev/null 2>&1 || :
fi
if systemctl is-enabled hcn-init.service |grep -q "enabled"; then
systemctl stop hcn-init.service >/dev/null 2>&1 || :
systemctl disable hcn-init.service >/dev/null 2>&1 || :
fi
%postun core
systemctl daemon-reload >/dev/null 2>&1 || :
%files
# PERL-based scripts for maintaining and servicing PowerPC systems
%doc README Changelog
%{_sbindir}/hvcsadmin
%{_sbindir}/rtas_dump
%{_mandir}/man8/hvcsadmin.8*
%{_mandir}/man8/rtas_dump.8*
%files core
%license COPYING
%dir /var/lib/powerpc-utils
/var/lib/powerpc-utils/smt.state
%{_unitdir}/smtstate.service
%{_unitdir}/smt_off.service
%{_unitdir}/hcn-init.service
%{_bindir}/amsstat
%{_sbindir}/activate_firmware
%{_sbindir}/bootlist
%{_sbindir}/errinjct
%{_sbindir}/hvcsadmin
%{_sbindir}/lparstat
%{_sbindir}/lsdevinfo
%{_sbindir}/lsprop
@ -137,7 +157,6 @@ ln -s nvram.8.gz $RPM_BUILD_ROOT/%{_mandir}/man8/nvsetenv.8.gz
%{_sbindir}/nvsetenv
%{_sbindir}/ppc64_cpu
%{_sbindir}/rtas_dbg
%{_sbindir}/rtas_dump
%{_sbindir}/rtas_event_decode
%{_sbindir}/rtas_ibm_get_vpd
%{_sbindir}/serv_config
@ -146,17 +165,24 @@ ln -s nvram.8.gz $RPM_BUILD_ROOT/%{_mandir}/man8/nvsetenv.8.gz
%{_sbindir}/uesensor
%{_sbindir}/update_flash
%{_sbindir}/update_flash_nv
# use sosreport from sos instead
%exclude %{_sbindir}/snap
%exclude %{_mandir}/man8/snap.8*
%{_sbindir}/uspchrp
%{_sbindir}/hcncfgdrc
%{_sbindir}/hcnmgr
%{_sbindir}/hcnqrydev
%{_sbindir}/hcnrmdev
%{_sbindir}/hcnrmhcn
%{_sbindir}/hcnversion
%{_sbindir}/vcpustat
%{_sbindir}/smtstate
%{_sbindir}/nvram
%{_sbindir}/ofpathname
%{_sbindir}/pseries_platform
%{_sbindir}/drmgr
%{_mandir}/man1/amsstat.1*
%{_mandir}/man5/lparcfg.5*
%{_mandir}/man8/activate_firmware.8*
%{_mandir}/man8/bootlist.8*
%{_mandir}/man8/errinjct.8*
%{_mandir}/man8/hvcsadmin.8*
%{_mandir}/man8/lparstat.8*
%{_mandir}/man8/lsdevinfo.8*
%{_mandir}/man8/lsprop.8*
@ -167,7 +193,6 @@ ln -s nvram.8.gz $RPM_BUILD_ROOT/%{_mandir}/man8/nvsetenv.8.gz
%{_mandir}/man8/nvsetenv.8*
%{_mandir}/man8/ppc64_cpu.8*
%{_mandir}/man8/rtas_dbg.8*
%{_mandir}/man8/rtas_dump.8*
%{_mandir}/man8/rtas_event_decode.8*
%{_mandir}/man8/rtas_ibm_get_vpd.8*
%{_mandir}/man8/serv_config.8*
@ -175,21 +200,36 @@ ln -s nvram.8.gz $RPM_BUILD_ROOT/%{_mandir}/man8/nvsetenv.8.gz
%{_mandir}/man8/sys_ident.8*
%{_mandir}/man8/uesensor.8*
%{_mandir}/man8/update_flash.8*
%{_mandir}/man8/update_flash_nv.8*
%{_mandir}/man8/pseries_platform.8*
%files core
%license COPYING
%{_sbindir}/nvram
%{_sbindir}/ofpathname
%{_sbindir}/pseries_platform
%{_sbindir}/drmgr
%{_mandir}/man8/update_flash_nv.8*
%{_mandir}/man8/uspchrp.8*
%{_mandir}/man8/vcpustat.8.gz
%{_mandir}/man8/smtstate.8.gz
%{_mandir}/man8/hcnmgr.8*
%{_mandir}/man8/nvram.8*
%{_mandir}/man8/ofpathname.8*
%{_mandir}/man8/drmgr.8*
%changelog
* Wed Feb 03 2021 Than Ngo <than@redhat.com> - 1.3.8-5
- Resolves: #1924150, Fix boot-time bonding interface cleanup and avoid use ifcfg
* Mon Dec 21 2020 Than Ngo <than@redhat.com> - 1.3.8-4
- Resolves: #1909526, additional patches to support Linux Hybrid Network Virtualization
- Resolves: #1909135, move commands that dont depend on perl to core subpackage
* Tue Oct 06 2020 Than Ngo <than@redhat.com> - 1.3.8-3
- Resolves: #1868474, ofpathname: Use NVMe controller physical nsid
- Resolves: #1885532, sys_ident: Skip length field from search
* Thu Oct 01 2020 Than Ngo <than@redhat.com> - 1.3.8-2
- Related: #1853297, add missing hcnmgr manpage and Req on which
* Thu Oct 01 2020 Than Ngo <than@redhat.com> - 1.3.8-1
- Resolves: #1853297, rebase to 1.3.8
- Resolves: #1802181, SR-IOV - Linux Hybrid Network Virtualization
- Resolves: #1844421, Include vcpustat
* Wed Jun 24 2020 Than Ngo <than@redhat.com> - 1.3.6-11
- Resolves: #1847604, ofpathname: failed to boot