From 75bee5f04d46e2c67d12863cc974df6fe3177b9c Mon Sep 17 00:00:00 2001 From: Adam Tassier Date: Tue, 15 Apr 2025 12:52:51 +0200 Subject: [PATCH 1/5] fix: Query /sys/kernel/tracing/ for tracing support instead of /sys/kernel/debug/tracing. The default location for tracefs has been /sys/kernel/tracing since at least linux v4.1. --- src/recordhost.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/recordhost.cpp b/src/recordhost.cpp index d7274cbe..2569a417 100644 --- a/src/recordhost.cpp +++ b/src/recordhost.cpp @@ -69,7 +69,7 @@ QByteArray perfBuildOptions(const QString& perfPath) bool canTrace(const QString& path) { - const QFileInfo info(QLatin1String("/sys/kernel/debug/tracing/") + path); + const QFileInfo info(QLatin1String("/sys/kernel/tracing/") + path); if (!info.isDir() || !info.isReadable()) { return false; } @@ -116,7 +116,7 @@ bool privsAlreadyElevated() struct stat buf; return stat(path, &buf) == 0 && ((buf.st_mode & 07777) & required) == required; }; - static const auto paths = {"/sys/kernel/debug", "/sys/kernel/debug/tracing"}; + static const auto paths = {"/sys/kernel/", "/sys/kernel/tracing"}; isElevated = std::all_of(paths.begin(), paths.end(), checkPerms); return isElevated; From e49008a1e825204250dcdc0ef180028c36ebdef3 Mon Sep 17 00:00:00 2001 From: Adam Tassier Date: Tue, 15 Apr 2025 12:54:25 +0200 Subject: [PATCH 2/5] feat: reflect in tooltip that 'enable off-cpu profiling' does not require elevated privileges if both /sys/kernel/tracing is readable and /proc/sys/kernel/perf_event_paranoid == -1 --- src/recordpage.ui | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/recordpage.ui b/src/recordpage.ui index 0d92e35f..50db0c30 100644 --- a/src/recordpage.ui +++ b/src/recordpage.ui @@ -265,7 +265,8 @@ - Record scheduler switch events. This enables off-CPU profiling to measure sleep times etc. This requires elevated privileges. + Record scheduler switch events. This enables off-CPU profiling to measure sleep times etc. +This requires elevated privileges or both /sys/kernel/tracing to be readable and /proc/sys/kernel/perf_event_paranoid == -1. Off-CPU Profilin&g: @@ -278,7 +279,8 @@ - Record scheduler switch events. This enables off-CPU profiling to measure sleep times etc. This requires elevated privileges. + Record scheduler switch events. This enables off-CPU profiling to measure sleep times etc. +This requires elevated privileges or both /sys/kernel/tracing to be readable and /proc/sys/kernel/perf_event_paranoid == -1. From 262cd7d6db6db6350e675e1ce231db42b54ba76d Mon Sep 17 00:00:00 2001 From: Adam Tassier Date: Thu, 8 May 2025 15:27:54 +0200 Subject: [PATCH 3/5] Check /sys/kernel/debug/tracing if /sys/kernel/tracing is accessible --- src/recordhost.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/recordhost.cpp b/src/recordhost.cpp index 2569a417..62924db5 100644 --- a/src/recordhost.cpp +++ b/src/recordhost.cpp @@ -116,10 +116,12 @@ bool privsAlreadyElevated() struct stat buf; return stat(path, &buf) == 0 && ((buf.st_mode & 07777) & required) == required; }; - static const auto paths = {"/sys/kernel/", "/sys/kernel/tracing"}; - isElevated = std::all_of(paths.begin(), paths.end(), checkPerms); - return isElevated; + if (checkPerms("/sys/kernel/tracing")) { + return true; + } + // tracing used to be mounted on /sys/kernel/debug/ on older systems + return checkPerms("/sys/kernel/debug/tracing"); } RecordHost::PerfCapabilities fetchLocalPerfCapabilities(const QString& perfPath) From 1d452dd2e6d114849f80bed060bfad3b7ae52c9f Mon Sep 17 00:00:00 2001 From: Adam Tassier Date: Fri, 9 May 2025 09:19:49 +0200 Subject: [PATCH 4/5] Remove fallback to /sys/kernel/debug/tracing for tracefs --- src/recordhost.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/recordhost.cpp b/src/recordhost.cpp index 62924db5..2320b2ed 100644 --- a/src/recordhost.cpp +++ b/src/recordhost.cpp @@ -117,11 +117,7 @@ bool privsAlreadyElevated() return stat(path, &buf) == 0 && ((buf.st_mode & 07777) & required) == required; }; - if (checkPerms("/sys/kernel/tracing")) { - return true; - } - // tracing used to be mounted on /sys/kernel/debug/ on older systems - return checkPerms("/sys/kernel/debug/tracing"); + return checkPerms("/sys/kernel/tracing"); } RecordHost::PerfCapabilities fetchLocalPerfCapabilities(const QString& perfPath) From b7959f375ddb7d4ef4ca85bcab3a61c52cbab80a Mon Sep 17 00:00:00 2001 From: Adam Tassier Date: Fri, 9 May 2025 09:25:58 +0200 Subject: [PATCH 5/5] Remove lambda now that were only checking one location --- src/recordhost.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/recordhost.cpp b/src/recordhost.cpp index 2320b2ed..434be822 100644 --- a/src/recordhost.cpp +++ b/src/recordhost.cpp @@ -111,13 +111,9 @@ bool privsAlreadyElevated() return false; } - auto checkPerms = [](const char* path) { - const mode_t required = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; // 755 - struct stat buf; - return stat(path, &buf) == 0 && ((buf.st_mode & 07777) & required) == required; - }; - - return checkPerms("/sys/kernel/tracing"); + const mode_t required = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; // 755 + struct stat buf; + return stat("/sys/kernel/tracing", &buf) == 0 && ((buf.st_mode & 07777) & required) == required; } RecordHost::PerfCapabilities fetchLocalPerfCapabilities(const QString& perfPath)