Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package powerpc-utils for openSUSE:Factory checked in at 2023-06-07 23:05:45 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/powerpc-utils (Old) and /work/SRC/openSUSE:Factory/.powerpc-utils.new.15902 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "powerpc-utils" Wed Jun 7 23:05:45 2023 rev:137 rq:1090959 version:1.3.11 Changes: -------- --- /work/SRC/openSUSE:Factory/powerpc-utils/powerpc-utils.changes 2023-01-26 14:06:39.502989555 +0100 +++ /work/SRC/openSUSE:Factory/.powerpc-utils.new.15902/powerpc-utils.changes 2023-06-07 23:05:46.390768896 +0200 @@ -1,0 +2,9 @@ +Mon Jun 5 16:20:56 UTC 2023 - Michal Suchanek <[email protected]> + +- Fix negative utilization value reported by lparstat -E (bsc#1212031) + + lparstat-Fix-negative-values-seen-while-running-lpar.patch +- Fix lparstat error with mixed SMT state (bsc#1211883 ltc#02144) + + lparstat-report-mixed-SMT-state.patch + + lparstat-Fix-offline-threads-uninitialized-entries.patch + +------------------------------------------------------------------- New: ---- lparstat-Fix-negative-values-seen-while-running-lpar.patch lparstat-Fix-offline-threads-uninitialized-entries.patch lparstat-report-mixed-SMT-state.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ powerpc-utils.spec ++++++ --- /var/tmp/diff_new_pack.l0qkD6/_old 2023-06-07 23:05:48.314780068 +0200 +++ /var/tmp/diff_new_pack.l0qkD6/_new 2023-06-07 23:05:48.322780115 +0200 @@ -29,6 +29,9 @@ 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 BuildRequires: autoconf BuildRequires: automake BuildRequires: libnuma-devel ++++++ lparstat-Fix-negative-values-seen-while-running-lpar.patch ++++++ >From 73ba26c1240a25e7699449e82cfc09dad10fed80 Mon Sep 17 00:00:00 2001 From: Sathvika Vasireddy <[email protected]> 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 <[email protected]> Signed-off-by: Sathvika Vasireddy <[email protected]> Signed-off-by: Tyrel Datwyler <[email protected]> --- 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 ++++++ lparstat-Fix-offline-threads-uninitialized-entries.patch ++++++ >From 7a5625f2bc012fbbf0cd8384cb4e7761c5de3bb7 Mon Sep 17 00:00:00 2001 From: Laurent Dufour <[email protected]> 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 <[email protected]> --- 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 ++++++ lparstat-report-mixed-SMT-state.patch ++++++ >From 5d2e43bbf0804da52202f817f7f7fc5f18aafd11 Mon Sep 17 00:00:00 2001 From: Laurent Dufour <[email protected]> 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 <[email protected]> --- 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
