Sync from SUSE:SLFO:Main powerpc-utils revision dd74060d49305031f182b595b1255cfa
This commit is contained in:
commit
0bda6ee89d
23
.gitattributes
vendored
Normal file
23
.gitattributes
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
## Default LFS
|
||||
*.7z filter=lfs diff=lfs merge=lfs -text
|
||||
*.bsp filter=lfs diff=lfs merge=lfs -text
|
||||
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
||||
*.gem filter=lfs diff=lfs merge=lfs -text
|
||||
*.gz filter=lfs diff=lfs merge=lfs -text
|
||||
*.jar filter=lfs diff=lfs merge=lfs -text
|
||||
*.lz filter=lfs diff=lfs merge=lfs -text
|
||||
*.lzma filter=lfs diff=lfs merge=lfs -text
|
||||
*.obscpio filter=lfs diff=lfs merge=lfs -text
|
||||
*.oxt filter=lfs diff=lfs merge=lfs -text
|
||||
*.pdf filter=lfs diff=lfs merge=lfs -text
|
||||
*.png filter=lfs diff=lfs merge=lfs -text
|
||||
*.rpm filter=lfs diff=lfs merge=lfs -text
|
||||
*.tbz filter=lfs diff=lfs merge=lfs -text
|
||||
*.tbz2 filter=lfs diff=lfs merge=lfs -text
|
||||
*.tgz filter=lfs diff=lfs merge=lfs -text
|
||||
*.ttf filter=lfs diff=lfs merge=lfs -text
|
||||
*.txz filter=lfs diff=lfs merge=lfs -text
|
||||
*.whl filter=lfs diff=lfs merge=lfs -text
|
||||
*.xz filter=lfs diff=lfs merge=lfs -text
|
||||
*.zip filter=lfs diff=lfs merge=lfs -text
|
||||
*.zst filter=lfs diff=lfs merge=lfs -text
|
169
bootlist-Support-multiple-dev-paths-for-a-nvme-boot-.patch
Normal file
169
bootlist-Support-multiple-dev-paths-for-a-nvme-boot-.patch
Normal file
@ -0,0 +1,169 @@
|
||||
From 882335a30d04032d2684e165f70646b368a788b4 Mon Sep 17 00:00:00 2001
|
||||
From: Wen Xiong <wenxiong@linux.ibm.com>
|
||||
Date: Tue, 30 Jan 2024 10:49:13 -0600
|
||||
Subject: [PATCH] bootlist: Support multiple dev paths for a nvme boot device
|
||||
|
||||
Multipath splitter drawer is going to support two physical paths for
|
||||
each nvme device.
|
||||
This patch adds the support for multiple device/of paths for a nvme boot
|
||||
device.
|
||||
|
||||
For example,
|
||||
#lsslot -c pci
|
||||
U50EE.001.WZS000E-P3-C1-R1 U.2 PCI-E capable, Rev 4, 4x lanes with 2x
|
||||
lanes connected 0581:10:00.0
|
||||
U50EE.001.WZS000E-P3-C1-R2 U.2 PCI-E capable, Rev 4, 4x lanes with 2x
|
||||
lanes connected 0521:10:00.0
|
||||
|
||||
#nvme list-subsys
|
||||
nvme-subsys1 -
|
||||
NQN=nqn.1994-11.com.samsung:nvme:PM1735a:2.5-inch:S6RUNE0R900042
|
||||
hostnqn=nqn.2014-08.org.nvmexpress:uuid:3c6c1ace-e9b1-4a17-8ff0-6a84d3dd15f4
|
||||
iopolicy=numa
|
||||
\
|
||||
+- nvme1 pcie 0523:20:00.0 live
|
||||
+- nvme0 pcie 0583:20:00.0 live
|
||||
|
||||
# bootlist -m normal nvme1n1
|
||||
# bootlist -m normal -o
|
||||
nvme0
|
||||
nvme1n1
|
||||
#bootlist -m normal -r
|
||||
/pci@800000020000583/pci1014,6bc@0/namespace@1
|
||||
/pci@800000020000523/pci1014,6bc@0/namespace@1
|
||||
|
||||
Signed-off-by: Wen Xiong <wenxiong@linux.ibm.com>
|
||||
[tyreld: fixup whitespace errors]
|
||||
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
|
||||
---
|
||||
scripts/bootlist | 80 +++++++++++++++++++++++++++++++++++++++---------
|
||||
1 file changed, 66 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/scripts/bootlist b/scripts/bootlist
|
||||
index cc8718e..58c090f 100755
|
||||
--- a/scripts/bootlist
|
||||
+++ b/scripts/bootlist
|
||||
@@ -304,6 +304,21 @@ is_nvmf_device()
|
||||
fi
|
||||
}
|
||||
|
||||
+# is_multipath_nvme_device
|
||||
+# Check to see if this is a multipath nvme device
|
||||
+#
|
||||
+is_multipath_nvme_device()
|
||||
+{
|
||||
+ local res
|
||||
+
|
||||
+ res=`$FIND /sys/devices/virtual/nvme-subsystem -name $1 2>/dev/null`
|
||||
+ if [[ ${#res} = 0 ]]; then
|
||||
+ echo "no"
|
||||
+ else
|
||||
+ echo "yes"
|
||||
+ fi
|
||||
+}
|
||||
+
|
||||
# get_link
|
||||
# return the directory path that a link points to.
|
||||
# The only parameter is the link name.
|
||||
@@ -340,6 +355,32 @@ add_nvmf()
|
||||
fi
|
||||
}
|
||||
|
||||
+add_multipath_nvme()
|
||||
+{
|
||||
+ local DEVNAME=$1
|
||||
+
|
||||
+ ctrl_name=$DEVNAME
|
||||
+ local startctr=$ctr
|
||||
+
|
||||
+ local dir
|
||||
+ for dir in `$FIND /sys/devices/virtual/nvme-subsystem -name "$ctrl_name"`; do
|
||||
+ cd $dir
|
||||
+ cd ..
|
||||
+ for slave in `ls -d $PWD/nvme*`; do
|
||||
+ slavedev=${slave##*/}
|
||||
+ if [[ "$slavedev" != *nvme*n* ]] ; then
|
||||
+ LOGICAL_NAMES[$ctr]=${slavedev}
|
||||
+ ctr=$[$ctr + 1]
|
||||
+ fi
|
||||
+ done
|
||||
+ done
|
||||
+
|
||||
+ if [[ "$startctr" = "$ctr" ]] ; then
|
||||
+ LOGICAL_NAMES[$ctr]=$1
|
||||
+ ctr=$[$ctr + 1]
|
||||
+ fi
|
||||
+}
|
||||
+
|
||||
add_logical()
|
||||
{
|
||||
local DEVNAME=$1
|
||||
@@ -487,31 +528,40 @@ while [[ -n $1 ]]; do
|
||||
if [[ "$1" == *"dm-"* ]] ; then
|
||||
add_logical $1
|
||||
else
|
||||
- if [[ "$1" == *"nvme-of"* ]]; then
|
||||
+ if [[ "$1" == *"nvme-of"* ]] || [[ "$1" == *"namespace"* ]]; then
|
||||
ctrl_name=`get_logical_device_name $1`
|
||||
+ master_of_path=$1
|
||||
else
|
||||
ctrl_name=$1
|
||||
ctrl_name=${ctrl_name##*/}
|
||||
+ master_of_path=`get_of_device_name $1`
|
||||
fi
|
||||
+
|
||||
+ if [[ -z $master_of_path ]]; then
|
||||
+ echo "Device $1 does not appear to be valid." >&2
|
||||
+ exit 1
|
||||
+ fi
|
||||
+
|
||||
ctrl_name="${ctrl_name%n[0-9]*}"
|
||||
is_nvmf=$(is_nvmf_device $ctrl_name)
|
||||
if [[ $is_nvmf = "yes" ]]; then
|
||||
- if [[ "$1" == *"nvme-of"* ]]; then
|
||||
- master_of_path=$1
|
||||
- else
|
||||
- master_of_path=`get_of_device_name $1`
|
||||
- fi
|
||||
-
|
||||
- if [[ -z $master_of_path ]]; then
|
||||
- echo "Device $1 does not appear to be valid." >&2
|
||||
- exit 1
|
||||
- fi
|
||||
-
|
||||
namespace_base=${master_of_path##*/}
|
||||
DEVTYPE="nvme-of"
|
||||
add_nvmf $ctrl_name
|
||||
else
|
||||
- add_logical $1
|
||||
+ is_multipath_nvme=$(is_multipath_nvme_device $ctrl_name)
|
||||
+ if [[ $is_multipath_nvme = "yes" ]]; then
|
||||
+ if [[ "$master_of_path" == *namespace* ]] ; then
|
||||
+ namespace_base=${master_of_path##*/}
|
||||
+ else
|
||||
+ echo "Device $1 does not appear to be valid." >&2
|
||||
+ exit 1
|
||||
+ fi
|
||||
+ DEVTYPE="multi-nvme"
|
||||
+ add_multipath_nvme $ctrl_name
|
||||
+ else
|
||||
+ add_logical $1
|
||||
+ fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
@@ -534,8 +584,10 @@ if [[ ${#LOGICAL_NAMES[*]} -ne 0 ]]; then
|
||||
if [[ -z ${OF_DEVPATH[$ctr]} ]]; then
|
||||
# See if this is an OF pathname
|
||||
OF_DEVPATH[$ctr]=`get_of_device_name ${LOGICAL_NAMES[$ctr]}`
|
||||
- if [[ $DEVTYPE = "nvme-of" ]]; then
|
||||
+ if [[ $DEVTYPE = "nvme-of" ]] || [[ $DEVTYPE = "multi-nvme" ]]; then
|
||||
OF_DEVPATH[$ctr]=${OF_DEVPATH[$ctr]}/$namespace_base
|
||||
+ else
|
||||
+ OF_DEVPATH[$ctr]=${OF_DEVPATH[$ctr]}
|
||||
fi
|
||||
else
|
||||
OF_DEVPATH[$ctr]=${LOGICAL_NAMES[$ctr]}
|
||||
--
|
||||
2.43.0
|
||||
|
40
fix_kexec_service_name_for_suse.patch
Normal file
40
fix_kexec_service_name_for_suse.patch
Normal file
@ -0,0 +1,40 @@
|
||||
--- powerpc-utils-1.3.7/scripts/update_flash 2020/07/29 11:58:57 1.1
|
||||
+++ powerpc-utils-1.3.7/scripts/update_flash 2020/07/29 11:59:10
|
||||
@@ -131,7 +131,7 @@
|
||||
fi
|
||||
|
||||
# kexec service is running
|
||||
- systemctl status kexec.service | grep -w "active" >/dev/null 2>&1
|
||||
+ systemctl status kexec-load.service | grep -w "active" >/dev/null 2>&1
|
||||
if [ $? -eq 0 ]; then
|
||||
return 0
|
||||
fi
|
||||
@@ -141,7 +141,7 @@
|
||||
|
||||
# Stop kexec service
|
||||
stop_kexec_service() {
|
||||
- systemctl stop kexec.service >/dev/null 2>&1
|
||||
+ systemctl stop kexec-load.service >/dev/null 2>&1
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "update_flash: Failed to stop kexec service."
|
||||
error $E_KEXEC "Please stop kexec service and retry."
|
||||
--- powerpc-utils-1.3.7/scripts/update_flash_nv 2020/07/29 11:59:14 1.1
|
||||
+++ powerpc-utils-1.3.7/scripts/update_flash_nv 2020/07/29 11:59:23
|
||||
@@ -170,7 +170,7 @@
|
||||
fi
|
||||
|
||||
# kexec service is running
|
||||
- systemctl status kexec.service | grep -w "active" >/dev/null 2>&1
|
||||
+ systemctl status kexec-load.service | grep -w "active" >/dev/null 2>&1
|
||||
if [ $? -eq 0 ]; then
|
||||
return 0
|
||||
fi
|
||||
@@ -180,7 +180,7 @@
|
||||
|
||||
# Stop kexec service
|
||||
stop_kexec_service() {
|
||||
- systemctl stop kexec.service >/dev/null 2>&1
|
||||
+ systemctl stop kexec-load.service >/dev/null 2>&1
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "update_flash: Failed to stop kexec service."
|
||||
error $E_KEXEC "Please stop kexec service and retry."
|
15
libvirt-service-dep.patch
Normal file
15
libvirt-service-dep.patch
Normal file
@ -0,0 +1,15 @@
|
||||
Upstream: TBD
|
||||
References: lost in the mists of time
|
||||
|
||||
Index: powerpc-utils-1.3.4/systemd/smt_off.service.in
|
||||
===================================================================
|
||||
--- powerpc-utils-1.3.4.orig/systemd/smt_off.service.in
|
||||
+++ powerpc-utils-1.3.4/systemd/smt_off.service.in
|
||||
@@ -1,6 +1,6 @@
|
||||
[Unit]
|
||||
Description=ppc64 set SMT off
|
||||
-Before=libvirt-bin.service
|
||||
+Before=libvirtd.service
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
90
lparstat-Fix-negative-values-seen-while-running-lpar.patch
Normal file
90
lparstat-Fix-negative-values-seen-while-running-lpar.patch
Normal file
@ -0,0 +1,90 @@
|
||||
From 73ba26c1240a25e7699449e82cfc09dad10fed80 Mon Sep 17 00:00:00 2001
|
||||
From: Sathvika Vasireddy <sv@linux.ibm.com>
|
||||
Date: Fri, 9 Dec 2022 15:26:46 +0530
|
||||
Subject: [PATCH 1/3] lparstat: Fix negative values seen while running lparstat
|
||||
with -E option
|
||||
|
||||
Negative values are seen while running lparstat with -E option.
|
||||
This is because delta_purr value is less than delta_idle_purr.
|
||||
Given that these values are read from different sources, a
|
||||
small variation in the values is possible. So, in such cases,
|
||||
round down delta_idle_purr to delta_purr.
|
||||
|
||||
Without this patch:
|
||||
=====
|
||||
System Configuration
|
||||
type=Dedicated mode=Capped smt=8 lcpu=240 mem=67033290112 kB cpus=0
|
||||
ent=240.00
|
||||
|
||||
---Actual--- -Normalized-
|
||||
%busy %idle Frequency %busy %idle
|
||||
------ ------ ------------- ------ ------
|
||||
-0.03 100.02 3.93GHz[111%] 0.01 110.97
|
||||
0.00 100.00 3.93GHz[111%] 0.01 110.99
|
||||
-0.04 100.03 3.93GHz[111%] 0.01 110.98
|
||||
0.06 99.95 3.93GHz[111%] 0.01 110.99
|
||||
0.02 99.98 3.93GHz[111%] 0.01 110.99
|
||||
=====
|
||||
|
||||
With this patch:
|
||||
=====
|
||||
System Configuration
|
||||
type=Dedicated mode=Capped smt=8 lcpu=240 mem=67033290112 kB cpus=0
|
||||
ent=240.00
|
||||
|
||||
---Actual--- -Normalized-
|
||||
%busy %idle Frequency %busy %idle
|
||||
------ ------ ------------- ------ ------
|
||||
0.03 99.96 3.93GHz[111%] 0.01 110.98
|
||||
0.00 100.00 3.93GHz[111%] 0.01 110.99
|
||||
0.03 99.97 3.93GHz[111%] 0.01 110.99
|
||||
0.00 100.00 3.93GHz[111%] 0.01 110.99
|
||||
0.09 99.90 3.93GHz[111%] 0.01 110.99
|
||||
=====
|
||||
|
||||
Reported-by: Shirisha Ganta <shirisha.ganta1@ibm.com>
|
||||
Signed-off-by: Sathvika Vasireddy <sv@linux.ibm.com>
|
||||
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
|
||||
---
|
||||
src/lparstat.c | 18 ++++++++++++++++++
|
||||
1 file changed, 18 insertions(+)
|
||||
|
||||
diff --git a/src/lparstat.c b/src/lparstat.c
|
||||
index 31a4ee8..eebba1f 100644
|
||||
--- a/src/lparstat.c
|
||||
+++ b/src/lparstat.c
|
||||
@@ -492,6 +492,15 @@ void get_cpu_util_purr(struct sysentry *unused_se, char *buf)
|
||||
delta_purr = get_delta_value("purr");
|
||||
delta_idle_purr = get_delta_value("idle_purr");
|
||||
|
||||
+ /*
|
||||
+ * Given that these values are read from different
|
||||
+ * sources (purr from lparcfg and idle_purr from sysfs),
|
||||
+ * a small variation in the values is possible.
|
||||
+ * In such cases, round down delta_idle_purr to delta_purr.
|
||||
+ */
|
||||
+ if (delta_idle_purr > delta_purr)
|
||||
+ delta_idle_purr = delta_purr;
|
||||
+
|
||||
physc = (delta_purr - delta_idle_purr) / delta_tb;
|
||||
physc *= 100.00;
|
||||
|
||||
@@ -507,6 +516,15 @@ void get_cpu_idle_purr(struct sysentry *unused_se, char *buf)
|
||||
delta_purr = get_delta_value("purr");
|
||||
delta_idle_purr = get_delta_value("idle_purr");
|
||||
|
||||
+ /*
|
||||
+ * Given that these values are read from different
|
||||
+ * sources (purr from lparcfg and idle_purr from sysfs),
|
||||
+ * a small variation in the values is possible.
|
||||
+ * In such cases, round down delta_idle_purr to delta_purr.
|
||||
+ */
|
||||
+ if (delta_idle_purr > delta_purr)
|
||||
+ delta_idle_purr = delta_purr;
|
||||
+
|
||||
physc = (delta_purr - delta_idle_purr) / delta_tb;
|
||||
idle = (delta_purr / delta_tb) - physc;
|
||||
idle *= 100.00;
|
||||
--
|
||||
2.40.1
|
||||
|
50
lparstat-Fix-offline-threads-uninitialized-entries.patch
Normal file
50
lparstat-Fix-offline-threads-uninitialized-entries.patch
Normal file
@ -0,0 +1,50 @@
|
||||
From 7a5625f2bc012fbbf0cd8384cb4e7761c5de3bb7 Mon Sep 17 00:00:00 2001
|
||||
From: Laurent Dufour <ldufour@linux.ibm.com>
|
||||
Date: Tue, 2 May 2023 19:59:27 +0200
|
||||
Subject: [PATCH 3/3] lparstat: Fix offline threads uninitialized entries
|
||||
|
||||
When some threads are offline, lparstat -E is failing like that:
|
||||
|
||||
$ ppc64_cpu --info # CPU 20 is offline
|
||||
Core 0: 0* 1* 2* 3* 4* 5* 6* 7*
|
||||
Core 1: 8* 9* 10* 11* 12* 13* 14* 15*
|
||||
Core 2: 16* 17* 18* 19* 20 21* 22* 23*
|
||||
Core 3: 24* 25* 26* 27* 28* 29* 30* 31*
|
||||
Core 4: 32* 33* 34* 35* 36* 37* 38* 39*
|
||||
Core 5: 40* 41* 42* 43* 44* 45* 46* 47*
|
||||
$ lparstat -E
|
||||
Failed to read /sys/devices/system/cpu/cpu0/spurr
|
||||
|
||||
The message is complaining about CPU0 but the real issue is that in
|
||||
parse_sysfs_values() the test cpu_sysfs_fds[i].spurr >= 0 is valid even if
|
||||
the entry has not been initialized (cpu_sysfs_fds is alloc cleared). So
|
||||
if the number of threads online seen in assign_cpu_sysfs_fds is lower than
|
||||
threads_in_system, the loop in parse_sysfs_values() will read uninitialized
|
||||
entry, where .cpu=0.
|
||||
|
||||
To prevent that, unset entries in the cpu_sysfs_fds should have the spurr
|
||||
fd set to -1.
|
||||
|
||||
Signed-off-by: Laurent Dufour <ldufour@linux.ibm.com>
|
||||
---
|
||||
src/lparstat.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/src/lparstat.c b/src/lparstat.c
|
||||
index a9e7bce..d2fdb3f 100644
|
||||
--- a/src/lparstat.c
|
||||
+++ b/src/lparstat.c
|
||||
@@ -163,6 +163,10 @@ static int assign_cpu_sysfs_fds(int threads_in_system)
|
||||
cpu_idx++;
|
||||
}
|
||||
|
||||
+ /* Mark extra slots for offline threads unset, see parse_sysfs_values */
|
||||
+ for (; cpu_idx < threads_in_system; cpu_idx++)
|
||||
+ cpu_sysfs_fds[cpu_idx].spurr = -1;
|
||||
+
|
||||
return 0;
|
||||
error:
|
||||
fprintf(stderr, "Failed to open %s: %s\n",
|
||||
--
|
||||
2.40.1
|
||||
|
98
lparstat-report-mixed-SMT-state.patch
Normal file
98
lparstat-report-mixed-SMT-state.patch
Normal file
@ -0,0 +1,98 @@
|
||||
From 5d2e43bbf0804da52202f817f7f7fc5f18aafd11 Mon Sep 17 00:00:00 2001
|
||||
From: Laurent Dufour <ldufour@linux.ibm.com>
|
||||
Date: Tue, 2 May 2023 16:54:35 +0200
|
||||
Subject: [PATCH 2/3] lparstat: report mixed SMT state
|
||||
|
||||
when SMT state is mixed like this one (CPU 4 is offline):
|
||||
|
||||
$ ppc64_cpu --info
|
||||
Core 0: 0* 1* 2* 3* 4 5* 6* 7*
|
||||
Core 1: 8* 9* 10* 11* 12* 13* 14* 15*
|
||||
Core 2: 16* 17* 18* 19* 20* 21* 22* 23*
|
||||
Core 3: 24* 25* 26* 27* 28* 29* 30* 31*
|
||||
Core 4: 32* 33* 34* 35* 36* 37* 38* 39*
|
||||
Core 5: 40* 41* 42* 43* 44* 45* 46* 47*
|
||||
$ ppc64_cpu --smt
|
||||
SMT=7: 0
|
||||
SMT=8: 1-5
|
||||
|
||||
ppc64_cpu --smt is handling that nicely but lparstat failed reporting the
|
||||
SMT state:
|
||||
$ /usr/sbin/lparstat
|
||||
Failed to get smt state
|
||||
|
||||
System Configuration
|
||||
type=Dedicated mode=Capped smt=Capped lcpu=6 mem=65969728 kB cpus=0 ent=6.00
|
||||
|
||||
%user %sys %wait %idle physc %entc lbusy app vcsw phint
|
||||
----- ----- ----- ----- ----- ----- ----- ----- ----- -----
|
||||
0.02 0.01 0.00 99.97 3.41 56.83 0.02 0.00 4061778 156
|
||||
|
||||
Makes lparstat reporting "smt=mixed" in that case.
|
||||
__do_smt is now returning 0 when the SMT state is mixed instead of -1 which
|
||||
is also reported when an error is detected.
|
||||
This doesn't change the call made by ppc64_cpu which is using
|
||||
print_smt_state=true and so is expecting a returned value equal to 0 or -1.
|
||||
|
||||
With that patch applied, lparstat print that in the above case:
|
||||
$lparstat
|
||||
|
||||
System Configuration
|
||||
type=Dedicated mode=Capped smt=Mixed lcpu=6 mem=65969728 kB cpus=0 ent=6.00
|
||||
|
||||
%user %sys %wait %idle physc %entc lbusy app vcsw phint
|
||||
----- ----- ----- ----- ----- ----- ----- ----- ----- -----
|
||||
0.01 0.01 0.00 99.97 3.43 57.17 0.02 0.00 4105654 156
|
||||
|
||||
Signed-off-by: Laurent Dufour <ldufour@linux.ibm.com>
|
||||
---
|
||||
src/common/cpu_info_helpers.c | 4 ++--
|
||||
src/lparstat.c | 4 +++-
|
||||
2 files changed, 5 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/common/cpu_info_helpers.c b/src/common/cpu_info_helpers.c
|
||||
index 925f220..c05d96d 100644
|
||||
--- a/src/common/cpu_info_helpers.c
|
||||
+++ b/src/common/cpu_info_helpers.c
|
||||
@@ -245,7 +245,7 @@ int __do_smt(bool numeric, int cpus_in_system, int threads_per_cpu,
|
||||
if (smt_state == 0)
|
||||
smt_state = thread + 1;
|
||||
else if (smt_state > 0)
|
||||
- smt_state = -1; /* mix of SMT modes */
|
||||
+ smt_state = 0; /* mix of SMT modes */
|
||||
}
|
||||
}
|
||||
|
||||
@@ -257,7 +257,7 @@ int __do_smt(bool numeric, int cpus_in_system, int threads_per_cpu,
|
||||
printf("SMT=1\n");
|
||||
else
|
||||
printf("SMT is off\n");
|
||||
- } else if (smt_state == -1) {
|
||||
+ } else if (smt_state == 0) {
|
||||
for (thread = 0; thread < threads_per_cpu; thread++) {
|
||||
if (CPU_COUNT_S(cpu_state_size,
|
||||
cpu_states[thread])) {
|
||||
diff --git a/src/lparstat.c b/src/lparstat.c
|
||||
index eebba1f..a9e7bce 100644
|
||||
--- a/src/lparstat.c
|
||||
+++ b/src/lparstat.c
|
||||
@@ -884,13 +884,15 @@ void get_smt_mode(struct sysentry *se, char *buf)
|
||||
}
|
||||
|
||||
smt_state = parse_smt_state();
|
||||
- if (smt_state < 0) {
|
||||
+ if (smt_state == -1) {
|
||||
fprintf(stderr, "Failed to get smt state\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (smt_state == 1)
|
||||
sprintf(buf, "Off");
|
||||
+ else if (smt_state == 0)
|
||||
+ sprintf(buf, "Mixed");
|
||||
else
|
||||
sprintf(buf, "%d", smt_state);
|
||||
}
|
||||
--
|
||||
2.40.1
|
||||
|
52
nvram-man-page-and-help-output-are-not-in-sync.patch
Normal file
52
nvram-man-page-and-help-output-are-not-in-sync.patch
Normal file
@ -0,0 +1,52 @@
|
||||
From d604cc779741c29cbdc8da97cbfc1512fd21fc1b Mon Sep 17 00:00:00 2001
|
||||
From: Likhitha Korrapati <likhitha@linux.ibm.com>
|
||||
Date: Fri, 11 Aug 2023 00:41:14 -0500
|
||||
Subject: [PATCH] nvram man page and --help output are not in sync
|
||||
|
||||
The nvram man page and the output from --help option are not in
|
||||
sync and few of the options are missing in man page.
|
||||
|
||||
The options that are missing are ascii, dump, nvram-size, zero.
|
||||
These options are added through the commit ids [1], [2].
|
||||
|
||||
This patch adds the above missing options to the nvram.
|
||||
|
||||
[1] https://github.com/ibm-power-utilities/powerpc-utils/commit/0e09f4e2898e7dea556479b018a7f4bf12108099
|
||||
[2] https://github.com/ibm-power-utilities/powerpc-utils/commit/976dbe9bb7b01b135cac3e7bbd1dce0cdc88636a
|
||||
|
||||
Signed-off-by: Likhitha Korrapati <likhitha@linux.ibm.com>
|
||||
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
|
||||
---
|
||||
man/nvram.8 | 16 ++++++++++++++++
|
||||
1 file changed, 16 insertions(+)
|
||||
|
||||
diff --git a/man/nvram.8 b/man/nvram.8
|
||||
index 2938e34..6071712 100644
|
||||
--- a/man/nvram.8
|
||||
+++ b/man/nvram.8
|
||||
@@ -67,6 +67,22 @@ be more verbose.
|
||||
\fB\--help
|
||||
print usage information including other low level options useful for
|
||||
debugging nvram.
|
||||
+.TP
|
||||
+\fB\--ascii \fIname
|
||||
+print partition contents as ASCII text
|
||||
+.TP
|
||||
+\fB\--dump \fIname
|
||||
+raw dump of partition (use --partitions to see names)
|
||||
+.TP
|
||||
+\fB\--nvram-size
|
||||
+specify size of nvram data, must in multiples of 16 Bytes (for repair
|
||||
+operations)
|
||||
+.TP
|
||||
+\fB\--unzip \fIname
|
||||
+decompress and print compressed data from partition
|
||||
+.TP
|
||||
+\fB\--zero | 0 \fR
|
||||
+terminate config pairs with a NULL character
|
||||
.SH FILES
|
||||
/dev/nvram
|
||||
.SH AUTHOR
|
||||
--
|
||||
2.43.0
|
||||
|
14
nvsetenv
Normal file
14
nvsetenv
Normal file
@ -0,0 +1,14 @@
|
||||
#!/bin/sh
|
||||
|
||||
if [ "$1" = "--version" ]; then
|
||||
echo This version of nvsetenv is just a wrapper to invoke nvram
|
||||
exit 0
|
||||
fi
|
||||
if [ -z "$1" ]; then
|
||||
nvram --print-config
|
||||
elif [ -z "$2" ]; then
|
||||
nvram --print-config="$1"
|
||||
else
|
||||
nvram --update-config "$1"="$2"
|
||||
fi
|
||||
exit $?
|
16
ofpathname_powernv.patch
Normal file
16
ofpathname_powernv.patch
Normal file
@ -0,0 +1,16 @@
|
||||
Upstream: TBD
|
||||
References: boo#933651
|
||||
|
||||
Index: powerpc-utils-1.3.7/scripts/ofpathname
|
||||
===================================================================
|
||||
--- powerpc-utils-1.3.7.orig/scripts/ofpathname
|
||||
+++ powerpc-utils-1.3.7/scripts/ofpathname
|
||||
@@ -1632,7 +1632,7 @@ of2l_nvme()
|
||||
. $PSERIES_PLATFORM
|
||||
if [[ $platform = $PLATFORM_POWERNV ]]; then
|
||||
echo "$OFPATHNAME: is not supported on the $platform_name platform" 1>&2
|
||||
- exit 1
|
||||
+ exit 0
|
||||
fi
|
||||
|
||||
if [[ "$#" -eq 0 ]]; then
|
56
powerpc-nvram-Fix-Segmentation-fault-issue-in-nvram-.patch
Normal file
56
powerpc-nvram-Fix-Segmentation-fault-issue-in-nvram-.patch
Normal file
@ -0,0 +1,56 @@
|
||||
From a6d31caf4eaa453d3ec879f02163b3a515789b85 Mon Sep 17 00:00:00 2001
|
||||
From: Likhitha Korrapati <likhitha@linux.ibm.com>
|
||||
Date: Mon, 11 Sep 2023 05:23:37 -0500
|
||||
Subject: [PATCH] powerpc/nvram: Fix Segmentation fault issue in nvram-size.
|
||||
|
||||
nvram-size option results in segmentation fault when the user
|
||||
specifies value larger than the default nvram size
|
||||
|
||||
Without the patch:
|
||||
[root@xxx ~]# nvram --nvram-size 1048592
|
||||
nvram: WARNING: expected 1048592 bytes, but only read 15360!
|
||||
Segmentation fault (core dumped)
|
||||
|
||||
Segmentation fault is caused because the phead->length is becoming 0.
|
||||
And because of this the p_start doesn't get updated which makes the
|
||||
while loop run infinitely resulting in segmentation fault.
|
||||
This patch adds a condition check for phead->length to avoid infinite
|
||||
while loop.
|
||||
|
||||
With the patch:
|
||||
[root@xxx src]# ./nvram --nvram-size 1048592
|
||||
./nvram: WARNING: expected 1048592 bytes, but only read 15360!
|
||||
[root@xxx src]# ./nvram --nvram-size 268435456
|
||||
./nvram: WARNING: expected 268435456 bytes, but only read 15360!
|
||||
[root@xxx src]#
|
||||
|
||||
Reported-by: Shirisha Ganta <shirisha@linux.ibm.com>
|
||||
Signed-off-by: Likhitha Korrapati <likhitha@linux.ibm.com>
|
||||
[tyreld: fixed up else block]
|
||||
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
|
||||
---
|
||||
src/nvram.c | 8 ++++++--
|
||||
1 file changed, 6 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/nvram.c b/src/nvram.c
|
||||
index 095e747..1987c3d 100644
|
||||
--- a/src/nvram.c
|
||||
+++ b/src/nvram.c
|
||||
@@ -460,8 +460,12 @@ nvram_parse_partitions(struct nvram *nvram)
|
||||
c_sum = checksum(phead);
|
||||
if (c_sum != phead->checksum)
|
||||
warn_msg("this partition checksum should be %02x!\n", c_sum);
|
||||
- phead->length = be16toh(phead->length);
|
||||
- p_start += phead->length * NVRAM_BLOCK_SIZE;
|
||||
+ if (phead->length != 0) {
|
||||
+ phead->length = be16toh(phead->length);
|
||||
+ p_start += phead->length * NVRAM_BLOCK_SIZE;
|
||||
+ } else {
|
||||
+ break;
|
||||
+ }
|
||||
}
|
||||
|
||||
if (verbose)
|
||||
--
|
||||
2.43.0
|
||||
|
52
powerpc-nvram-fix-segmentation-fault-issue-in-print-.patch
Normal file
52
powerpc-nvram-fix-segmentation-fault-issue-in-print-.patch
Normal file
@ -0,0 +1,52 @@
|
||||
From 3f72b8326a2fc9a9dffb4b31d0ce3abf12e24751 Mon Sep 17 00:00:00 2001
|
||||
From: Likhitha Korrapati <likhitha@linux.ibm.com>
|
||||
Date: Thu, 25 Jan 2024 15:44:02 +0530
|
||||
Subject: [PATCH] powerpc/nvram: fix segmentation fault issue in print-config
|
||||
|
||||
print-config option in nvram results in segmentation fault when the
|
||||
user provides a very large value.
|
||||
|
||||
without the patch:
|
||||
[root@xxx powerpc-utils]# nvram --print-config=real-mode?
|
||||
true
|
||||
[root@xxx powerpc-utils]# nvram --print-config=$(perl -e 'p
|
||||
rint "A"x1000000')
|
||||
Segmentation fault (core dumped)
|
||||
|
||||
The Segmentation fault occurs because the code tries to access memory
|
||||
beyond the bounds of the data at index varlen. varlen is the length of
|
||||
the string provided by the user.
|
||||
|
||||
This patch adds a condition to check whether the length of the data is
|
||||
greater than varlen to prevent accessing out of bounds.
|
||||
|
||||
with the patch:
|
||||
[root@xxx powerpc-utils]# ./src/nvram --print-config=real-m
|
||||
ode?
|
||||
true
|
||||
[root@xxx powerpc-utils]# ./src/nvram --print-config=$(perl
|
||||
-e 'print "A"x1000000')
|
||||
|
||||
Reported-by: Shirisha Ganta <shirisha@linux.ibm.com>
|
||||
Signed-off-by: Likhitha Korrapati <likhitha@linux.ibm.com>
|
||||
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
|
||||
---
|
||||
src/nvram.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/nvram.c b/src/nvram.c
|
||||
index f051e9c..095e747 100644
|
||||
--- a/src/nvram.c
|
||||
+++ b/src/nvram.c
|
||||
@@ -1280,7 +1280,7 @@ print_of_config(struct nvram *nvram, char *config_var, char *pname,
|
||||
|
||||
data = (char *)phead + sizeof(*phead);
|
||||
while (*data != '\0') {
|
||||
- if ((data[varlen] == '=') &&
|
||||
+ if (strlen(data) > varlen && (data[varlen] == '=') &&
|
||||
strncmp(config_var, data, varlen) == 0) {
|
||||
printf("%s%c", data + varlen + 1, terminator);
|
||||
rc = 0;
|
||||
--
|
||||
2.43.0
|
||||
|
BIN
powerpc-utils-1.3.11.tar.gz
(Stored with Git LFS)
Normal file
BIN
powerpc-utils-1.3.11.tar.gz
(Stored with Git LFS)
Normal file
Binary file not shown.
16
powerpc-utils-lsprop.patch
Normal file
16
powerpc-utils-lsprop.patch
Normal file
@ -0,0 +1,16 @@
|
||||
Upstream: TBD
|
||||
References: lost in the mists of time
|
||||
|
||||
Index: powerpc-utils-1.3.4/src/lsprop.c
|
||||
===================================================================
|
||||
--- powerpc-utils-1.3.4.orig/src/lsprop.c
|
||||
+++ powerpc-utils-1.3.4/src/lsprop.c
|
||||
@@ -30,7 +30,7 @@
|
||||
#endif
|
||||
|
||||
int recurse;
|
||||
-int maxbytes = 128;
|
||||
+int maxbytes = 64 * 1024;
|
||||
int words_per_line = 0;
|
||||
unsigned char *buf;
|
||||
|
41
powerpc-utils-scripts-ofpathname-handle-nsid-of-nvme.patch
Normal file
41
powerpc-utils-scripts-ofpathname-handle-nsid-of-nvme.patch
Normal file
@ -0,0 +1,41 @@
|
||||
From 8a7aa61c5f520df03e53e6f7e1d63b7d5c432376 Mon Sep 17 00:00:00 2001
|
||||
From: Wen Xiong <wenxiong@linux.ibm.com>
|
||||
Date: Wed, 15 Nov 2023 14:37:43 -0600
|
||||
Subject: [PATCH] powerpc-utils/scripts/ofpathname: handle nsid of nvme device
|
||||
as hex number
|
||||
|
||||
Git-commit: 8a7aa61c5f520df03e53e6f7e1d63b7d5c432376
|
||||
|
||||
Installation fails if nsid of nvme device is greater than 10.
|
||||
|
||||
The patch fixes the issue and handle nsid of nvme ad a hex number.
|
||||
|
||||
Signed-off-by: Wen Xiong <wenxiong@linux.ibm.com>
|
||||
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
|
||||
---
|
||||
scripts/ofpathname | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/scripts/ofpathname b/scripts/ofpathname
|
||||
index 3abe4d1..833d03f 100755
|
||||
--- a/scripts/ofpathname
|
||||
+++ b/scripts/ofpathname
|
||||
@@ -722,6 +722,7 @@ l2of_nvme()
|
||||
err $ERR_NO_OFPATH
|
||||
fi
|
||||
|
||||
+ devnsid=$(printf "%x" $devnsid)
|
||||
OF_PATH="$OF_PATH/$devtype@$devnsid"
|
||||
|
||||
# No partition (pZ) specified.
|
||||
@@ -1798,6 +1799,7 @@ of2l_nvme()
|
||||
cd $dir
|
||||
|
||||
local devnsid=`$CAT ./nsid 2>/dev/null`
|
||||
+ devnsid=$(printf "%x" $devnsid)
|
||||
if [[ $devnsid = $nsid ]]; then
|
||||
LOGICAL_DEVNAME="${dir##*/}"
|
||||
break
|
||||
--
|
||||
2.43.0
|
||||
|
1754
powerpc-utils.changes
Normal file
1754
powerpc-utils.changes
Normal file
File diff suppressed because it is too large
Load Diff
135
powerpc-utils.spec
Normal file
135
powerpc-utils.spec
Normal file
@ -0,0 +1,135 @@
|
||||
#
|
||||
# spec file for package powerpc-utils
|
||||
#
|
||||
# Copyright (c) 2024 SUSE LLC
|
||||
#
|
||||
# All modifications and additions to the file contributed by third parties
|
||||
# remain the property of their copyright owners, unless otherwise agreed
|
||||
# upon. The license for this file, and modifications and additions to the
|
||||
# file, is the same license as for the pristine package itself (unless the
|
||||
# license for the pristine package is not an Open Source License, in which
|
||||
# case the license is the MIT License). An "Open Source License" is a
|
||||
# license that conforms to the Open Source Definition (Version 1.9)
|
||||
# published by the Open Source Initiative.
|
||||
|
||||
# Please submit bugfixes or comments via https://bugs.opensuse.org/
|
||||
#
|
||||
|
||||
|
||||
Name: powerpc-utils
|
||||
Version: 1.3.11
|
||||
Release: 0
|
||||
Summary: Utilities for PowerPC Hardware
|
||||
License: GPL-2.0-or-later
|
||||
Group: System/Management
|
||||
URL: https://github.com/ibm-power-utilities/powerpc-utils
|
||||
Source0: https://github.com/ibm-power-utilities/powerpc-utils/archive/v%{version}.tar.gz#/%{name}-%{version}.tar.gz
|
||||
Source1: nvsetenv
|
||||
Patch1: powerpc-utils-lsprop.patch
|
||||
Patch2: ofpathname_powernv.patch
|
||||
Patch3: fix_kexec_service_name_for_suse.patch
|
||||
Patch4: libvirt-service-dep.patch
|
||||
Patch5: lparstat-Fix-negative-values-seen-while-running-lpar.patch
|
||||
Patch6: lparstat-report-mixed-SMT-state.patch
|
||||
Patch7: lparstat-Fix-offline-threads-uninitialized-entries.patch
|
||||
Patch8: ppc64_cpu-Support-partial-SMT-level-through-SYS-FS-s.patch
|
||||
Patch9: powerpc-utils-scripts-ofpathname-handle-nsid-of-nvme.patch
|
||||
Patch10: bootlist-Support-multiple-dev-paths-for-a-nvme-boot-.patch
|
||||
Patch11: rtas_dbg-Fix-the-large-negative-values-in-rtas_dbg.patch
|
||||
Patch12: powerpc-nvram-fix-segmentation-fault-issue-in-print-.patch
|
||||
Patch13: powerpc-nvram-Fix-Segmentation-fault-issue-in-nvram-.patch
|
||||
Patch14: nvram-man-page-and-help-output-are-not-in-sync.patch
|
||||
Patch15: ppc64_cpu-info-fix-bad-report-when-non-continuous-CP.patch
|
||||
BuildRequires: autoconf
|
||||
BuildRequires: automake
|
||||
BuildRequires: libnuma-devel
|
||||
BuildRequires: librtas-devel
|
||||
BuildRequires: pkgconfig
|
||||
BuildRequires: systemd-rpm-macros
|
||||
BuildRequires: pkgconfig(zlib)
|
||||
Requires: bc
|
||||
Requires: coreutils
|
||||
Requires: findutils
|
||||
Requires: gawk
|
||||
Requires: grep
|
||||
Requires: kmod-compat
|
||||
Requires: systemd-sysvinit
|
||||
Requires: udev
|
||||
Requires: util-linux
|
||||
Recommends: powerpc-utils-python
|
||||
ExclusiveArch: ppc ppc64 ppc64le
|
||||
%{?systemd_requires}
|
||||
|
||||
%description
|
||||
The powerpc-utils package provides a set of tools and utilities and
|
||||
utilities for maintaining and enabling certain features of Linux on Power.
|
||||
|
||||
%prep
|
||||
%setup -q
|
||||
%autopatch -p1
|
||||
|
||||
%build
|
||||
autoreconf -fvi
|
||||
%configure \
|
||||
--disable-silent-rules \
|
||||
--with-systemd=%{_unitdir}
|
||||
make CFLAGS="%{optflags}" %{?_smp_mflags}
|
||||
|
||||
%install
|
||||
%make_install \
|
||||
rasdir=%{_sbindir} \
|
||||
mandir=%{_mandir}
|
||||
%if 0%{?suse_version} < 1550
|
||||
mkdir %{buildroot}/sbin
|
||||
ln -sf %{_sbindir}/lsprop %{buildroot}/sbin/lsprop
|
||||
%endif
|
||||
install -m 755 %{SOURCE1} %{buildroot}%{_sbindir}/nvsetenv
|
||||
ln -sf serv_config %{buildroot}%{_sbindir}/uspchrp
|
||||
ln -sf %{_mandir}/man8/serv_config.8 %{buildroot}%{_mandir}/man8/uspchrp.8
|
||||
ln -sf drmgr %{buildroot}%{_sbindir}/drslot_chrp_slot
|
||||
ln -sf drmgr %{buildroot}%{_sbindir}/drslot_chrp_pci
|
||||
ln -sf drmgr %{buildroot}%{_sbindir}/drslot_chrp_cpu
|
||||
ln -sf drmgr %{buildroot}%{_sbindir}/drslot_chrp_phb
|
||||
ln -sf drmgr %{buildroot}%{_sbindir}/drslot_chrp_mem
|
||||
ln -sf drmgr %{buildroot}%{_sbindir}/drslot_chrp_hea
|
||||
ln -sf drmgr %{buildroot}%{_sbindir}/drmig_chrp_pmig
|
||||
|
||||
ln -s service %{buildroot}%{_sbindir}/rcsmt_off
|
||||
|
||||
install -m 644 systemd/hcn-init.service.suse %{buildroot}%{_unitdir}/hcn-init.service
|
||||
mkdir -p %{buildroot}/usr/lib/powerpc-utils
|
||||
install -m 644 scripts/functions.suse %{buildroot}/usr/lib/powerpc-utils/functions.suse
|
||||
|
||||
# remove docu installed by make_install as we hand-install them in %%files
|
||||
rm -rf %{buildroot}%{_docdir}/%{name}/*
|
||||
|
||||
%pre
|
||||
%service_add_pre hcn-init.service smt_off.service smtstate.service
|
||||
|
||||
%post
|
||||
%service_add_post hcn-init.service smt_off.service smtstate.service
|
||||
|
||||
%preun
|
||||
%service_del_preun hcn-init.service smt_off.service smtstate.service
|
||||
|
||||
%postun
|
||||
%service_del_postun hcn-init.service smt_off.service smtstate.service
|
||||
|
||||
%files
|
||||
%license COPYING
|
||||
%doc README Changelog
|
||||
%{_mandir}/man*/*
|
||||
%{_sbindir}/*
|
||||
%{_bindir}/*
|
||||
%if 0%{?suse_version} < 1550
|
||||
/sbin/lsprop
|
||||
%endif
|
||||
%dir %{_localstatedir}/lib/powerpc-utils
|
||||
%config(noreplace) %{_localstatedir}/lib/powerpc-utils/smt.state
|
||||
%dir /usr/lib/powerpc-utils
|
||||
/usr/lib/powerpc-utils/functions.suse
|
||||
%{_unitdir}/hcn-init.service
|
||||
%{_unitdir}/smt_off.service
|
||||
%{_unitdir}/smtstate.service
|
||||
|
||||
%changelog
|
71
ppc64_cpu-Support-partial-SMT-level-through-SYS-FS-s.patch
Normal file
71
ppc64_cpu-Support-partial-SMT-level-through-SYS-FS-s.patch
Normal file
@ -0,0 +1,71 @@
|
||||
From 46c524be975a108d2b8d1cadb95003b9c2670c8e Mon Sep 17 00:00:00 2001
|
||||
From: Laurent Dufour <ldufour@linux.ibm.com>
|
||||
Date: Thu, 29 Jun 2023 16:41:37 +0200
|
||||
Subject: [PATCH] ppc64_cpu: Support partial SMT level through SYS FS
|
||||
smt/control files
|
||||
|
||||
The next kernel release will support partial SMT level [1] though the SYS
|
||||
FS file "devices/system/cpu/smt/control". This allows the SMT level to be
|
||||
recorded in the kernel. With the current SMT level stored in the kernel,
|
||||
when a new CPU is added, only the necessary threads are brought online.
|
||||
|
||||
The legacy way to active threads through the SYS FS files
|
||||
'devices/system/cpu/cpu<n>/online', is still used in the case the new SYS
|
||||
FS API is not available. This allows compatibility with the previous kernel
|
||||
versions.
|
||||
|
||||
[1] https://lore.kernel.org/linuxppc-dev/20230705145143.40545-1-ldufour@linux.ibm.com/
|
||||
|
||||
Signed-off-by: Laurent Dufour <ldufour@linux.ibm.com>
|
||||
---
|
||||
src/ppc64_cpu.c | 20 +++++++++++++++++++-
|
||||
1 file changed, 19 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/ppc64_cpu.c b/src/ppc64_cpu.c
|
||||
index 5fdf86a..c33a293 100644
|
||||
--- a/src/ppc64_cpu.c
|
||||
+++ b/src/ppc64_cpu.c
|
||||
@@ -56,6 +56,8 @@
|
||||
#define DIAGNOSTICS_RUN_MODE 42
|
||||
#define CPU_OFFLINE -1
|
||||
|
||||
+#define SYS_SMT_CONTROL "/sys/devices/system/cpu/smt/control"
|
||||
+
|
||||
#ifdef HAVE_LINUX_PERF_EVENT_H
|
||||
struct cpu_freq {
|
||||
int offline;
|
||||
@@ -360,6 +362,20 @@ static int is_dscr_capable(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Depends on kernel's CONFIG_HOTPLUG_CPU
|
||||
+ */
|
||||
+static int set_smt_control(int smt_state)
|
||||
+{
|
||||
+ if (set_attribute(SYS_SMT_CONTROL, "%d", smt_state)) {
|
||||
+ /* Silently ignore kernel not supporting this feature */
|
||||
+ if (errno != ENODEV)
|
||||
+ perror(SYS_SMT_CONTROL);
|
||||
+ return -1;
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int do_smt(char *state, bool numeric)
|
||||
{
|
||||
int rc = 0;
|
||||
@@ -388,7 +404,9 @@ static int do_smt(char *state, bool numeric)
|
||||
return -1;
|
||||
}
|
||||
|
||||
- rc = set_smt_state(smt_state);
|
||||
+ /* Try using smt/control if failing, fall back to the legacy way */
|
||||
+ if (set_smt_control(smt_state))
|
||||
+ rc = set_smt_state(smt_state);
|
||||
}
|
||||
|
||||
return rc;
|
||||
--
|
||||
2.41.0
|
||||
|
156
ppc64_cpu-info-fix-bad-report-when-non-continuous-CP.patch
Normal file
156
ppc64_cpu-info-fix-bad-report-when-non-continuous-CP.patch
Normal file
@ -0,0 +1,156 @@
|
||||
From f1a8ed892e18b83cb0483e8f8f8cbc512fa8510c Mon Sep 17 00:00:00 2001
|
||||
From: Laurent Dufour <ldufour@linux.ibm.com>
|
||||
Date: Thu, 10 Aug 2023 11:47:07 +0200
|
||||
Subject: [PATCH] ppc64_cpu/info: fix bad report when non continuous CPU ids
|
||||
|
||||
When CPU ids are not continuous, let say that the kernel didn't reuse a set
|
||||
of CPU ids already used on a different nodes, the output of ppc64_cpu
|
||||
--info is not correct.
|
||||
|
||||
For instance, in the example below the CPU id 48 to 55 haven't been reused
|
||||
by the kernel when a CPU has been added after a LPM operation.
|
||||
Note that the system is running in SMT=4.
|
||||
|
||||
The numactl -H command is providing the correct set of CPU:
|
||||
ltczep3-lp4:~ # numactl -H
|
||||
available: 2 nodes (0-1)
|
||||
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 64 65 66 67 68 69 70 71
|
||||
node 0 size: 7177 MB
|
||||
node 0 free: 4235 MB
|
||||
node 1 cpus: 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
||||
node 1 size: 24508 MB
|
||||
node 1 free: 23539 MB
|
||||
node distances:
|
||||
node 0 1
|
||||
0: 10 40
|
||||
1: 40 10
|
||||
|
||||
But ppc64_cpu --info is reporting the CPUs 48 to 55 offlined while not
|
||||
reporting at all the CPU 65 to 71:
|
||||
ltczep3-lp4:~ # ppc64_cpu --info
|
||||
Core 0: 0* 1* 2* 3* 4* 5* 6* 7*
|
||||
Core 1: 8* 9* 10* 11* 12* 13* 14* 15*
|
||||
Core 2: 16* 17* 18* 19* 20* 21* 22* 23*
|
||||
Core 3: 24* 25* 26* 27* 28* 29* 30* 31*
|
||||
Core 4: 32* 33* 34* 35* 36* 37* 38* 39*
|
||||
Core 5: 40* 41* 42* 43* 44* 45* 46* 47*
|
||||
Core 6: 48 49 50 51 52 53 54 55
|
||||
|
||||
This is because it is considering that the CPU id are continuous which is
|
||||
not the case here.
|
||||
|
||||
To prevent that, when looking for a core, it is now first checking that the
|
||||
physical_id of the first thread in that core is defined (not -1). If that
|
||||
the case this means that CPU/core is present.
|
||||
|
||||
With that patch applied, ppc64_cpu --info is reporting:
|
||||
ltczep3-lp4:~ # pc64_cpu --info
|
||||
Core 0: 0* 1* 2* 3* 4 5 6 7
|
||||
Core 1: 8* 9* 10* 11* 12 13 14 15
|
||||
Core 2: 16* 17* 18* 19* 20 21 22 23
|
||||
Core 3: 24* 25* 26* 27* 28 29 30 31
|
||||
Core 4: 32* 33* 34* 35* 36 37 38 39
|
||||
Core 5: 40* 41* 42* 43* 44 45 46 47
|
||||
Core 6: 64* 65* 66* 67* 68 69 70 71
|
||||
|
||||
Signed-off-by: Laurent Dufour <ldufour@linux.ibm.com>
|
||||
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
|
||||
---
|
||||
src/common/cpu_info_helpers.c | 14 ++++++++++++++
|
||||
src/common/cpu_info_helpers.h | 1 +
|
||||
src/ppc64_cpu.c | 25 +++++++++++++++++--------
|
||||
3 files changed, 32 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/src/common/cpu_info_helpers.c b/src/common/cpu_info_helpers.c
|
||||
index c05d96d..8c57db8 100644
|
||||
--- a/src/common/cpu_info_helpers.c
|
||||
+++ b/src/common/cpu_info_helpers.c
|
||||
@@ -83,6 +83,20 @@ int __sysattr_is_writeable(char *attribute, int threads_in_system)
|
||||
return test_sysattr(attribute, W_OK, threads_in_system);
|
||||
}
|
||||
|
||||
+int cpu_physical_id(int thread)
|
||||
+{
|
||||
+ char path[SYSFS_PATH_MAX];
|
||||
+ int rc, physical_id;
|
||||
+
|
||||
+ sprintf(path, SYSFS_CPUDIR"/physical_id", thread);
|
||||
+ rc = get_attribute(path, "%d", &physical_id);
|
||||
+
|
||||
+ /* This attribute does not exist in kernels without hotplug enabled */
|
||||
+ if (rc && errno == ENOENT)
|
||||
+ return -1;
|
||||
+ return physical_id;
|
||||
+}
|
||||
+
|
||||
int cpu_online(int thread)
|
||||
{
|
||||
char path[SYSFS_PATH_MAX];
|
||||
diff --git a/src/common/cpu_info_helpers.h b/src/common/cpu_info_helpers.h
|
||||
index 8f09d79..c063fff 100644
|
||||
--- a/src/common/cpu_info_helpers.h
|
||||
+++ b/src/common/cpu_info_helpers.h
|
||||
@@ -32,6 +32,7 @@
|
||||
|
||||
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_physical_id(int thread);
|
||||
extern int cpu_online(int thread);
|
||||
extern int is_subcore_capable(void);
|
||||
extern int num_subcores(void);
|
||||
diff --git a/src/ppc64_cpu.c b/src/ppc64_cpu.c
|
||||
index 5fdf86a..ad9f4dc 100644
|
||||
--- a/src/ppc64_cpu.c
|
||||
+++ b/src/ppc64_cpu.c
|
||||
@@ -1251,31 +1251,40 @@ static int do_cores_on(char *state)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static bool core_is_online(int core)
|
||||
+{
|
||||
+ return cpu_physical_id(core * threads_per_cpu) != -1;
|
||||
+}
|
||||
+
|
||||
static int do_info(void)
|
||||
{
|
||||
int i, j, thread_num;
|
||||
char online;
|
||||
- int subcores = 0;
|
||||
+ int core, subcores = 0;
|
||||
|
||||
if (is_subcore_capable())
|
||||
subcores = num_subcores();
|
||||
|
||||
- for (i = 0; i < cpus_in_system; i++) {
|
||||
+ for (i = 0, core = 0; core < cpus_in_system; i++) {
|
||||
+
|
||||
+ if (!core_is_online(i))
|
||||
+ continue;
|
||||
|
||||
if (subcores > 1) {
|
||||
- if (i % subcores == 0)
|
||||
- printf("Core %3d:\n", i/subcores);
|
||||
- printf(" Subcore %3d: ", i);
|
||||
+ if (core % subcores == 0)
|
||||
+ printf("Core %3d:\n", core/subcores);
|
||||
+ printf(" Subcore %3d: ", core);
|
||||
} else {
|
||||
- printf("Core %3d: ", i);
|
||||
+ printf("Core %3d: ", core);
|
||||
}
|
||||
|
||||
- for (j = 0; j < threads_per_cpu; j++) {
|
||||
- thread_num = i*threads_per_cpu + j;
|
||||
+ thread_num = i * threads_per_cpu;
|
||||
+ for (j = 0; j < threads_per_cpu; j++, thread_num++) {
|
||||
online = cpu_online(thread_num) ? '*' : ' ';
|
||||
printf("%4d%c ", thread_num, online);
|
||||
}
|
||||
printf("\n");
|
||||
+ core++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
--
|
||||
2.43.0
|
||||
|
75
rtas_dbg-Fix-the-large-negative-values-in-rtas_dbg.patch
Normal file
75
rtas_dbg-Fix-the-large-negative-values-in-rtas_dbg.patch
Normal file
@ -0,0 +1,75 @@
|
||||
From 9caa77e4477a73064a6deea253fd3faea32648fb Mon Sep 17 00:00:00 2001
|
||||
From: Likhitha Korrapati <likhitha@linux.ibm.com>
|
||||
Date: Fri, 17 Nov 2023 01:42:29 -0500
|
||||
Subject: [PATCH] rtas_dbg: Fix the large negative values in rtas_dbg
|
||||
|
||||
without the patch:
|
||||
[root@xxx powerpc-utils]# rtas_dbg -l ibm,rks-hcalls
|
||||
Could not get rtas token for ibm,indicator-0002
|
||||
Could not get rtas token for ibm,integrated-stop-self
|
||||
Could not get rtas token for ibm,indicator-9005
|
||||
Could not get rtas token for ibm,extended-os-term
|
||||
Could not get rtas token for ibm,indicator-0001
|
||||
Could not get rtas token for ibm,sensor-0009
|
||||
Could not get rtas token for ibm,recoverable-epow3
|
||||
Could not get rtas token for ibm,sensor-9005
|
||||
Could not get rtas token for ibm,change-msix-capable
|
||||
Could not get rtas token for ibm,sensor-0005
|
||||
Could not get rtas token for ibm,sensor-0001
|
||||
ibm,rks-hcalls -536870912
|
||||
|
||||
The large negatives values are due to incompatible format(%d).
|
||||
The data type of the token variable is uint32_t.This patch
|
||||
modifies the format(%u) to align with its data type(uint32_t).
|
||||
|
||||
with the patch:
|
||||
[root@xxx powerpc-utils]# ./src/rtas_dbg -l ibm,rks-hcalls
|
||||
Could not get rtas token for ibm,indicator-0002
|
||||
Could not get rtas token for ibm,integrated-stop-self
|
||||
Could not get rtas token for ibm,indicator-9005
|
||||
Could not get rtas token for ibm,extended-os-term
|
||||
Could not get rtas token for ibm,indicator-0001
|
||||
Could not get rtas token for ibm,sensor-0009
|
||||
Could not get rtas token for ibm,recoverable-epow3
|
||||
Could not get rtas token for ibm,sensor-9005
|
||||
Could not get rtas token for ibm,change-msix-capable
|
||||
Could not get rtas token for ibm,sensor-0005
|
||||
Could not get rtas token for ibm,sensor-0001
|
||||
ibm,rks-hcalls 3758096384
|
||||
|
||||
Reported-by: Shirisha Ganta <shirisha@linux.ibm.com>
|
||||
Signed-off-by: Likhitha Korrapati <likhitha@linux.ibm.com>
|
||||
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
|
||||
---
|
||||
src/rtas_dbg.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/rtas_dbg.c b/src/rtas_dbg.c
|
||||
index ebc7474..6c7854a 100644
|
||||
--- a/src/rtas_dbg.c
|
||||
+++ b/src/rtas_dbg.c
|
||||
@@ -200,10 +200,10 @@ void print_rtas_tokens(struct rtas_token *tok, struct rtas_token *tok_list)
|
||||
struct rtas_token *t;
|
||||
|
||||
if (tok)
|
||||
- printf("%-40s%d\n", tok->name, tok->token);
|
||||
+ printf("%-40s%u\n", tok->name, tok->token);
|
||||
else {
|
||||
for (t = tok_list; t; t = t->next)
|
||||
- printf("%-40s%d\n", t->name, t->token);
|
||||
+ printf("%-40s%u\n", t->name, t->token);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -217,7 +217,7 @@ int set_rtas_dbg(struct rtas_token *tok)
|
||||
args.nret = htobe32(1);
|
||||
args.args[0] = htobe32(tok->token);
|
||||
|
||||
- printf("Enabling rtas debug for %s (%d)\n", tok->name, tok->token);
|
||||
+ printf("Enabling rtas debug for %s (%u)\n", tok->name, tok->token);
|
||||
|
||||
rc = rtas(&args);
|
||||
|
||||
--
|
||||
2.43.0
|
||||
|
Loading…
Reference in New Issue
Block a user