summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Sturmlechner <asturm@gentoo.org>2023-06-30 19:09:02 +0200
committerAndreas Sturmlechner <asturm@gentoo.org>2023-06-30 19:25:01 +0200
commit7c5246cdd7e13c97f2102ce44aaa2d05c8d90381 (patch)
treeb63d6d27128223b27e7e987671ae96177c19de5d
parentdev-db/postgresql: drop 10.23 (diff)
downloadgentoo-7c5246cdd7e13c97f2102ce44aaa2d05c8d90381.tar.gz
gentoo-7c5246cdd7e13c97f2102ce44aaa2d05c8d90381.tar.bz2
gentoo-7c5246cdd7e13c97f2102ce44aaa2d05c8d90381.zip
kde-plasma/ksystemstats: gpu/nvidia: Discover future data fields
KDE-bug: https://bugs.kde.org/show_bug.cgi?id=470474 Signed-off-by: Andreas Sturmlechner <asturm@gentoo.org>
-rw-r--r--kde-plasma/ksystemstats/files/ksystemstats-5.27.6-nvidia-data-fields.patch131
-rw-r--r--kde-plasma/ksystemstats/ksystemstats-5.27.6-r1.ebuild47
2 files changed, 178 insertions, 0 deletions
diff --git a/kde-plasma/ksystemstats/files/ksystemstats-5.27.6-nvidia-data-fields.patch b/kde-plasma/ksystemstats/files/ksystemstats-5.27.6-nvidia-data-fields.patch
new file mode 100644
index 000000000000..718bbd8c64e2
--- /dev/null
+++ b/kde-plasma/ksystemstats/files/ksystemstats-5.27.6-nvidia-data-fields.patch
@@ -0,0 +1,131 @@
+From 4f7213e6e742b993feeaf300181a67923e60c0f4 Mon Sep 17 00:00:00 2001
+From: David Redondo <kde@david-redondo.de>
+Date: Wed, 10 May 2023 02:26:29 +0000
+Subject: [PATCH] gpu/nvidia: Discover data fields based on headers
+
+This guards us against the appearance of new fields or if they
+ever appear in a different order.
+BUG:470474
+FIXED-IN:5.27.7
+
+(cherry picked from commit 7f9ead6bddfdf6f13a1ea48791f8f5d5c80c6980)
+Because in Qt5 QVector<T>::indexOf only takes T's we have to provide
+our own indexOf here.
+---
+ plugins/gpu/NvidiaSmiProcess.cpp | 56 ++++++++++++++++++++++----------
+ plugins/gpu/NvidiaSmiProcess.h | 14 ++++++++
+ 2 files changed, 53 insertions(+), 17 deletions(-)
+
+diff --git a/plugins/gpu/NvidiaSmiProcess.cpp b/plugins/gpu/NvidiaSmiProcess.cpp
+index 7f8dd62..d92b396 100644
+--- a/plugins/gpu/NvidiaSmiProcess.cpp
++++ b/plugins/gpu/NvidiaSmiProcess.cpp
+@@ -155,19 +155,37 @@ void NvidiaSmiProcess::unref()
+ void NvidiaSmiProcess::readStatisticsData()
+ {
+ while (m_process->canReadLine()) {
+- const QString line = m_process->readLine();
+- if (line.startsWith(QLatin1Char('#'))) {
+- continue;
+- }
++ QString line = m_process->readLine();
+ #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
+- const QVector<QStringRef> parts = QStringRef(&line).trimmed().split(QLatin1Char(' '), Qt::SkipEmptyParts);
++ QVector<QStringRef> parts = QStringRef(&line).trimmed().split(QLatin1Char(' '), Qt::SkipEmptyParts);
+ #else
+- const QVector<QStringView> parts = QStringView(line).trimmed().split(QLatin1Char(' '), Qt::SkipEmptyParts);
++ QVector<QStringView> parts = QStringView(line).trimmed().split(QLatin1Char(' '), Qt::SkipEmptyParts);
+ #endif
+-
+- // format at time of writing is
+- // # gpu pwr gtemp mtemp sm mem enc dec mclk pclk fb bar1
+- if (parts.count() != 12) {
++ // Because in Qt5 indexOf of QVector<T> only takes T's, write our own indexOf taking arbitrary types
++ auto indexOf = [](const auto &stack, const auto& needle) {
++ auto it = std::find(stack.cbegin(), stack.cend(), needle);
++ return it != stack.cend() ? std::distance(stack.cbegin(), it) : -1;
++ };
++
++ // discover index of fields in the header format is something like
++ //# gpu pwr gtemp mtemp sm mem enc dec mclk pclk fb bar1
++ // # Idx W C C % % % % MHz MHz MB MB
++ // 0 25 29 - 1 1 0 0 4006 1506 891 22
++ if (line.startsWith(QLatin1Char('#'))) {
++ if (m_dmonIndices.gpu == -1) {
++ // Remove First part because of leading '# ';
++ parts.removeFirst();
++ m_dmonIndices.gpu = indexOf(parts, QLatin1String("gpu"));
++ m_dmonIndices.power = indexOf(parts, QLatin1String("pwr"));
++ m_dmonIndices.gtemp = indexOf(parts, QLatin1String("gtemp"));
++ m_dmonIndices.sm = indexOf(parts, QLatin1String("sm"));
++ m_dmonIndices.enc = indexOf(parts, QLatin1String("enc"));
++ m_dmonIndices.dec = indexOf(parts, QLatin1String("dec"));
++ m_dmonIndices.fb = indexOf(parts, QLatin1String("fb"));
++ m_dmonIndices.bar1 = indexOf(parts, QLatin1String("bar1"));
++ m_dmonIndices.mclk = indexOf(parts, QLatin1String("mclk"));
++ m_dmonIndices.pclk = indexOf(parts, QLatin1String("pclk"));
++ }
+ continue;
+ }
+
+@@ -177,19 +195,23 @@ void NvidiaSmiProcess::readStatisticsData()
+ continue;
+ }
+
++ auto readDataIfFound = [&parts, this] (int index) {
++ return index > 0 ? parts[index].toUInt() : 0;
++ };
++
+ GpuData data;
+- data.index = index;
+- data.power = parts[1].toUInt();
+- data.temperature = parts[2].toUInt();
++ data.index = readDataIfFound(m_dmonIndices.gpu);
++ data.power = readDataIfFound(m_dmonIndices.power);
++ data.temperature = readDataIfFound(m_dmonIndices.gtemp);
+
+ // GPU usage equals "SM" usage + "ENC" usage + "DEC" usage
+- data.usage = parts[4].toUInt() + parts[6].toUInt() + parts[7].toUInt();
++ data.usage = readDataIfFound(m_dmonIndices.sm) + readDataIfFound(m_dmonIndices.enc) + readDataIfFound(m_dmonIndices.dec);
+
+ // Total memory used equals "FB" usage + "BAR1" usage
+- data.memoryUsed = parts[10].toUInt() + parts[11].toUInt();
++ data.memoryUsed = readDataIfFound(m_dmonIndices.fb) + readDataIfFound(m_dmonIndices.bar1);
+
+- data.memoryFrequency = parts[8].toUInt();
+- data.coreFrequency = parts[9].toUInt();
++ data.memoryFrequency = readDataIfFound(m_dmonIndices.mclk);
++ data.coreFrequency = readDataIfFound(m_dmonIndices.pclk);
+
+ Q_EMIT dataReceived(data);
+ }
+diff --git a/plugins/gpu/NvidiaSmiProcess.h b/plugins/gpu/NvidiaSmiProcess.h
+index f39cc9d..2cd8504 100644
+--- a/plugins/gpu/NvidiaSmiProcess.h
++++ b/plugins/gpu/NvidiaSmiProcess.h
+@@ -49,8 +49,22 @@ public:
+ private:
+ void readStatisticsData();
+
++ struct dmonIndices {
++ int gpu = -1;
++ int gtemp = -1;
++ int power = -1;
++ int sm = -1;
++ int enc = -1;
++ int dec = -1;
++ int fb = -1;
++ int bar1 = -1;
++ int mclk = -1;
++ int pclk = -1;
++ };
++
+ QString m_smiPath;
+ std::vector<GpuQueryResult> m_queryResult;
+ std::unique_ptr<QProcess> m_process = nullptr;
+ int m_references = 0;
++ dmonIndices m_dmonIndices;
+ };
+--
+GitLab
+
diff --git a/kde-plasma/ksystemstats/ksystemstats-5.27.6-r1.ebuild b/kde-plasma/ksystemstats/ksystemstats-5.27.6-r1.ebuild
new file mode 100644
index 000000000000..529d943b69ce
--- /dev/null
+++ b/kde-plasma/ksystemstats/ksystemstats-5.27.6-r1.ebuild
@@ -0,0 +1,47 @@
+# Copyright 1999-2023 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+ECM_HANDBOOK="forceoptional"
+ECM_TEST="forceoptional"
+KFMIN=5.106.0
+PVCUT=$(ver_cut 1-3)
+QTMIN=5.15.9
+inherit ecm plasma.kde.org
+
+DESCRIPTION="Plugin-based system monitoring daemon"
+
+LICENSE="GPL-2+"
+SLOT="5"
+KEYWORDS="~amd64 ~arm ~arm64 ~loong ~ppc64 ~riscv ~x86"
+IUSE="networkmanager"
+
+DEPEND="
+ dev-libs/libnl:3
+ >=dev-qt/qtdbus-${QTMIN}:5
+ >=dev-qt/qtnetwork-${QTMIN}:5
+ >=kde-frameworks/kcoreaddons-${KFMIN}:5
+ >=kde-frameworks/kdbusaddons-${KFMIN}:5
+ >=kde-frameworks/ki18n-${KFMIN}:5
+ >=kde-frameworks/kio-${KFMIN}:5
+ >=kde-frameworks/solid-${KFMIN}:5
+ >=kde-plasma/libksysguard-${PVCUT}:5
+ net-libs/libpcap
+ sys-apps/lm-sensors:=
+ sys-libs/libcap
+ virtual/libudev:=
+ networkmanager? ( >=kde-frameworks/networkmanager-qt-${KFMIN}:5 )
+"
+RDEPEND="${DEPEND}
+ !<kde-plasma/ksysguard-5.21.90:5
+"
+
+PATCHES=( "${FILESDIR}/${P}-nvidia-data-fields.patch" ) # KDE-bug 470474
+
+src_configure() {
+ local mycmakeargs=(
+ $(cmake_use_find_package networkmanager KF5NetworkManagerQt)
+ )
+ ecm_src_configure
+}