* [PATCH v8 0/3] perf tools: port UI from GTK2 to GTK4
@ 2026-09-09 2:50 Matt Turner
2026-09-09 2:50 ` [PATCH v8 1/3] tools: port perf ui from GTK 2 to GTK 4 Matt Turner
` (3 more replies)
0 siblings, 4 replies; 11+ messages in thread
From: Matt Turner @ 2026-09-09 2:50 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Ian Rogers, Adrian Hunter, James Clark
Cc: linux-kernel, linux-perf-users, Matt Turner
GTK2 is long dead upstream and increasingly hard to keep building on
current distros. This series ports perf's GTK-based report browser to
GTK4 and fixes it up so it's actually loadable at runtime after the
port.
Patch 1 does the mechanical port (build system, widget API changes),
including the leftover-GTK2-call and signal-handling fixes that were a
separate patch 3 in v4. Patch 2 fixes a runtime issue found after the
port that prevented the browser from loading. Patch 3 fixes two stack
buffer overflows in the hierarchy view that predate the port.
Signed-off-by: Matt Turner <mattst88@gmail.com>
---
Changes in v8:
- Fix perf_gtk__add_hierarchy_entries() to restore hpp->buf/hpp->size
unconditionally after formatting each entry, not just before
recursing into children: leaf entries left the buffer state
advanced, so the next sibling in the traversal inherited a
shrunk hpp->size and an already-advanced hpp->buf, eventually
running hpp->size to 0 and pointing bf past the end of the
stack buffer for the strim(bf) call (reported in v7 review)
- Link to v7: https://lore.kernel.org/r/20260906-perf-gtk2-v7-0-1ece839fbca0@gmail.com
Changes in v7:
- Add patch 3: fix two stack buffer overflows in the hierarchy view
(perf_gtk__show_hierarchy()'s unbounded strcat() into a 512-byte
buffer, and an advance_hpp() size_t underflow in
perf_gtk__add_hierarchy_entries()). Both predate the GTK4 port
- Link to v6: https://lore.kernel.org/r/20260906-perf-gtk2-v6-0-695d1c01aaa1@gmail.com
Changes in v6:
- Explicitly include <string.h> in annotate.c (strcpy()) and
<stdarg.h>/<stdio.h> in hists.c (va_list, snprintf()) instead of
relying on transitive includes, which isn't guaranteed on musl
- Link to v5: https://lore.kernel.org/r/20260906-perf-gtk2-v5-0-e8747a65c240@gmail.com
Changes in v5:
- Fold v4's patch 3 into patch 1, since sigprocmask() only blocks
delivery to the calling thread: it did nothing to stop the signal
handler from running concurrently on another thread and doesn't make
the handler's GSList calls async-signal-safe either
- Defer perf_gtk__exit() on SIGINT/SIGQUIT/SIGTERM to a GLib source via
g_unix_signal_add() instead of running it straight out of a real
signal handler, so it always runs on the main-loop thread, serialized
with perf_gtk__error()'s updates to perf_gtk__error_loops, instead of
racing them from arbitrary signal-handler context
- Keep a real handler for SIGSEGV/SIGFPE, since those are synchronous
faults with no "later" to defer to, but pare it down to reporting and
reraising the default disposition: there's no safe way to run
GTK/GLib code from the faulting context itself
- Link to v4: https://lore.kernel.org/r/20260906-perf-gtk2-v4-0-97e92ee07214@gmail.com
Changes in v4:
- Fix gtk_widget_show()/gtk_widget_hide() calls left over from the GTK2
port: both were removed in GTK 4. Replace with gtk_widget_set_visible(),
adding a small wrapper for the info-bar "response" signal callback
- Block SIGSEGV/SIGFPE/SIGINT/SIGQUIT/SIGTERM around the
perf_gtk__error_loops list updates in perf_gtk__error(): the signal
handler (perf_gtk__signal() -> perf_gtk__exit() ->
perf_gtk__quit_error_dialog()) walks that same list and could fire
mid-update, corrupting it
- Link to v3: https://lore.kernel.org/r/20260906-perf-gtk2-v3-0-e1f2086214a0@gmail.com
Changes in v3:
- Fix GMainLoop leak if perf_gtk__error() is called re-entrantly: track
active loops in a list instead of a single global pointer
- Add explicit <stdarg.h>/<stdio.h> includes instead of relying on
transitive inclusion, which musl doesn't guarantee
- Drop the gtk4-infobar feature check and HAVE_GTK_INFO_BAR_SUPPORT:
GtkInfoBar has been unconditionally available since well before GTK 4,
and the check was failing outright due to its deprecation warning
- Link to v2: https://lore.kernel.org/r/20260906-perf-gtk2-v2-0-3eccff053cd1@gmail.com
Changes in v2:
- Fix error dialog's nested GMainLoop hanging if the parent window
closes or a signal arrives while the dialog is open (quit from
"destroy", not just "response")
- Fix build with GTK_INFO_BAR_SUPPORT: gtk_info_bar_get_content_area()
is gone in GTK 4, use gtk_info_bar_add_child() instead
- Fix use-after-free in the progress dialog on manual close
- Fix reuse of an exhausted va_list in the vasprintf() failure path
- Link to v1: https://lore.kernel.org/r/20260906-perf-gtk2-v1-0-7564bf8523a9@gmail.com
---
Matt Turner (3):
tools: port perf ui from GTK 2 to GTK 4
perf tools: make the GTK4 report browser actually loadable at runtime
perf tools gtk: fix two hierarchy-view stack buffer overflows
tools/build/Makefile.feature | 4 +-
tools/build/feature/Makefile | 10 +--
tools/build/feature/test-gtk2-infobar.c | 12 ---
tools/build/feature/{test-gtk2.c => test-gtk4.c} | 4 +-
tools/perf/Documentation/perf-report.txt | 2 +-
tools/perf/Makefile | 2 +-
tools/perf/Makefile.config | 27 +++----
tools/perf/Makefile.perf | 6 +-
tools/perf/builtin-annotate.c | 8 +-
tools/perf/builtin-report.c | 8 +-
tools/perf/scripts/install-build-deps.sh | 4 +-
tools/perf/tests/make | 4 +-
tools/perf/ui/gtk/annotate.c | 36 ++++-----
tools/perf/ui/gtk/browser.c | 96 ++++++++++++++++++-----
tools/perf/ui/gtk/gtk.h | 16 ++--
tools/perf/ui/gtk/hists.c | 72 +++++++++---------
tools/perf/ui/gtk/progress.c | 40 +++++++---
tools/perf/ui/gtk/setup.c | 5 +-
tools/perf/ui/gtk/util.c | 97 ++++++++++++++----------
tools/perf/ui/setup.c | 2 +-
tools/perf/util/annotate.c | 11 +++
tools/perf/util/annotate.h | 12 +--
22 files changed, 278 insertions(+), 200 deletions(-)
---
base-commit: 9f0346dcbea363787186c94ef94dd01aaa215afa
change-id: 20260906-perf-gtk2-555ca04bb652
Best regards,
--
Matt Turner <mattst88@gmail.com>
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v8 1/3] tools: port perf ui from GTK 2 to GTK 4
2026-09-09 2:50 [PATCH v8 0/3] perf tools: port UI from GTK2 to GTK4 Matt Turner
@ 2026-09-09 2:50 ` Matt Turner
2026-09-09 2:50 ` [PATCH v8 2/3] perf tools: make the GTK4 report browser actually loadable at runtime Matt Turner
` (2 subsequent siblings)
3 siblings, 0 replies; 11+ messages in thread
From: Matt Turner @ 2026-09-09 2:50 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Ian Rogers, Adrian Hunter, James Clark
Cc: linux-kernel, linux-perf-users, Matt Turner
Port straight to GTK 4 rather than GTK 3, since GTK 4 is where new
development happens and GTK 3 is old itself now.
GTK 4 drops GtkContainer, GdkScreen, and the gtk_main()/
gtk_dialog_run() family perf's GTK UI relied on. Containers get
per-widget setters (gtk_box_append() and friends), monitor geometry
comes from GdkMonitor instead of GdkScreen, and the main and
error-dialog loops become explicit GMainLoops quit from the
"close-request" and "response" signals. Widgets are visible by default
now, so gtk_widget_show_all()/set_no_show_all() go away, and the
remaining gtk_widget_show()/gtk_widget_hide() calls become
gtk_widget_set_visible() (with a small wrapper where "response" needs
to pass gtk_widget_hide() as a callback, since it no longer exists as
a plain function).
gtk_ui_progress__finish() skips destroying a progress dialog that was
never created, since gtk_window_destroy() asserts on NULL where the old
widget destroy tolerated it. Two spots the GTK 2 to GTK 3 port had
missed (builtin-annotate.c, ui/gtk/setup.c still using
HAVE_GTK2_SUPPORT and gtk_main_quit()) are fixed to match.
Runtime fallout from the new signal-driven loops: the error dialog's
nested loop hung if the parent window closed
(GTK_DIALOG_DESTROY_WITH_PARENT destroys without emitting "response");
gtk_info_bar_get_content_area() is gone, breaking GTK_INFO_BAR_SUPPORT;
the progress dialog's static widget pointers dangled after a manual
close; perf_gtk__error() and the warning functions reused an exhausted
va_list when vasprintf() failed.
The error loop is tracked in a list instead of a single pointer, since
perf_gtk__error() can be called re-entrantly (the dialog isn't modal)
and a lone global leaked the outer loop when that happened. The list
is only ever touched from the main thread: perf_gtk__error() updates
it while handling a dialog, and SIGINT/SIGQUIT/SIGTERM are deferred to
a GLib source via g_unix_signal_add() rather than calling
perf_gtk__exit() straight out of a real signal handler, so quitting on
those signals is serialized with the list update instead of racing it
from signal-handler context. SIGSEGV/SIGFPE keep a real handler, since
they're synchronous faults with no "later" to defer to, but it's pared
down to reporting and reraising the default disposition
(perf_gtk__fatal_signal()): there's no safe way to run GTK/GLib code
from the faulting context. stdarg.h, stdio.h, and string.h are now
included explicitly where used (util.c, hists.c, annotate.c) rather
than relying on transitive includes, which musl doesn't guarantee.
The gtk4-infobar feature check is dropped: GtkInfoBar has existed
unconditionally since GTK 3.10, so the check can only ever pass, and it
was failing outright here anyway since gtk_info_bar_new() is deprecated
and the check treats deprecation warnings as errors.
HAVE_GTK_INFO_BAR_SUPPORT and its statusbar-only fallback go away; the
info bar is now built unconditionally.
Signed-off-by: Matt Turner <mattst88@gmail.com>
---
tools/build/Makefile.feature | 4 +-
tools/build/feature/Makefile | 10 +--
tools/build/feature/test-gtk2-infobar.c | 12 ---
tools/build/feature/{test-gtk2.c => test-gtk4.c} | 4 +-
tools/perf/Documentation/perf-report.txt | 2 +-
tools/perf/Makefile | 2 +-
tools/perf/Makefile.config | 22 +++---
tools/perf/Makefile.perf | 6 +-
tools/perf/builtin-annotate.c | 8 +-
tools/perf/builtin-report.c | 8 +-
tools/perf/scripts/install-build-deps.sh | 4 +-
tools/perf/tests/make | 4 +-
tools/perf/ui/gtk/annotate.c | 36 ++++-----
tools/perf/ui/gtk/browser.c | 96 ++++++++++++++++++-----
tools/perf/ui/gtk/gtk.h | 16 ++--
tools/perf/ui/gtk/hists.c | 43 +++++------
tools/perf/ui/gtk/progress.c | 40 +++++++---
tools/perf/ui/gtk/setup.c | 5 +-
tools/perf/ui/gtk/util.c | 97 ++++++++++++++----------
tools/perf/ui/setup.c | 2 +-
20 files changed, 239 insertions(+), 182 deletions(-)
diff --git a/tools/build/Makefile.feature b/tools/build/Makefile.feature
index 99eb0ea09537..4ec95c35a5c1 100644
--- a/tools/build/Makefile.feature
+++ b/tools/build/Makefile.feature
@@ -113,8 +113,7 @@ FEATURE_TESTS_EXTRA := \
compile-x32 \
cplus-demangle \
cxa-demangle \
- gtk2 \
- gtk2-infobar \
+ gtk4 \
hello \
babeltrace2-ctf-writer \
libcapstone \
@@ -143,6 +142,7 @@ endif
FEATURE_DISPLAY ?= \
libdw \
glibc \
+ gtk4 \
libelf \
libnuma \
numa_num_possible_cpus \
diff --git a/tools/build/feature/Makefile b/tools/build/feature/Makefile
index 7d165018116a..01c48e6ef021 100644
--- a/tools/build/feature/Makefile
+++ b/tools/build/feature/Makefile
@@ -11,8 +11,7 @@ FILES= \
test-eventfd.bin \
test-fortify-source.bin \
test-glibc.bin \
- test-gtk2.bin \
- test-gtk2-infobar.bin \
+ test-gtk4.bin \
test-hello.bin \
test-libbfd.bin \
test-libbfd-threadsafe.bin \
@@ -240,11 +239,8 @@ $(OUTPUT)test-libcpupower.bin:
$(OUTPUT)test-libtracefs.bin:
$(BUILD) $(shell $(PKG_CONFIG) --cflags libtracefs 2>/dev/null) -ltracefs
-$(OUTPUT)test-gtk2.bin:
- $(BUILD) $(shell $(PKG_CONFIG) --libs --cflags gtk+-2.0 2>/dev/null) -Wno-deprecated-declarations
-
-$(OUTPUT)test-gtk2-infobar.bin:
- $(BUILD) $(shell $(PKG_CONFIG) --libs --cflags gtk+-2.0 2>/dev/null)
+$(OUTPUT)test-gtk4.bin:
+ $(BUILD) $(shell $(PKG_CONFIG) --libs --cflags gtk4 2>/dev/null)
grep-libs = $(filter -l%,$(1))
strip-libs = $(filter-out -l%,$(1))
diff --git a/tools/build/feature/test-gtk2-infobar.c b/tools/build/feature/test-gtk2-infobar.c
deleted file mode 100644
index b1b716dd5733..000000000000
--- a/tools/build/feature/test-gtk2-infobar.c
+++ /dev/null
@@ -1,12 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-#pragma GCC diagnostic ignored "-Wstrict-prototypes"
-#include <gtk/gtk.h>
-#pragma GCC diagnostic error "-Wstrict-prototypes"
-
-int main(int argc, char *argv[])
-{
- gtk_init(&argc, &argv);
- gtk_info_bar_new();
-
- return 0;
-}
diff --git a/tools/build/feature/test-gtk2.c b/tools/build/feature/test-gtk4.c
similarity index 76%
rename from tools/build/feature/test-gtk2.c
rename to tools/build/feature/test-gtk4.c
index 2aaf4bfc2055..b9520e7408b9 100644
--- a/tools/build/feature/test-gtk2.c
+++ b/tools/build/feature/test-gtk4.c
@@ -3,9 +3,9 @@
#include <gtk/gtk.h>
#pragma GCC diagnostic error "-Wstrict-prototypes"
-int main(int argc, char *argv[])
+int main(void)
{
- gtk_init(&argc, &argv);
+ gtk_init();
return 0;
}
diff --git a/tools/perf/Documentation/perf-report.txt b/tools/perf/Documentation/perf-report.txt
index 22f87eaa3279..7af9b3f81c06 100644
--- a/tools/perf/Documentation/perf-report.txt
+++ b/tools/perf/Documentation/perf-report.txt
@@ -351,7 +351,7 @@ OPTIONS
requires a tty, if one is not present, as when piping to other
commands, the stdio interface is used.
---gtk:: Use the GTK2 interface.
+--gtk:: Use the GTK4 interface.
-k::
--vmlinux=<file>::
diff --git a/tools/perf/Makefile b/tools/perf/Makefile
index 5b713837eede..56014106479a 100644
--- a/tools/perf/Makefile
+++ b/tools/perf/Makefile
@@ -106,7 +106,7 @@ clean:
# make -C tools/perf -f tests/make
#
build-test:
- @$(MAKE) SHUF=1 -f tests/make REUSE_FEATURES_DUMP=1 MK=Makefile SET_PARALLEL=1 --no-print-directory tarpkg make_static make_with_gtk2 out
+ @$(MAKE) SHUF=1 -f tests/make REUSE_FEATURES_DUMP=1 MK=Makefile SET_PARALLEL=1 --no-print-directory tarpkg make_static make_with_gtk4 out
build-test-tarball:
@$(MAKE) -f tests/make REUSE_FEATURES_DUMP=1 MK=Makefile SET_PARALLEL=1 --no-print-directory out
diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index 4d5993da9f94..3e59e2b7eaec 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -774,20 +774,16 @@ ifndef NO_SLANG
endif
endif
-ifdef GTK2
- FLAGS_GTK2=$(CFLAGS) $(LDFLAGS) $(EXTLIBS) $(shell $(PKG_CONFIG) --libs --cflags gtk+-2.0 2>/dev/null)
- $(call feature_check,gtk2)
- ifneq ($(feature-gtk2), 1)
- $(warning GTK2 not found, disables GTK2 support. Please install gtk2-devel or libgtk2.0-dev)
- NO_GTK2 := 1
+ifdef GTK4
+ FLAGS_GTK4=$(CFLAGS) $(LDFLAGS) $(EXTLIBS) $(shell $(PKG_CONFIG) --libs --cflags gtk4 2>/dev/null)
+ $(call feature_check,gtk4)
+ ifneq ($(feature-gtk4), 1)
+ $(warning GTK4 not found, disables GTK4 support. Please install gtk4-devel or libgtk-4-dev)
+ NO_GTK4 := 1
else
- $(call feature_check,gtk2-infobar)
- ifeq ($(feature-gtk2-infobar), 1)
- GTK_CFLAGS := -DHAVE_GTK_INFO_BAR_SUPPORT
- endif
- CFLAGS += -DHAVE_GTK2_SUPPORT
- GTK_CFLAGS += $(shell $(PKG_CONFIG) --cflags gtk+-2.0 2>/dev/null)
- GTK_LIBS := $(shell $(PKG_CONFIG) --libs gtk+-2.0 2>/dev/null)
+ CFLAGS += -DHAVE_GTK4_SUPPORT
+ GTK_CFLAGS += $(shell $(PKG_CONFIG) --cflags gtk4 2>/dev/null)
+ GTK_LIBS := $(shell $(PKG_CONFIG) --libs gtk4 2>/dev/null)
EXTLIBS += -ldl
endif
endif
diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
index 29cfd44c427f..2438b40eaaec 100644
--- a/tools/perf/Makefile.perf
+++ b/tools/perf/Makefile.perf
@@ -49,7 +49,7 @@ include ../scripts/utilities.mak
#
# Define NO_SLANG if you do not want TUI support.
#
-# Define GTK2 if you want GTK+ GUI support.
+# Define GTK4 if you want GTK+ GUI support.
#
# Define NO_DEMANGLE if you do not want C++ symbol demangling.
#
@@ -473,7 +473,7 @@ ifneq ($(OUTPUT),)
CFLAGS += -I$(OUTPUT)
endif
-ifdef GTK2
+ifdef GTK4
ALL_PROGRAMS += $(OUTPUT)libperf-gtk.so
GTK_IN := $(OUTPUT)gtk-in.o
endif
@@ -811,7 +811,7 @@ check: prepare
### Installation rules
-ifdef GTK2
+ifdef GTK4
install-gtk: $(OUTPUT)libperf-gtk.so
$(call QUIET_INSTALL, 'GTK UI') \
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(libdir_SQ)'; \
diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
index 69cb72b2082a..15163e081a8c 100644
--- a/tools/perf/builtin-annotate.c
+++ b/tools/perf/builtin-annotate.c
@@ -52,7 +52,7 @@ struct perf_annotate {
bool use_tui;
#endif
bool use_stdio, use_stdio2;
-#ifdef HAVE_GTK2_SUPPORT
+#ifdef HAVE_GTK4_SUPPORT
bool use_gtk;
#endif
bool skip_missing;
@@ -712,7 +712,7 @@ int cmd_annotate(int argc, const char **argv)
OPT_BOOLEAN('q', "quiet", &quiet, "do now show any warnings or messages"),
OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
"dump raw trace in ASCII"),
-#ifdef HAVE_GTK2_SUPPORT
+#ifdef HAVE_GTK4_SUPPORT
OPT_BOOLEAN(0, "gtk", &annotate.use_gtk, "Use the GTK interface"),
#endif
#ifdef HAVE_SLANG_SUPPORT
@@ -828,7 +828,7 @@ int cmd_annotate(int argc, const char **argv)
if (annotate_check_args() < 0)
return -EINVAL;
-#ifdef HAVE_GTK2_SUPPORT
+#ifdef HAVE_GTK4_SUPPORT
if (symbol_conf.show_nr_samples && annotate.use_gtk) {
pr_err("--show-nr-samples is not available in --gtk mode at this time\n");
return ret;
@@ -898,7 +898,7 @@ int cmd_annotate(int argc, const char **argv)
else if (annotate.use_tui)
use_browser = 1;
#endif
-#ifdef HAVE_GTK2_SUPPORT
+#ifdef HAVE_GTK4_SUPPORT
else if (annotate.use_gtk)
use_browser = 2;
#endif
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 60d1f166629e..d14384c58466 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -82,7 +82,7 @@ struct report {
#ifdef HAVE_SLANG_SUPPORT
bool use_tui;
#endif
-#ifdef HAVE_GTK2_SUPPORT
+#ifdef HAVE_GTK4_SUPPORT
bool use_gtk;
#endif
bool use_stdio;
@@ -1359,8 +1359,8 @@ int cmd_report(int argc, const char **argv)
#ifdef HAVE_SLANG_SUPPORT
OPT_BOOLEAN(0, "tui", &report.use_tui, "Use the TUI interface"),
#endif
-#ifdef HAVE_GTK2_SUPPORT
- OPT_BOOLEAN(0, "gtk", &report.use_gtk, "Use the GTK2 interface"),
+#ifdef HAVE_GTK4_SUPPORT
+ OPT_BOOLEAN(0, "gtk", &report.use_gtk, "Use the GTK4 interface"),
#endif
OPT_BOOLEAN(0, "stdio", &report.use_stdio,
"Use the stdio interface"),
@@ -1710,7 +1710,7 @@ int cmd_report(int argc, const char **argv)
else if (report.use_tui)
use_browser = 1;
#endif
-#ifdef HAVE_GTK2_SUPPORT
+#ifdef HAVE_GTK4_SUPPORT
else if (report.use_gtk)
use_browser = 2;
#endif
diff --git a/tools/perf/scripts/install-build-deps.sh b/tools/perf/scripts/install-build-deps.sh
index d003e7fab2be..a601a5260c17 100755
--- a/tools/perf/scripts/install-build-deps.sh
+++ b/tools/perf/scripts/install-build-deps.sh
@@ -199,8 +199,8 @@ fedora_pkg_for() {
# opt-in features, which a default build does not enable: the libbfd
# disassembler family (libbfd, libbfd-threadsafe, libbfd-liberty,
# disassembler-*, cplus-demangle), only linked on BUILD_NONDISTRO
- # builds and deprecated in favor of capstone, GTK2, LIBPERL and
- # LIBUNWIND support (ifdef GTK2 / ifdef LIBPERL / LIBUNWIND=1),
+ # builds and deprecated in favor of capstone, GTK4, LIBPERL and
+ # LIBUNWIND support (ifdef GTK4 / ifdef LIBPERL / LIBUNWIND=1),
# and CoreSight (ifdef CORESIGHT), are deliberately not mapped.
# libaio is not mapped either: its
# test uses the POSIX AIO API (aio.h, aio_*, -lrt), provided by
diff --git a/tools/perf/tests/make b/tools/perf/tests/make
index d2c2f526e1db..202ab5501916 100644
--- a/tools/perf/tests/make
+++ b/tools/perf/tests/make
@@ -95,7 +95,7 @@ make_no_babeltrace2 := NO_BABELTRACE2=1
make_with_coresight := CORESIGHT=1
make_no_sdt := NO_SDT=1
make_no_libpfm4 := NO_LIBPFM4=1
-make_with_gtk2 := GTK2=1
+make_with_gtk4 := GTK4=1
make_refcnt_check := EXTRA_CFLAGS="-DREFCNT_CHECKING=1"
make_tags := tags
make_cscope := cscope
@@ -318,7 +318,7 @@ $(run):
$(call test,$@) && \
rm -rf $@ $$TMP_DEST || (cat $@ ; false)
-make_with_gtk2:
+make_with_gtk4:
$(call clean)
@TMP_DEST=$$(mktemp -d); \
cmd="cd $(PERF) && $(MAKE_F) $($@) $(PARALLEL_OPT) $(O_OPT) DESTDIR=$$TMP_DEST"; \
diff --git a/tools/perf/ui/gtk/annotate.c b/tools/perf/ui/gtk/annotate.c
index 8920e298420a..094dfa045b77 100644
--- a/tools/perf/ui/gtk/annotate.c
+++ b/tools/perf/ui/gtk/annotate.c
@@ -11,6 +11,7 @@
#include "ui/helpline.h"
#include <inttypes.h>
#include <signal.h>
+#include <string.h>
enum {
ANN_COL__PERCENT,
@@ -161,7 +162,7 @@ static int perf_gtk__annotate_symbol(GtkWidget *window, struct map_symbol *ms,
gtk_list_store_set(store, &iter, ANN_COL__LINE, s, -1);
}
- gtk_container_add(GTK_CONTAINER(window), view);
+ gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(window), view);
list_for_each_entry_safe(pos, n, ¬es->src->source, al.node) {
list_del_init(&pos->al.node);
@@ -205,40 +206,34 @@ static int symbol__gtk_annotate(struct map_symbol *ms, struct evsel *evsel,
GtkWidget *infobar;
GtkWidget *statbar;
- signal(SIGSEGV, perf_gtk__signal);
- signal(SIGFPE, perf_gtk__signal);
- signal(SIGINT, perf_gtk__signal);
- signal(SIGQUIT, perf_gtk__signal);
- signal(SIGTERM, perf_gtk__signal);
+ signal(SIGSEGV, perf_gtk__fatal_signal);
+ signal(SIGFPE, perf_gtk__fatal_signal);
+ perf_gtk__install_quit_signals();
- window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ window = gtk_window_new();
gtk_window_set_title(GTK_WINDOW(window), "perf annotate");
- g_signal_connect(window, "delete_event", gtk_main_quit, NULL);
-
pgctx = perf_gtk__activate_context(window);
if (!pgctx)
return -1;
- vbox = gtk_vbox_new(FALSE, 0);
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
notebook = gtk_notebook_new();
pgctx->notebook = notebook;
- gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
+ gtk_widget_set_vexpand(notebook, TRUE);
+ gtk_box_append(GTK_BOX(vbox), notebook);
infobar = perf_gtk__setup_info_bar();
- if (infobar) {
- gtk_box_pack_start(GTK_BOX(vbox), infobar,
- FALSE, FALSE, 0);
- }
+ gtk_box_append(GTK_BOX(vbox), infobar);
statbar = perf_gtk__setup_statusbar();
- gtk_box_pack_start(GTK_BOX(vbox), statbar, FALSE, FALSE, 0);
+ gtk_box_append(GTK_BOX(vbox), statbar);
- gtk_container_add(GTK_CONTAINER(window), vbox);
+ gtk_window_set_child(GTK_WINDOW(window), vbox);
}
- scrolled_window = gtk_scrolled_window_new(NULL, NULL);
+ scrolled_window = gtk_scrolled_window_new();
tab_label = gtk_label_new(sym->name);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
@@ -267,12 +262,11 @@ void perf_gtk__show_annotations(void)
return;
window = pgctx->main_window;
- gtk_widget_show_all(window);
perf_gtk__resize_window(window);
- gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
+ gtk_widget_set_visible(window, TRUE);
- gtk_main();
+ perf_gtk__run_main_loop(window);
perf_gtk__deactivate_context(&pgctx);
}
diff --git a/tools/perf/ui/gtk/browser.c b/tools/perf/ui/gtk/browser.c
index d2dadf3873fb..98f1d6bfcb24 100644
--- a/tools/perf/ui/gtk/browser.c
+++ b/tools/perf/ui/gtk/browser.c
@@ -5,32 +5,92 @@
#include "../hist.h"
#include "../helpline.h"
+#include <glib-unix.h>
#include <signal.h>
-void perf_gtk__signal(int sig)
+/*
+ * SIGINT/SIGQUIT/SIGTERM are asynchronous: deferring the actual exit to a
+ * GLib source dispatched from the main loop means it always runs on the
+ * main thread, serialized with everything else the main loop does
+ * (including perf_gtk__error()'s updates to perf_gtk__error_loops), instead
+ * of racing them from arbitrary signal-handler context.
+ */
+static gboolean perf_gtk__quit_signal(gpointer data __maybe_unused)
{
perf_gtk__exit(false);
+ return G_SOURCE_REMOVE;
+}
+
+void perf_gtk__install_quit_signals(void)
+{
+ g_unix_signal_add(SIGINT, perf_gtk__quit_signal, NULL);
+ g_unix_signal_add(SIGQUIT, perf_gtk__quit_signal, NULL);
+ g_unix_signal_add(SIGTERM, perf_gtk__quit_signal, NULL);
+}
+
+/*
+ * SIGSEGV/SIGFPE are synchronous faults: there's no "later" to defer to,
+ * and no safe way to run GTK/GLib code (or anything else non-async-signal-
+ * safe) from the faulting context. Report and let the default disposition
+ * (core dump) happen instead of trying to tear down GTK state here.
+ */
+void perf_gtk__fatal_signal(int sig)
+{
psignal(sig, "perf");
+ signal(sig, SIG_DFL);
+ raise(sig);
}
void perf_gtk__resize_window(GtkWidget *window)
{
GdkRectangle rect;
- GdkScreen *screen;
- int monitor;
+ GdkMonitor *monitor;
+ GdkDisplay *display;
+ GListModel *monitors;
int height;
int width;
- screen = gtk_widget_get_screen(window);
+ display = gtk_widget_get_display(window);
+ monitors = gdk_display_get_monitors(display);
+ monitor = g_list_model_get_item(monitors, 0);
+ if (!monitor) {
+ gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);
+ return;
+ }
- monitor = gdk_screen_get_monitor_at_window(screen, window->window);
-
- gdk_screen_get_monitor_geometry(screen, monitor, &rect);
+ gdk_monitor_get_geometry(monitor, &rect);
+ g_object_unref(monitor);
width = rect.width * 3 / 4;
height = rect.height * 3 / 4;
- gtk_window_resize(GTK_WINDOW(window), width, height);
+ gtk_window_set_default_size(GTK_WINDOW(window), width, height);
+}
+
+static GMainLoop *perf_gtk__main_loop;
+
+void perf_gtk__quit_main_loop(void)
+{
+ if (perf_gtk__main_loop)
+ g_main_loop_quit(perf_gtk__main_loop);
+}
+
+static gboolean perf_gtk__close_request(GtkWidget *widget __maybe_unused,
+ gpointer data __maybe_unused)
+{
+ perf_gtk__quit_main_loop();
+
+ return FALSE;
+}
+
+void perf_gtk__run_main_loop(GtkWidget *window)
+{
+ g_signal_connect(window, "close-request",
+ G_CALLBACK(perf_gtk__close_request), NULL);
+
+ perf_gtk__main_loop = g_main_loop_new(NULL, FALSE);
+ g_main_loop_run(perf_gtk__main_loop);
+ g_clear_pointer(&perf_gtk__main_loop, g_main_loop_unref);
}
const char *perf_gtk__get_percent_color(double percent)
@@ -42,33 +102,35 @@ const char *perf_gtk__get_percent_color(double percent)
return NULL;
}
-#ifdef HAVE_GTK_INFO_BAR_SUPPORT
+static void perf_gtk__hide_widget(GtkWidget *widget, gint response_id __maybe_unused,
+ gpointer data __maybe_unused)
+{
+ gtk_widget_set_visible(widget, FALSE);
+}
+
GtkWidget *perf_gtk__setup_info_bar(void)
{
GtkWidget *info_bar;
GtkWidget *label;
- GtkWidget *content_area;
info_bar = gtk_info_bar_new();
- gtk_widget_set_no_show_all(info_bar, TRUE);
+ gtk_widget_set_visible(info_bar, FALSE);
label = gtk_label_new("");
- gtk_widget_show(label);
+ gtk_widget_set_visible(label, TRUE);
- content_area = gtk_info_bar_get_content_area(GTK_INFO_BAR(info_bar));
- gtk_container_add(GTK_CONTAINER(content_area), label);
+ gtk_info_bar_add_child(GTK_INFO_BAR(info_bar), label);
- gtk_info_bar_add_button(GTK_INFO_BAR(info_bar), GTK_STOCK_OK,
+ gtk_info_bar_add_button(GTK_INFO_BAR(info_bar), "_OK",
GTK_RESPONSE_OK);
g_signal_connect(info_bar, "response",
- G_CALLBACK(gtk_widget_hide), NULL);
+ G_CALLBACK(perf_gtk__hide_widget), NULL);
pgctx->info_bar = info_bar;
pgctx->message_label = label;
return info_bar;
}
-#endif
GtkWidget *perf_gtk__setup_statusbar(void)
{
diff --git a/tools/perf/ui/gtk/gtk.h b/tools/perf/ui/gtk/gtk.h
index a2b497f03fd6..6b37fd9943c9 100644
--- a/tools/perf/ui/gtk/gtk.h
+++ b/tools/perf/ui/gtk/gtk.h
@@ -13,10 +13,8 @@ struct perf_gtk_context {
GtkWidget *main_window;
GtkWidget *notebook;
-#ifdef HAVE_GTK_INFO_BAR_SUPPORT
GtkWidget *info_bar;
GtkWidget *message_label;
-#endif
GtkWidget *statbar;
guint statbar_ctx_id;
};
@@ -38,19 +36,15 @@ void perf_gtk__init_helpline(void);
void gtk_ui_progress__init(void);
void perf_gtk__init_hpp(void);
-void perf_gtk__signal(int sig);
+void perf_gtk__install_quit_signals(void);
+void perf_gtk__fatal_signal(int sig);
void perf_gtk__resize_window(GtkWidget *window);
+void perf_gtk__run_main_loop(GtkWidget *window);
+void perf_gtk__quit_main_loop(void);
+void perf_gtk__quit_error_dialog(void);
const char *perf_gtk__get_percent_color(double percent);
GtkWidget *perf_gtk__setup_statusbar(void);
-
-#ifdef HAVE_GTK_INFO_BAR_SUPPORT
GtkWidget *perf_gtk__setup_info_bar(void);
-#else
-static inline GtkWidget *perf_gtk__setup_info_bar(void)
-{
- return NULL;
-}
-#endif
struct evsel;
struct evlist;
diff --git a/tools/perf/ui/gtk/hists.c b/tools/perf/ui/gtk/hists.c
index bae21f336ae6..716dcf02bd0e 100644
--- a/tools/perf/ui/gtk/hists.c
+++ b/tools/perf/ui/gtk/hists.c
@@ -8,6 +8,8 @@
#include "../helpline.h"
#include "../string2.h"
#include <signal.h>
+#include <stdarg.h>
+#include <stdio.h>
#include <stdlib.h>
#include <linux/string.h>
@@ -395,11 +397,9 @@ static void perf_gtk__show_hists(GtkWidget *window, struct hists *hists,
}
}
- gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(view), TRUE);
-
g_signal_connect(view, "row-activated",
G_CALLBACK(on_row_activated), NULL);
- gtk_container_add(GTK_CONTAINER(window), view);
+ gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(window), view);
}
static void perf_gtk__add_hierarchy_entries(struct hists *hists,
@@ -583,11 +583,9 @@ static void perf_gtk__show_hierarchy(GtkWidget *window, struct hists *hists,
perf_gtk__add_hierarchy_entries(hists, &hists->entries, store,
NULL, &hpp, min_pcnt);
- gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(view), TRUE);
-
g_signal_connect(view, "row-activated",
G_CALLBACK(on_row_activated), NULL);
- gtk_container_add(GTK_CONTAINER(window), view);
+ gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(window), view);
}
int evlist__gtk_browse_hists(struct evlist *evlist, const char *help,
@@ -600,36 +598,32 @@ int evlist__gtk_browse_hists(struct evlist *evlist, const char *help,
GtkWidget *statbar;
GtkWidget *window;
- signal(SIGSEGV, perf_gtk__signal);
- signal(SIGFPE, perf_gtk__signal);
- signal(SIGINT, perf_gtk__signal);
- signal(SIGQUIT, perf_gtk__signal);
- signal(SIGTERM, perf_gtk__signal);
+ signal(SIGSEGV, perf_gtk__fatal_signal);
+ signal(SIGFPE, perf_gtk__fatal_signal);
+ perf_gtk__install_quit_signals();
- window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ window = gtk_window_new();
gtk_window_set_title(GTK_WINDOW(window), "perf report");
- g_signal_connect(window, "delete_event", gtk_main_quit, NULL);
-
pgctx = perf_gtk__activate_context(window);
if (!pgctx)
return -1;
- vbox = gtk_vbox_new(FALSE, 0);
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
notebook = gtk_notebook_new();
- gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
+ gtk_widget_set_vexpand(notebook, TRUE);
+ gtk_box_append(GTK_BOX(vbox), notebook);
info_bar = perf_gtk__setup_info_bar();
- if (info_bar)
- gtk_box_pack_start(GTK_BOX(vbox), info_bar, FALSE, FALSE, 0);
+ gtk_box_append(GTK_BOX(vbox), info_bar);
statbar = perf_gtk__setup_statusbar();
- gtk_box_pack_start(GTK_BOX(vbox), statbar, FALSE, FALSE, 0);
+ gtk_box_append(GTK_BOX(vbox), statbar);
- gtk_container_add(GTK_CONTAINER(window), vbox);
+ gtk_window_set_child(GTK_WINDOW(window), vbox);
evlist__for_each_entry(evlist, pos) {
struct hists *hists = evsel__hists(pos);
@@ -649,7 +643,7 @@ int evlist__gtk_browse_hists(struct evlist *evlist, const char *help,
}
}
- scrolled_window = gtk_scrolled_window_new(NULL, NULL);
+ scrolled_window = gtk_scrolled_window_new();
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
GTK_POLICY_AUTOMATIC,
@@ -665,15 +659,12 @@ int evlist__gtk_browse_hists(struct evlist *evlist, const char *help,
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), scrolled_window, tab_label);
}
- gtk_widget_show_all(window);
-
perf_gtk__resize_window(window);
-
- gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
+ gtk_widget_set_visible(window, TRUE);
ui_helpline__push(help);
- gtk_main();
+ perf_gtk__run_main_loop(window);
perf_gtk__deactivate_context(&pgctx);
diff --git a/tools/perf/ui/gtk/progress.c b/tools/perf/ui/gtk/progress.c
index eea6fcde518a..770f9251b54b 100644
--- a/tools/perf/ui/gtk/progress.c
+++ b/tools/perf/ui/gtk/progress.c
@@ -1,49 +1,65 @@
// SPDX-License-Identifier: GPL-2.0
#include <inttypes.h>
+#include <stdio.h>
#include "gtk.h"
#include "../progress.h"
+#include <linux/compiler.h>
static GtkWidget *dialog;
static GtkWidget *progress;
+static void gtk_ui_progress__destroyed(GtkWidget *widget __maybe_unused,
+ gpointer data __maybe_unused)
+{
+ dialog = NULL;
+ progress = NULL;
+}
+
static void gtk_ui_progress__update(struct ui_progress *p)
{
double fraction = p->total ? 1.0 * p->curr / p->total : 0.0;
char buf[1024];
if (dialog == NULL) {
- GtkWidget *vbox = gtk_vbox_new(TRUE, 5);
+ GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
GtkWidget *label = gtk_label_new(p->title);
- dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ dialog = gtk_window_new();
progress = gtk_progress_bar_new();
- gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, FALSE, 3);
- gtk_box_pack_start(GTK_BOX(vbox), progress, TRUE, TRUE, 3);
+ gtk_widget_set_vexpand(label, TRUE);
+ gtk_box_append(GTK_BOX(vbox), label);
+ gtk_widget_set_vexpand(progress, TRUE);
+ gtk_box_append(GTK_BOX(vbox), progress);
- gtk_container_add(GTK_CONTAINER(dialog), vbox);
+ gtk_window_set_child(GTK_WINDOW(dialog), vbox);
+
+ g_signal_connect(dialog, "destroy",
+ G_CALLBACK(gtk_ui_progress__destroyed), NULL);
gtk_window_set_title(GTK_WINDOW(dialog), "perf");
- gtk_window_resize(GTK_WINDOW(dialog), 300, 80);
- gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER);
+ gtk_window_set_default_size(GTK_WINDOW(dialog), 300, 80);
- gtk_widget_show_all(dialog);
+ gtk_widget_set_visible(dialog, TRUE);
}
gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress), fraction);
snprintf(buf, sizeof(buf), "%"PRIu64" / %"PRIu64, p->curr, p->total);
gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress), buf);
- /* we didn't call gtk_main yet, so do it manually */
- while (gtk_events_pending())
- gtk_main_iteration();
+ /* we didn't start a main loop yet, so pump events manually */
+ while (g_main_context_pending(NULL))
+ g_main_context_iteration(NULL, FALSE);
}
static void gtk_ui_progress__finish(void)
{
+ if (dialog == NULL)
+ return;
+
/* this will also destroy all of its children */
- gtk_widget_destroy(dialog);
+ gtk_window_destroy(GTK_WINDOW(dialog));
dialog = NULL;
}
diff --git a/tools/perf/ui/gtk/setup.c b/tools/perf/ui/gtk/setup.c
index f5eee4d66873..9b44f3719747 100644
--- a/tools/perf/ui/gtk/setup.c
+++ b/tools/perf/ui/gtk/setup.c
@@ -12,7 +12,7 @@ int perf_gtk__init(void)
gtk_ui_progress__init();
perf_gtk__init_hpp();
- return gtk_init_check(NULL, NULL) ? 0 : -1;
+ return gtk_init_check() ? 0 : -1;
}
void perf_gtk__exit(bool wait_for_ok __maybe_unused)
@@ -20,5 +20,6 @@ void perf_gtk__exit(bool wait_for_ok __maybe_unused)
if (!perf_gtk__is_active_context(pgctx))
return;
perf_error__unregister(&perf_gtk_eops);
- gtk_main_quit();
+ perf_gtk__quit_error_dialog();
+ perf_gtk__quit_main_loop();
}
diff --git a/tools/perf/ui/gtk/util.c b/tools/perf/ui/gtk/util.c
index c47f5c387838..5823ff0d7c2a 100644
--- a/tools/perf/ui/gtk/util.c
+++ b/tools/perf/ui/gtk/util.c
@@ -2,8 +2,10 @@
#include "../util.h"
#include "gtk.h"
+#include <stdarg.h>
+#include <stdio.h>
#include <stdlib.h>
-#include <string.h>
+#include <linux/compiler.h>
#include <linux/zalloc.h>
struct perf_gtk_context *pgctx;
@@ -28,86 +30,103 @@ int perf_gtk__deactivate_context(struct perf_gtk_context **ctx)
return 0;
}
+/*
+ * perf_gtk__error() can be called re-entrantly, since the dialog isn't
+ * modal and its nested loop still pumps events for the main window.
+ * Track every currently running loop instead of a single pointer, so a
+ * nested call can't clobber an outer call's loop and leak it.
+ */
+static GSList *perf_gtk__error_loops;
+
+static void perf_gtk__quit_loop(gpointer data, gpointer user_data __maybe_unused)
+{
+ g_main_loop_quit(data);
+}
+
+void perf_gtk__quit_error_dialog(void)
+{
+ g_slist_foreach(perf_gtk__error_loops, perf_gtk__quit_loop, NULL);
+}
+
+static void perf_gtk__dialog_response(GtkDialog *dialog,
+ gint response_id __maybe_unused,
+ gpointer data __maybe_unused)
+{
+ gtk_window_destroy(GTK_WINDOW(dialog));
+}
+
static int perf_gtk__error(const char *format, va_list args)
{
char *msg;
GtkWidget *dialog;
+ GMainLoop *loop;
+ va_list args_copy;
+ va_copy(args_copy, args);
if (!perf_gtk__is_active_context(pgctx) ||
- vasprintf(&msg, format, args) < 0) {
+ vasprintf(&msg, format, args_copy) < 0) {
+ va_end(args_copy);
fprintf(stderr, "Error:\n");
vfprintf(stderr, format, args);
fprintf(stderr, "\n");
return -1;
}
+ va_end(args_copy);
dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(pgctx->main_window),
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_CLOSE,
"<b>Error</b>\n\n%s", msg);
- gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
+ /*
+ * "response" only fires when a button is clicked; DESTROY_WITH_PARENT
+ * destroys the dialog directly without it. Quit from "destroy"
+ * instead, which fires either way, so the nested loop below can't
+ * outlive the dialog and hang.
+ */
+ loop = g_main_loop_new(NULL, FALSE);
+ perf_gtk__error_loops = g_slist_prepend(perf_gtk__error_loops, loop);
+ g_signal_connect(dialog, "response",
+ G_CALLBACK(perf_gtk__dialog_response), NULL);
+ g_signal_connect_swapped(dialog, "destroy",
+ G_CALLBACK(g_main_loop_quit), loop);
+
+ gtk_widget_set_visible(dialog, TRUE);
+ g_main_loop_run(loop);
+ perf_gtk__error_loops = g_slist_remove(perf_gtk__error_loops, loop);
+ g_main_loop_unref(loop);
+
free(msg);
return 0;
}
-#ifdef HAVE_GTK_INFO_BAR_SUPPORT
static int perf_gtk__warning_info_bar(const char *format, va_list args)
{
char *msg;
+ va_list args_copy;
+ va_copy(args_copy, args);
if (!perf_gtk__is_active_context(pgctx) ||
- vasprintf(&msg, format, args) < 0) {
+ vasprintf(&msg, format, args_copy) < 0) {
+ va_end(args_copy);
fprintf(stderr, "Warning:\n");
vfprintf(stderr, format, args);
fprintf(stderr, "\n");
return -1;
}
+ va_end(args_copy);
gtk_label_set_text(GTK_LABEL(pgctx->message_label), msg);
gtk_info_bar_set_message_type(GTK_INFO_BAR(pgctx->info_bar),
GTK_MESSAGE_WARNING);
- gtk_widget_show(pgctx->info_bar);
+ gtk_widget_set_visible(pgctx->info_bar, TRUE);
free(msg);
return 0;
}
-#else
-static int perf_gtk__warning_statusbar(const char *format, va_list args)
-{
- char *msg, *p;
-
- if (!perf_gtk__is_active_context(pgctx) ||
- vasprintf(&msg, format, args) < 0) {
- fprintf(stderr, "Warning:\n");
- vfprintf(stderr, format, args);
- fprintf(stderr, "\n");
- return -1;
- }
-
- gtk_statusbar_pop(GTK_STATUSBAR(pgctx->statbar),
- pgctx->statbar_ctx_id);
-
- /* Only first line can be displayed */
- p = strchr(msg, '\n');
- if (p)
- *p = '\0';
-
- gtk_statusbar_push(GTK_STATUSBAR(pgctx->statbar),
- pgctx->statbar_ctx_id, msg);
-
- free(msg);
- return 0;
-}
-#endif
struct perf_error_ops perf_gtk_eops = {
.error = perf_gtk__error,
-#ifdef HAVE_GTK_INFO_BAR_SUPPORT
.warning = perf_gtk__warning_info_bar,
-#else
- .warning = perf_gtk__warning_statusbar,
-#endif
};
diff --git a/tools/perf/ui/setup.c b/tools/perf/ui/setup.c
index ff800047e697..d887346c7a63 100644
--- a/tools/perf/ui/setup.c
+++ b/tools/perf/ui/setup.c
@@ -14,7 +14,7 @@ int use_browser = -1;
#define PERF_GTK_DSO "libperf-gtk.so"
-#ifdef HAVE_GTK2_SUPPORT
+#ifdef HAVE_GTK4_SUPPORT
static int setup_gtk_browser(void)
{
--
2.54.0
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v8 2/3] perf tools: make the GTK4 report browser actually loadable at runtime
2026-09-09 2:50 [PATCH v8 0/3] perf tools: port UI from GTK2 to GTK4 Matt Turner
2026-09-09 2:50 ` [PATCH v8 1/3] tools: port perf ui from GTK 2 to GTK 4 Matt Turner
@ 2026-09-09 2:50 ` Matt Turner
2026-09-09 2:50 ` [PATCH v8 3/3] perf tools gtk: fix two hierarchy-view stack buffer overflows Matt Turner
2026-09-09 11:13 ` [PATCH v8 0/3] perf tools: port UI from GTK2 to GTK4 Arnaldo Carvalho de Melo
3 siblings, 0 replies; 11+ messages in thread
From: Matt Turner @ 2026-09-09 2:50 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Ian Rogers, Adrian Hunter, James Clark
Cc: linux-kernel, linux-perf-users, Matt Turner
perf report --gtk dlopen()s libperf-gtk.so, which expects to resolve
symbols back against the running perf binary (callchain_param,
symbol_conf, evsel__name, and friends live in perf, not the plugin).
Two things broke that after the GTK 4 port:
perf never passed -rdynamic, so none of its symbols were in its
dynamic symbol table for a dlopen()ed plugin to find. Add -rdynamic to
LDFLAGS when GTK4 support is enabled.
annotated_source__hist_entry() was a static inline in annotate.h, so
ui/gtk/annotate.c calling it pulled hashmap__find()'s expansion,
hashmap_find(), into libperf-gtk.so as an undefined symbol. The only
hashmap_find perf links against normally is libbpf's internal one
(tools/lib/bpf/hashmap.c), built with -fvisibility=hidden, so it can
never be exported to a dlopen()ed plugin regardless of LDFLAGS. Move
annotated_source__hist_entry() into annotate.c as an ordinary exported
function, so the plugin depends on it the same way it already depends
on evsel__group_desc() and friends.
With both fixes, a default 'make GTK4=1' build (libbpf statically
linked) can dlopen() libperf-gtk.so and open the report browser without
NO_LIBBPF=1 or manual LDFLAGS. Verified with perf report --gtk against
real perf.data on a GTK4 desktop.
Signed-off-by: Matt Turner <mattst88@gmail.com>
---
tools/perf/Makefile.config | 5 +++++
tools/perf/util/annotate.c | 11 +++++++++++
tools/perf/util/annotate.h | 12 ++----------
3 files changed, 18 insertions(+), 10 deletions(-)
diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index 3e59e2b7eaec..4ee7393a39f9 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -785,6 +785,11 @@ ifdef GTK4
GTK_CFLAGS += $(shell $(PKG_CONFIG) --cflags gtk4 2>/dev/null)
GTK_LIBS := $(shell $(PKG_CONFIG) --libs gtk4 2>/dev/null)
EXTLIBS += -ldl
+ # libperf-gtk.so is dlopen()ed at runtime and calls back into
+ # symbols defined in the perf binary itself (callchain_param,
+ # symbol_conf, evsel__name, ...): perf needs to export those
+ # dynamically for the plugin to resolve them.
+ LDFLAGS += -rdynamic
endif
endif
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
index df70e95a8470..123b6d5fcea7 100644
--- a/tools/perf/util/annotate.c
+++ b/tools/perf/util/annotate.c
@@ -145,6 +145,17 @@ static int annotated_source__alloc_histograms(struct annotated_source *src,
return src->histograms ? 0 : -1;
}
+struct sym_hist_entry *
+annotated_source__hist_entry(struct annotated_source *src, const struct evsel *evsel, u64 offset)
+{
+ struct sym_hist_entry *entry;
+ long key = offset << 16 | evsel->core.idx;
+
+ if (!hashmap__find(src->samples, key, &entry))
+ return NULL;
+ return entry;
+}
+
void symbol__annotate_zero_histograms(struct symbol *sym)
{
struct annotation *notes = symbol__annotation(sym);
diff --git a/tools/perf/util/annotate.h b/tools/perf/util/annotate.h
index fa08d09b80f7..40038a3779d4 100644
--- a/tools/perf/util/annotate.h
+++ b/tools/perf/util/annotate.h
@@ -406,16 +406,8 @@ static inline struct sym_hist *annotation__histogram(struct annotation *notes,
return annotated_source__histogram(notes->src, evsel);
}
-static inline struct sym_hist_entry *
-annotated_source__hist_entry(struct annotated_source *src, const struct evsel *evsel, u64 offset)
-{
- struct sym_hist_entry *entry;
- long key = offset << 16 | evsel->core.idx;
-
- if (!hashmap__find(src->samples, key, &entry))
- return NULL;
- return entry;
-}
+struct sym_hist_entry *
+annotated_source__hist_entry(struct annotated_source *src, const struct evsel *evsel, u64 offset);
static inline struct annotation *symbol__annotation(struct symbol *sym)
{
--
2.54.0
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v8 3/3] perf tools gtk: fix two hierarchy-view stack buffer overflows
2026-09-09 2:50 [PATCH v8 0/3] perf tools: port UI from GTK2 to GTK4 Matt Turner
2026-09-09 2:50 ` [PATCH v8 1/3] tools: port perf ui from GTK 2 to GTK 4 Matt Turner
2026-09-09 2:50 ` [PATCH v8 2/3] perf tools: make the GTK4 report browser actually loadable at runtime Matt Turner
@ 2026-09-09 2:50 ` Matt Turner
2026-09-09 11:13 ` [PATCH v8 0/3] perf tools: port UI from GTK2 to GTK4 Arnaldo Carvalho de Melo
3 siblings, 0 replies; 11+ messages in thread
From: Matt Turner @ 2026-09-09 2:50 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Ian Rogers, Adrian Hunter, James Clark
Cc: linux-kernel, linux-perf-users, Matt Turner
perf_gtk__show_hierarchy() builds a merged column header for the
hierarchy view with unbounded strcat() calls into a 512-byte stack
buffer. The pieces being appended come from tracepoint field names and
sort-key headers in perf.data, so a file with enough dynamic sort keys
or long enough field names overflows the buffer.
perf_gtk__add_hierarchy_entries() has a related bug in the loop that
formats each entry's value columns. fmt->entry()/fmt->color() return
via scnprintf(), so ret is clamped to at most hpp->size - 1, but
advance_hpp(hpp, ret + 2) doesn't clamp: when ret hits that maximum,
ret + 2 exceeds hpp->size by one, and hpp->size (size_t) underflows to
roughly SIZE_MAX. The next iteration's fmt->entry() then writes into
the caller's stack buffer using that bogus size, a second overflow.
That same loop also saves bf/size at the top of each iteration but
only restored hpp->buf/hpp->size to them before recursing into
non-leaf children. Leaf entries left the buffer state advanced from
the format loop, so the next sibling in the traversal inherited a
shrunk hpp->size and an already-advanced hpp->buf, eventually running
hpp->size down to 0 and pointing bf past the end of the stack buffer
for the strim(bf) call.
Fix the header builder by tracking the write offset and using
scnprintf() for each append, same pattern already used elsewhere in
this file. Fix the entry loop by clamping the amount passed to
advance_hpp() to what's actually left in the buffer, and by restoring
hpp->buf/hpp->size unconditionally after formatting each entry instead
of only before recursing.
Both bugs predate the perf GTK UI's move to GTK 4; neither function is
touched by that port.
Signed-off-by: Matt Turner <mattst88@gmail.com>
---
tools/perf/ui/gtk/hists.c | 29 +++++++++++++++++++++--------
1 file changed, 21 insertions(+), 8 deletions(-)
diff --git a/tools/perf/ui/gtk/hists.c b/tools/perf/ui/gtk/hists.c
index 716dcf02bd0e..80df3fec8ea1 100644
--- a/tools/perf/ui/gtk/hists.c
+++ b/tools/perf/ui/gtk/hists.c
@@ -449,7 +449,7 @@ static void perf_gtk__add_hierarchy_entries(struct hists *hists,
bf = hpp->buf;
size = hpp->size;
perf_hpp_list__for_each_format(he->hpp_list, fmt) {
- int ret;
+ int ret, inc;
if (fmt->color)
ret = fmt->color(fmt, hpp, he);
@@ -457,15 +457,26 @@ static void perf_gtk__add_hierarchy_entries(struct hists *hists,
ret = fmt->entry(fmt, hpp, he);
snprintf(hpp->buf + ret, hpp->size - ret, " ");
- advance_hpp(hpp, ret + 2);
+ /*
+ * ret can be as large as hpp->size - 1, so ret + 2
+ * can exceed hpp->size. advance_hpp() doesn't clamp,
+ * so passing that through would underflow the
+ * size_t hpp->size and let a later fmt->entry() in
+ * this loop write past the end of the caller's
+ * stack buffer.
+ */
+ inc = ret + 2;
+ if (inc > (int)hpp->size)
+ inc = hpp->size;
+ advance_hpp(hpp, inc);
}
gtk_tree_store_set(store, &iter, col_idx, strim(bf), -1);
- if (!he->leaf) {
- hpp->buf = bf;
- hpp->size = size;
+ hpp->buf = bf;
+ hpp->size = size;
+ if (!he->leaf) {
perf_gtk__add_hierarchy_entries(hists, &he->hroot_out,
store, &iter, hpp,
min_pcnt);
@@ -505,6 +516,7 @@ static void perf_gtk__show_hierarchy(GtkWidget *window, struct hists *hists,
GtkWidget *view;
int col_idx;
int nr_cols = 0;
+ int ret;
char s[512];
char buf[512];
bool first_node, first_col;
@@ -541,9 +553,10 @@ static void perf_gtk__show_hierarchy(GtkWidget *window, struct hists *hists,
/* construct merged column header since sort keys share single column */
buf[0] = '\0';
first_node = true;
+ ret = 0;
list_for_each_entry_continue(fmt_node, &hists->hpp_formats, list) {
if (!first_node)
- strcat(buf, " / ");
+ ret += scnprintf(buf + ret, sizeof(buf) - ret, " / ");
first_node = false;
first_col = true;
@@ -552,11 +565,11 @@ static void perf_gtk__show_hierarchy(GtkWidget *window, struct hists *hists,
continue;
if (!first_col)
- strcat(buf, "+");
+ ret += scnprintf(buf + ret, sizeof(buf) - ret, "+");
first_col = false;
fmt->header(fmt, &hpp, hists, 0, NULL);
- strcat(buf, strim(hpp.buf));
+ ret += scnprintf(buf + ret, sizeof(buf) - ret, "%s", strim(hpp.buf));
}
}
--
2.54.0
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v8 0/3] perf tools: port UI from GTK2 to GTK4
2026-09-09 2:50 [PATCH v8 0/3] perf tools: port UI from GTK2 to GTK4 Matt Turner
` (2 preceding siblings ...)
2026-09-09 2:50 ` [PATCH v8 3/3] perf tools gtk: fix two hierarchy-view stack buffer overflows Matt Turner
@ 2026-09-09 11:13 ` Arnaldo Carvalho de Melo
2026-09-09 11:25 ` Arnaldo Carvalho de Melo
3 siblings, 1 reply; 11+ messages in thread
From: Arnaldo Carvalho de Melo @ 2026-09-09 11:13 UTC (permalink / raw)
To: Matt Turner
Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Mark Rutland,
Alexander Shishkin, Jiri Olsa, Ian Rogers, Adrian Hunter,
James Clark, linux-kernel, linux-perf-users
On Tue, Sep 08, 2026 at 10:50:33PM -0400, Matt Turner wrote:
> GTK2 is long dead upstream and increasingly hard to keep building on
> current distros. This series ports perf's GTK-based report browser to
> GTK4 and fixes it up so it's actually loadable at runtime after the
> port.
>
> Patch 1 does the mechanical port (build system, widget API changes),
> including the leftover-GTK2-call and signal-handling fixes that were a
> separate patch 3 in v4. Patch 2 fixes a runtime issue found after the
> port that prevented the browser from loading. Patch 3 fixes two stack
> buffer overflows in the hierarchy view that predate the port.
I'm tentatively merging this, will test build on my distro container set
and perform some testing, thanks for working on this!
- Arnaldo
> Signed-off-by: Matt Turner <mattst88@gmail.com>
> ---
> Changes in v8:
> - Fix perf_gtk__add_hierarchy_entries() to restore hpp->buf/hpp->size
> unconditionally after formatting each entry, not just before
> recursing into children: leaf entries left the buffer state
> advanced, so the next sibling in the traversal inherited a
> shrunk hpp->size and an already-advanced hpp->buf, eventually
> running hpp->size to 0 and pointing bf past the end of the
> stack buffer for the strim(bf) call (reported in v7 review)
> - Link to v7: https://lore.kernel.org/r/20260906-perf-gtk2-v7-0-1ece839fbca0@gmail.com
>
> Changes in v7:
> - Add patch 3: fix two stack buffer overflows in the hierarchy view
> (perf_gtk__show_hierarchy()'s unbounded strcat() into a 512-byte
> buffer, and an advance_hpp() size_t underflow in
> perf_gtk__add_hierarchy_entries()). Both predate the GTK4 port
> - Link to v6: https://lore.kernel.org/r/20260906-perf-gtk2-v6-0-695d1c01aaa1@gmail.com
>
> Changes in v6:
> - Explicitly include <string.h> in annotate.c (strcpy()) and
> <stdarg.h>/<stdio.h> in hists.c (va_list, snprintf()) instead of
> relying on transitive includes, which isn't guaranteed on musl
> - Link to v5: https://lore.kernel.org/r/20260906-perf-gtk2-v5-0-e8747a65c240@gmail.com
>
> Changes in v5:
> - Fold v4's patch 3 into patch 1, since sigprocmask() only blocks
> delivery to the calling thread: it did nothing to stop the signal
> handler from running concurrently on another thread and doesn't make
> the handler's GSList calls async-signal-safe either
> - Defer perf_gtk__exit() on SIGINT/SIGQUIT/SIGTERM to a GLib source via
> g_unix_signal_add() instead of running it straight out of a real
> signal handler, so it always runs on the main-loop thread, serialized
> with perf_gtk__error()'s updates to perf_gtk__error_loops, instead of
> racing them from arbitrary signal-handler context
> - Keep a real handler for SIGSEGV/SIGFPE, since those are synchronous
> faults with no "later" to defer to, but pare it down to reporting and
> reraising the default disposition: there's no safe way to run
> GTK/GLib code from the faulting context itself
> - Link to v4: https://lore.kernel.org/r/20260906-perf-gtk2-v4-0-97e92ee07214@gmail.com
>
> Changes in v4:
> - Fix gtk_widget_show()/gtk_widget_hide() calls left over from the GTK2
> port: both were removed in GTK 4. Replace with gtk_widget_set_visible(),
> adding a small wrapper for the info-bar "response" signal callback
> - Block SIGSEGV/SIGFPE/SIGINT/SIGQUIT/SIGTERM around the
> perf_gtk__error_loops list updates in perf_gtk__error(): the signal
> handler (perf_gtk__signal() -> perf_gtk__exit() ->
> perf_gtk__quit_error_dialog()) walks that same list and could fire
> mid-update, corrupting it
> - Link to v3: https://lore.kernel.org/r/20260906-perf-gtk2-v3-0-e1f2086214a0@gmail.com
>
> Changes in v3:
> - Fix GMainLoop leak if perf_gtk__error() is called re-entrantly: track
> active loops in a list instead of a single global pointer
> - Add explicit <stdarg.h>/<stdio.h> includes instead of relying on
> transitive inclusion, which musl doesn't guarantee
> - Drop the gtk4-infobar feature check and HAVE_GTK_INFO_BAR_SUPPORT:
> GtkInfoBar has been unconditionally available since well before GTK 4,
> and the check was failing outright due to its deprecation warning
> - Link to v2: https://lore.kernel.org/r/20260906-perf-gtk2-v2-0-3eccff053cd1@gmail.com
>
> Changes in v2:
> - Fix error dialog's nested GMainLoop hanging if the parent window
> closes or a signal arrives while the dialog is open (quit from
> "destroy", not just "response")
> - Fix build with GTK_INFO_BAR_SUPPORT: gtk_info_bar_get_content_area()
> is gone in GTK 4, use gtk_info_bar_add_child() instead
> - Fix use-after-free in the progress dialog on manual close
> - Fix reuse of an exhausted va_list in the vasprintf() failure path
> - Link to v1: https://lore.kernel.org/r/20260906-perf-gtk2-v1-0-7564bf8523a9@gmail.com
>
> ---
> Matt Turner (3):
> tools: port perf ui from GTK 2 to GTK 4
> perf tools: make the GTK4 report browser actually loadable at runtime
> perf tools gtk: fix two hierarchy-view stack buffer overflows
>
> tools/build/Makefile.feature | 4 +-
> tools/build/feature/Makefile | 10 +--
> tools/build/feature/test-gtk2-infobar.c | 12 ---
> tools/build/feature/{test-gtk2.c => test-gtk4.c} | 4 +-
> tools/perf/Documentation/perf-report.txt | 2 +-
> tools/perf/Makefile | 2 +-
> tools/perf/Makefile.config | 27 +++----
> tools/perf/Makefile.perf | 6 +-
> tools/perf/builtin-annotate.c | 8 +-
> tools/perf/builtin-report.c | 8 +-
> tools/perf/scripts/install-build-deps.sh | 4 +-
> tools/perf/tests/make | 4 +-
> tools/perf/ui/gtk/annotate.c | 36 ++++-----
> tools/perf/ui/gtk/browser.c | 96 ++++++++++++++++++-----
> tools/perf/ui/gtk/gtk.h | 16 ++--
> tools/perf/ui/gtk/hists.c | 72 +++++++++---------
> tools/perf/ui/gtk/progress.c | 40 +++++++---
> tools/perf/ui/gtk/setup.c | 5 +-
> tools/perf/ui/gtk/util.c | 97 ++++++++++++++----------
> tools/perf/ui/setup.c | 2 +-
> tools/perf/util/annotate.c | 11 +++
> tools/perf/util/annotate.h | 12 +--
> 22 files changed, 278 insertions(+), 200 deletions(-)
> ---
> base-commit: 9f0346dcbea363787186c94ef94dd01aaa215afa
> change-id: 20260906-perf-gtk2-555ca04bb652
>
> Best regards,
> --
> Matt Turner <mattst88@gmail.com>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v8 0/3] perf tools: port UI from GTK2 to GTK4
2026-09-09 11:13 ` [PATCH v8 0/3] perf tools: port UI from GTK2 to GTK4 Arnaldo Carvalho de Melo
@ 2026-09-09 11:25 ` Arnaldo Carvalho de Melo
2026-09-09 11:29 ` Arnaldo Carvalho de Melo
0 siblings, 1 reply; 11+ messages in thread
From: Arnaldo Carvalho de Melo @ 2026-09-09 11:25 UTC (permalink / raw)
To: Matt Turner
Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Mark Rutland,
Alexander Shishkin, Jiri Olsa, Ian Rogers, Adrian Hunter,
James Clark, linux-kernel, linux-perf-users
On Wed, Sep 09, 2026 at 08:13:07AM -0300, Arnaldo Carvalho de Melo wrote:
> On Tue, Sep 08, 2026 at 10:50:33PM -0400, Matt Turner wrote:
> > GTK2 is long dead upstream and increasingly hard to keep building on
> > current distros. This series ports perf's GTK-based report browser to
> > GTK4 and fixes it up so it's actually loadable at runtime after the
> > port.
> >
> > Patch 1 does the mechanical port (build system, widget API changes),
> > including the leftover-GTK2-call and signal-handling fixes that were a
> > separate patch 3 in v4. Patch 2 fixes a runtime issue found after the
> > port that prevented the browser from loading. Patch 3 fixes two stack
> > buffer overflows in the hierarchy view that predate the port.
>
> I'm tentatively merging this, will test build on my distro container set
> and perform some testing, thanks for working on this!
Some fuzz applying the first patch in the series:
⬢ [acme@toolbx perf-tools-next]$ patch -p1 < ./v8_20260908_mattst88_perf_tools_port_ui_from_gtk2_to_gtk4.mbx
patching file tools/build/Makefile.feature
patching file tools/build/feature/Makefile
patching file tools/build/feature/test-gtk2-infobar.c
patching file tools/build/feature/test-gtk4.c (renamed from tools/build/feature/test-gtk2.c)
patching file tools/perf/Documentation/perf-report.txt
Hunk #1 succeeded at 354 with fuzz 2 (offset 3 lines).
patching file tools/perf/Makefile
patching file tools/perf/Makefile.config
patching file tools/perf/Makefile.perf
patching file tools/perf/builtin-annotate.c
Hunk #1 succeeded at 61 (offset 9 lines).
Hunk #2 succeeded at 721 (offset 9 lines).
Hunk #3 succeeded at 840 (offset 12 lines).
Hunk #4 succeeded at 910 (offset 12 lines).
patching file tools/perf/builtin-report.c
Hunk #1 succeeded at 83 (offset 1 line).
Hunk #2 succeeded at 1360 (offset 1 line).
Hunk #3 succeeded at 1714 (offset 4 lines).
patching file tools/perf/scripts/install-build-deps.sh
patching file tools/perf/tests/make
patching file tools/perf/ui/gtk/annotate.c
patching file tools/perf/ui/gtk/browser.c
patching file tools/perf/ui/gtk/gtk.h
patching file tools/perf/ui/gtk/hists.c
patching file tools/perf/ui/gtk/progress.c
patching file tools/perf/ui/gtk/setup.c
patching file tools/perf/ui/gtk/util.c
patching file tools/perf/ui/setup.c
⬢ [acme@toolbx perf-tools-next]$
I fixed it up quickly, now lets see the rest...
- Arnaldo
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v8 0/3] perf tools: port UI from GTK2 to GTK4
2026-09-09 11:25 ` Arnaldo Carvalho de Melo
@ 2026-09-09 11:29 ` Arnaldo Carvalho de Melo
2026-09-09 11:35 ` Arnaldo Carvalho de Melo
0 siblings, 1 reply; 11+ messages in thread
From: Arnaldo Carvalho de Melo @ 2026-09-09 11:29 UTC (permalink / raw)
To: Matt Turner
Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Mark Rutland,
Alexander Shishkin, Jiri Olsa, Ian Rogers, Adrian Hunter,
James Clark, linux-kernel, linux-perf-users
On Wed, Sep 09, 2026 at 08:25:41AM -0300, Arnaldo Carvalho de Melo wrote:
> On Wed, Sep 09, 2026 at 08:13:07AM -0300, Arnaldo Carvalho de Melo wrote:
> > On Tue, Sep 08, 2026 at 10:50:33PM -0400, Matt Turner wrote:
> > > GTK2 is long dead upstream and increasingly hard to keep building on
> > > current distros. This series ports perf's GTK-based report browser to
> > > GTK4 and fixes it up so it's actually loadable at runtime after the
> > > port.
> > >
> > > Patch 1 does the mechanical port (build system, widget API changes),
> > > including the leftover-GTK2-call and signal-handling fixes that were a
> > > separate patch 3 in v4. Patch 2 fixes a runtime issue found after the
> > > port that prevented the browser from loading. Patch 3 fixes two stack
> > > buffer overflows in the hierarchy view that predate the port.
> >
> > I'm tentatively merging this, will test build on my distro container set
> > and perform some testing, thanks for working on this!
>
> Some fuzz applying the first patch in the series:
>
> ⬢ [acme@toolbx perf-tools-next]$ patch -p1 < ./v8_20260908_mattst88_perf_tools_port_ui_from_gtk2_to_gtk4.mbx
> patching file tools/build/Makefile.feature
> patching file tools/build/feature/Makefile
> patching file tools/build/feature/test-gtk2-infobar.c
> patching file tools/build/feature/test-gtk4.c (renamed from tools/build/feature/test-gtk2.c)
> patching file tools/perf/Documentation/perf-report.txt
> Hunk #1 succeeded at 354 with fuzz 2 (offset 3 lines).
> patching file tools/perf/Makefile
> patching file tools/perf/Makefile.config
> patching file tools/perf/Makefile.perf
> patching file tools/perf/builtin-annotate.c
> Hunk #1 succeeded at 61 (offset 9 lines).
> Hunk #2 succeeded at 721 (offset 9 lines).
> Hunk #3 succeeded at 840 (offset 12 lines).
> Hunk #4 succeeded at 910 (offset 12 lines).
> patching file tools/perf/builtin-report.c
> Hunk #1 succeeded at 83 (offset 1 line).
> Hunk #2 succeeded at 1360 (offset 1 line).
> Hunk #3 succeeded at 1714 (offset 4 lines).
> patching file tools/perf/scripts/install-build-deps.sh
> patching file tools/perf/tests/make
> patching file tools/perf/ui/gtk/annotate.c
> patching file tools/perf/ui/gtk/browser.c
> patching file tools/perf/ui/gtk/gtk.h
> patching file tools/perf/ui/gtk/hists.c
> patching file tools/perf/ui/gtk/progress.c
> patching file tools/perf/ui/gtk/setup.c
> patching file tools/perf/ui/gtk/util.c
> patching file tools/perf/ui/setup.c
> ⬢ [acme@toolbx perf-tools-next]$
>
> I fixed it up quickly, now lets see the rest...
Trying to build with it with just the first patch in this series in it
correctly discovers that the gtk4 devel files are not available but then
proceed to try to include gtk code and thus fail, where it should just
do what the feature detection states: disable gtk support but build
successfully without it, I'm checking if this is a quick surgery.
- Arnaldo
⬢ [acme@toolbx perf-tools-next]$ alias m='rm -rf ~/libexec/perf-core/ ; make -k GTK4=1 O=/tmp/build/$(basename $PWD)/ -C tools/perf install-bin && perf test import && cat /tmp/build/$(basename $PWD)/feature/test-all.make.output' ; export PYTHONPATH=/tmp/build/$(basename $PWD)/python
⬢ [acme@toolbx perf-tools-next]$ m
make: Entering directory '/home/acme/git/perf-tools-next/tools/perf'
BUILD: Doing 'make -j32' parallel build
Makefile.config:781: GTK4 not found, disables GTK4 support. Please install gtk4-devel or libgtk-4-dev
Auto-detecting system features:
... libdw: [ on ]
... glibc: [ on ]
... gtk4: [ OFF ]
... libelf: [ on ]
... libnuma: [ on ]
... numa_num_possible_cpus: [ on ]
... libpython: [ on ]
... libcapstone: [ on ]
... llvm-perf: [ on ]
... zlib: [ on ]
... lzma: [ on ]
... bpf: [ on ]
... libaio: [ on ]
... libzstd: [ on ]
... libopenssl: [ on ]
... rust: [ on ]
INSTALL libsubcmd_headers
INSTALL libsymbol_headers
INSTALL libapi_headers
INSTALL libperf_headers
CC /tmp/build/perf-tools-next/libperf/core.o
CC /tmp/build/perf-tools-next/libperf/cpumap.o
CC /tmp/build/perf-tools-next/libperf/threadmap.o
CC /tmp/build/perf-tools-next/libperf/evsel.o
CC /tmp/build/perf-tools-next/libsubcmd/exec-cmd.o
CC /tmp/build/perf-tools-next/libperf/evlist.o
CC /tmp/build/perf-tools-next/libperf/mmap.o
INSTALL libbpf_headers
CC /tmp/build/perf-tools-next/libsubcmd/help.o
CC /tmp/build/perf-tools-next/libperf/zalloc.o
CC /tmp/build/perf-tools-next/libsubcmd/pager.o
CC /tmp/build/perf-tools-next/libperf/xyarray.o
CC /tmp/build/perf-tools-next/libsubcmd/parse-options.o
CC /tmp/build/perf-tools-next/libperf/lib.o
CC /tmp/build/perf-tools-next/libsubcmd/run-command.o
CC /tmp/build/perf-tools-next/libsubcmd/sigchain.o
CC /tmp/build/perf-tools-next/libsubcmd/subcmd-config.o
LD /tmp/build/perf-tools-next/libsubcmd/libsubcmd-in.o
AR /tmp/build/perf-tools-next/libsubcmd/libsubcmd.a
LD /tmp/build/perf-tools-next/libperf/libperf-in.o
AR /tmp/build/perf-tools-next/libperf/libperf.a
MKDIR /tmp/build/perf-tools-next/ui/gtk/
CC /tmp/build/perf-tools-next/jvmti/libjvmti.o
MKDIR /tmp/build/perf-tools-next/ui/gtk/
CC /tmp/build/perf-tools-next/trace/beauty/syscalltbl.o
MKDIR /tmp/build/perf-tools-next/ui/gtk/
CC /tmp/build/perf-tools-next/arch/common.o
CC /tmp/build/perf-tools-next/jvmti/jvmti_agent.o
MKDIR /tmp/build/perf-tools-next/ui/gtk/
MKDIR /tmp/build/perf-tools-next/ui/gtk/
CC /tmp/build/perf-tools-next/trace/beauty/arch_errno_names.o
CC /tmp/build/perf-tools-next/ui/setup.o
CC /tmp/build/perf-tools-next/jvmti/libstring.o
MKDIR /tmp/build/perf-tools-next/ui/gtk/
CC /tmp/build/perf-tools-next/ui/helpline.o
CC /tmp/build/perf-tools-next/jvmti/libctype.o
CC /tmp/build/perf-tools-next/arch/x86/tests/regs_load.o
CC /tmp/build/perf-tools-next/ui/gtk/browser.o
CC /tmp/build/perf-tools-next/ui/gtk/hists.o
CC /tmp/build/perf-tools-next/ui/gtk/setup.o
CC /tmp/build/perf-tools-next/ui/gtk/annotate.o
CC /tmp/build/perf-tools-next/ui/progress.o
CC /tmp/build/perf-tools-next/scripts/python/Perf-Trace-Util/Context.o
CC /tmp/build/perf-tools-next/ui/gtk/util.o
CC /tmp/build/perf-tools-next/ui/util.o
CC /tmp/build/perf-tools-next/ui/gtk/helpline.o
CC /tmp/build/perf-tools-next/ui/gtk/zalloc.o
CC /tmp/build/perf-tools-next/arch/x86/tests/dwarf-unwind.o
CC /tmp/build/perf-tools-next/ui/gtk/progress.o
CC /tmp/build/perf-tools-next/arch/x86/tests/arch-tests.o
CC /tmp/build/perf-tools-next/ui/hist.o
CC /tmp/build/perf-tools-next/arch/x86/tests/hybrid.o
CC /tmp/build/perf-tools-next/builtin-annotate.o
CC /tmp/build/perf-tools-next/arch/x86/util/header.o
CC /tmp/build/perf-tools-next/arch/x86/tests/intel-pt-test.o
CC /tmp/build/perf-tools-next/ui/stdio/hist.o
CC /tmp/build/perf-tools-next/arch/x86/tests/bp-modify.o
CC /tmp/build/perf-tools-next/ui/browser.o
CC /tmp/build/perf-tools-next/tests/builtin-test.o
CC /tmp/build/perf-tools-next/ui/keysyms.o
CC /tmp/build/perf-tools-next/arch/x86/util/tsc.o
CC /tmp/build/perf-tools-next/arch/x86/tests/amd-ibs-via-core-pmu.o
CC /tmp/build/perf-tools-next/tests/tests-scripts.o
CC /tmp/build/perf-tools-next/builtin-check.o
LD /tmp/build/perf-tools-next/trace/beauty/perf-util-in.o
CC /tmp/build/perf-tools-next/arch/x86/util/pmu.o
CC /tmp/build/perf-tools-next/arch/x86/tests/amd-ibs-period.o
CC /tmp/build/perf-tools-next/builtin-config.o
LD /tmp/build/perf-tools-next/jvmti/jvmti-in.o
LD /tmp/build/perf-tools-next/scripts/python/Perf-Trace-Util/perf-util-in.o
CC /tmp/build/perf-tools-next/tests/parse-events.o
CC /tmp/build/perf-tools-next/arch/x86/util/topdown.o
CC /tmp/build/perf-tools-next/arch/x86/tests/topdown.o
CC /tmp/build/perf-tools-next/builtin-diff.o
In file included from ui/gtk/setup.c:2:
ui/gtk/gtk.h:8:10: fatal error: gtk/gtk.h: No such file or directory
8 | #include <gtk/gtk.h>
| ^~~~~~~~~~~
compilation terminated.
CC /tmp/build/perf-tools-next/tests/uncore-event-sorting.o
In file included from ui/gtk/annotate.c:2:
ui/gtk/gtk.h:8:10: fatal error: gtk/gtk.h: No such file or directory
8 | #include <gtk/gtk.h>
| ^~~~~~~~~~~
In file included from ui/gtk/helpline.c:2:
ui/gtk/gtk.h:8:10: fatal error: gtk/gtk.h: No such file or directory
8 | #include <gtk/gtk.h>
| ^~~~~~~~~~~
compilation terminated.
compilation terminated.
In file included from ui/gtk/browser.c:2:
ui/gtk/gtk.h:8:10: fatal error: gtk/gtk.h: No such file or directory
8 | #include <gtk/gtk.h>
| ^~~~~~~~~~~
compilation terminated.
CC /tmp/build/perf-tools-next/ui/tui/setup.o
CC /tmp/build/perf-tools-next/arch/x86/util/machine.o
In file included from ui/gtk/util.c:3:
ui/gtk/gtk.h:8:10: fatal error: gtk/gtk.h: No such file or directory
8 | #include <gtk/gtk.h>
| ^~~~~~~~~~~
compilation terminated.
In file included from ui/gtk/hists.c:2:
ui/gtk/gtk.h:8:10: fatal error: gtk/gtk.h: No such file or directory
8 | #include <gtk/gtk.h>
| ^~~~~~~~~~~
compilation terminated.
make[4]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:96: /tmp/build/perf-tools-next/ui/gtk/annotate.o] Error 1
make[4]: *** Waiting for unfinished jobs....
make[4]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:96: /tmp/build/perf-tools-next/ui/gtk/browser.o] Error 1
CC /tmp/build/perf-tools-next/ui/browsers/annotate.o
make[4]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:96: /tmp/build/perf-tools-next/ui/gtk/helpline.o] Error 1
make[4]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:96: /tmp/build/perf-tools-next/ui/gtk/setup.o] Error 1
CC /tmp/build/perf-tools-next/tests/dso-data.o
make[4]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:96: /tmp/build/perf-tools-next/ui/gtk/hists.o] Error 1
make[4]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:96: /tmp/build/perf-tools-next/ui/gtk/util.o] Error 1
CC /tmp/build/perf-tools-next/arch/x86/util/event.o
CC /tmp/build/perf-tools-next/builtin-evlist.o
CC /tmp/build/perf-tools-next/ui/tui/util.o
LD /tmp/build/perf-tools-next/scripts/perf-util-in.o
CC /tmp/build/perf-tools-next/tests/vmlinux-kallsyms.o
CC /tmp/build/perf-tools-next/arch/x86/util/evlist.o
CC /tmp/build/perf-tools-next/ui/tui/helpline.o
CC /tmp/build/perf-tools-next/builtin-ftrace.o
CC /tmp/build/perf-tools-next/ui/browsers/annotate-data.o
CC /tmp/build/perf-tools-next/arch/x86/util/mem-events.o
CC /tmp/build/perf-tools-next/tests/openat-syscall.o
CC /tmp/build/perf-tools-next/ui/tui/progress.o
CC /tmp/build/perf-tools-next/builtin-help.o
CC /tmp/build/perf-tools-next/ui/browsers/hists.o
CC /tmp/build/perf-tools-next/tests/openat-syscall-all-cpus.o
CC /tmp/build/perf-tools-next/arch/x86/util/evsel.o
CC /tmp/build/perf-tools-next/builtin-buildid-list.o
CC /tmp/build/perf-tools-next/tests/openat-syscall-tp-fields.o
LD /tmp/build/perf-tools-next/arch/x86/tests/perf-test-in.o
In file included from ui/gtk/progress.c:5:
ui/gtk/gtk.h:8:10: fatal error: gtk/gtk.h: No such file or directory
8 | #include <gtk/gtk.h>
| ^~~~~~~~~~~
compilation terminated.
CC /tmp/build/perf-tools-next/builtin-buildid-cache.o
CC /tmp/build/perf-tools-next/tests/mmap-basic.o
CC /tmp/build/perf-tools-next/builtin-kallsyms.o
CC /tmp/build/perf-tools-next/ui/browsers/map.o
CC /tmp/build/perf-tools-next/tests/perf-record.o
make[4]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:96: /tmp/build/perf-tools-next/ui/gtk/progress.o] Error 1
CC /tmp/build/perf-tools-next/arch/x86/util/iostat.o
CC /tmp/build/perf-tools-next/builtin-list.o
CC /tmp/build/perf-tools-next/ui/browsers/scripts.o
CC /tmp/build/perf-tools-next/tests/evsel-roundtrip-name.o
CC /tmp/build/perf-tools-next/arch/x86/util/auxtrace.o
CC /tmp/build/perf-tools-next/ui/browsers/header.o
CC /tmp/build/perf-tools-next/builtin-record.o
LD /tmp/build/perf-tools-next/arch/x86/perf-test-in.o
CC /tmp/build/perf-tools-next/tests/evsel-tp-sched.o
CC /tmp/build/perf-tools-next/arch/x86/util/intel-pt.o
CC /tmp/build/perf-tools-next/builtin-report.o
CC /tmp/build/perf-tools-next/ui/browsers/res_sample.o
CC /tmp/build/perf-tools-next/builtin-stat.o
LD /tmp/build/perf-tools-next/arch/perf-test-in.o
CC /tmp/build/perf-tools-next/arch/x86/util/intel-bts.o
CC /tmp/build/perf-tools-next/ui/browsers/c2c-function.o
CC /tmp/build/perf-tools-next/builtin-top.o
CC /tmp/build/perf-tools-next/builtin-script.o
CC /tmp/build/perf-tools-next/tests/fdarray.o
LINK /tmp/build/perf-tools-next/libperf-jvmti.so
CC /tmp/build/perf-tools-next/builtin-kvm.o
CC /tmp/build/perf-tools-next/tests/pmu.o
CC /tmp/build/perf-tools-next/builtin-inject.o
CC /tmp/build/perf-tools-next/tests/pmu-events.o
CC /tmp/build/perf-tools-next/builtin-mem.o
CC /tmp/build/perf-tools-next/tests/hists_common.o
CC /tmp/build/perf-tools-next/builtin-data.o
CC /tmp/build/perf-tools-next/builtin-version.o
LD /tmp/build/perf-tools-next/arch/x86/util/perf-util-in.o
CC /tmp/build/perf-tools-next/tests/hists_link.o
CC /tmp/build/perf-tools-next/builtin-c2c.o
CC /tmp/build/perf-tools-next/tests/hists_filter.o
make[3]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:158: ui/gtk] Error 2
make[2]: *** [Makefile.perf:584: /tmp/build/perf-tools-next/gtk-in.o] Error 2
make[2]: *** Waiting for unfinished jobs....
CC /tmp/build/perf-tools-next/builtin-daemon.o
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v8 0/3] perf tools: port UI from GTK2 to GTK4
2026-09-09 11:29 ` Arnaldo Carvalho de Melo
@ 2026-09-09 11:35 ` Arnaldo Carvalho de Melo
2026-09-09 11:43 ` Arnaldo Carvalho de Melo
0 siblings, 1 reply; 11+ messages in thread
From: Arnaldo Carvalho de Melo @ 2026-09-09 11:35 UTC (permalink / raw)
To: Matt Turner
Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Mark Rutland,
Alexander Shishkin, Jiri Olsa, Ian Rogers, Adrian Hunter,
James Clark, linux-kernel, linux-perf-users
On Wed, Sep 09, 2026 at 08:29:52AM -0300, Arnaldo Carvalho de Melo wrote:
> On Wed, Sep 09, 2026 at 08:25:41AM -0300, Arnaldo Carvalho de Melo wrote:
> > On Wed, Sep 09, 2026 at 08:13:07AM -0300, Arnaldo Carvalho de Melo wrote:
> > > On Tue, Sep 08, 2026 at 10:50:33PM -0400, Matt Turner wrote:
> > > > GTK2 is long dead upstream and increasingly hard to keep building on
> > > > current distros. This series ports perf's GTK-based report browser to
> > > > GTK4 and fixes it up so it's actually loadable at runtime after the
> > > > port.
> > > >
> > > > Patch 1 does the mechanical port (build system, widget API changes),
> > > > including the leftover-GTK2-call and signal-handling fixes that were a
> > > > separate patch 3 in v4. Patch 2 fixes a runtime issue found after the
> > > > port that prevented the browser from loading. Patch 3 fixes two stack
> > > > buffer overflows in the hierarchy view that predate the port.
> > >
> > > I'm tentatively merging this, will test build on my distro container set
> > > and perform some testing, thanks for working on this!
> >
> > Some fuzz applying the first patch in the series:
> >
> > ⬢ [acme@toolbx perf-tools-next]$ patch -p1 < ./v8_20260908_mattst88_perf_tools_port_ui_from_gtk2_to_gtk4.mbx
> > patching file tools/build/Makefile.feature
> > patching file tools/build/feature/Makefile
> > patching file tools/build/feature/test-gtk2-infobar.c
> > patching file tools/build/feature/test-gtk4.c (renamed from tools/build/feature/test-gtk2.c)
> > patching file tools/perf/Documentation/perf-report.txt
> > Hunk #1 succeeded at 354 with fuzz 2 (offset 3 lines).
> > patching file tools/perf/Makefile
> > patching file tools/perf/Makefile.config
> > patching file tools/perf/Makefile.perf
> > patching file tools/perf/builtin-annotate.c
> > Hunk #1 succeeded at 61 (offset 9 lines).
> > Hunk #2 succeeded at 721 (offset 9 lines).
> > Hunk #3 succeeded at 840 (offset 12 lines).
> > Hunk #4 succeeded at 910 (offset 12 lines).
> > patching file tools/perf/builtin-report.c
> > Hunk #1 succeeded at 83 (offset 1 line).
> > Hunk #2 succeeded at 1360 (offset 1 line).
> > Hunk #3 succeeded at 1714 (offset 4 lines).
> > patching file tools/perf/scripts/install-build-deps.sh
> > patching file tools/perf/tests/make
> > patching file tools/perf/ui/gtk/annotate.c
> > patching file tools/perf/ui/gtk/browser.c
> > patching file tools/perf/ui/gtk/gtk.h
> > patching file tools/perf/ui/gtk/hists.c
> > patching file tools/perf/ui/gtk/progress.c
> > patching file tools/perf/ui/gtk/setup.c
> > patching file tools/perf/ui/gtk/util.c
> > patching file tools/perf/ui/setup.c
> > ⬢ [acme@toolbx perf-tools-next]$
> >
> > I fixed it up quickly, now lets see the rest...
>
> Trying to build with it with just the first patch in this series in it
> correctly discovers that the gtk4 devel files are not available but then
> proceed to try to include gtk code and thus fail, where it should just
> do what the feature detection states: disable gtk support but build
> successfully without it, I'm checking if this is a quick surgery.
This is a pre-existing condition, if I try without your series and
without gtk2 devel files, I get the same problem, so I'll now try to
build it with the required gtk4 devel files, we can fix this
pre-existing problem afterwards, its not a regression introduced by your
series.
⬢ [acme@toolbx perf-tools-next]$ alias m='rm -rf ~/libexec/perf-core/ ; make -k GTK2=1 O=/tmp/build/$(basename $PWD)/ -C tools/perf install-bin && perf test import && cat /tmp/build/$(basename $PWD)/feature/test-all.make.output' ; export PYTHONPATH=/tmp/build/$(basename $PWD)/python
⬢ [acme@toolbx perf-tools-next]$ m
make: Entering directory '/home/acme/git/perf-tools-next/tools/perf'
BUILD: Doing 'make -j32' parallel build
Makefile.config:781: GTK2 not found, disables GTK2 support. Please install gtk2-devel or libgtk2.0-dev
Auto-detecting system features:
... libdw: [ on ]
... glibc: [ on ]
... libelf: [ on ]
... libnuma: [ on ]
... numa_num_possible_cpus: [ on ]
... libpython: [ on ]
... libcapstone: [ on ]
... llvm-perf: [ on ]
... zlib: [ on ]
... lzma: [ on ]
... bpf: [ on ]
... libaio: [ on ]
... libzstd: [ on ]
... libopenssl: [ on ]
... rust: [ on ]
INSTALL libsubcmd_headers
INSTALL libsymbol_headers
INSTALL libperf_headers
INSTALL libapi_headers
PERF_VERSION = 7.3.rc2.g93fd7adf1a47
INSTALL libbpf_headers
GEN /tmp/build/perf-tools-next/perf-archive
GEN /tmp/build/perf-tools-next/perf-iostat
CC /tmp/build/perf-tools-next/ui/gtk/browser.o
CC /tmp/build/perf-tools-next/ui/gtk/hists.o
CC /tmp/build/perf-tools-next/ui/gtk/setup.o
CC /tmp/build/perf-tools-next/arch/common.o
CC /tmp/build/perf-tools-next/ui/gtk/util.o
CC /tmp/build/perf-tools-next/ui/setup.o
CC /tmp/build/perf-tools-next/ui/gtk/helpline.o
CC /tmp/build/perf-tools-next/ui/gtk/progress.o
CC /tmp/build/perf-tools-next/ui/gtk/annotate.o
CC /tmp/build/perf-tools-next/builtin-annotate.o
CC /tmp/build/perf-tools-next/builtin-diff.o
CC /tmp/build/perf-tools-next/ui/browsers/annotate.o
CC /tmp/build/perf-tools-next/ui/browsers/annotate-data.o
CC /tmp/build/perf-tools-next/ui/browsers/hists.o
LD /tmp/build/perf-tools-next/arch/perf-util-in.o
CC /tmp/build/perf-tools-next/builtin-record.o
In file included from ui/gtk/browser.c:2:
ui/gtk/gtk.h:8:10: fatal error: gtk/gtk.h: No such file or directory
8 | #include <gtk/gtk.h>
| ^~~~~~~~~~~
compilation terminated.
In file included from ui/gtk/hists.c:2:
ui/gtk/gtk.h:8:10: fatal error: gtk/gtk.h: No such file or directory
8 | #include <gtk/gtk.h>
| ^~~~~~~~~~~
compilation terminated.
make[4]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:96: /tmp/build/perf-tools-next/ui/gtk/browser.o] Error 1
CC /tmp/build/perf-tools-next/builtin-report.o
make[4]: *** Waiting for unfinished jobs....
make[4]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:96: /tmp/build/perf-tools-next/ui/gtk/hists.o] Error 1
LINK /tmp/build/perf-tools-next/libperf-jvmti.so
In file included from ui/gtk/setup.c:2:
ui/gtk/gtk.h:8:10: fatal error: gtk/gtk.h: No such file or directory
8 | #include <gtk/gtk.h>
| ^~~~~~~~~~~
compilation terminated.
In file included from ui/gtk/util.c:3:
ui/gtk/gtk.h:8:10: fatal error: gtk/gtk.h: No such file or directory
8 | #include <gtk/gtk.h>
| ^~~~~~~~~~~
compilation terminated.
In file included from ui/gtk/helpline.c:2:
ui/gtk/gtk.h:8:10: fatal error: gtk/gtk.h: No such file or directory
8 | #include <gtk/gtk.h>
| ^~~~~~~~~~~
compilation terminated.
make[4]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:96: /tmp/build/perf-tools-next/ui/gtk/util.o] Error 1
make[4]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:96: /tmp/build/perf-tools-next/ui/gtk/setup.o] Error 1
CC /tmp/build/perf-tools-next/builtin-stat.o
make[4]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:96: /tmp/build/perf-tools-next/ui/gtk/helpline.o] Error 1
CC /tmp/build/perf-tools-next/builtin-top.o
LD /tmp/build/perf-tools-next/ui/browsers/perf-ui-in.o
CC /tmp/build/perf-tools-next/builtin-script.o
CC /tmp/build/perf-tools-next/builtin-kvm.o
In file included from ui/gtk/progress.c:4:
ui/gtk/gtk.h:8:10: fatal error: gtk/gtk.h: No such file or directory
8 | #include <gtk/gtk.h>
| ^~~~~~~~~~~
compilation terminated.
make[4]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:96: /tmp/build/perf-tools-next/ui/gtk/progress.o] Error 1
In file included from ui/gtk/annotate.c:2:
ui/gtk/gtk.h:8:10: fatal error: gtk/gtk.h: No such file or directory
8 | #include <gtk/gtk.h>
| ^~~~~~~~~~~
compilation terminated.
make[4]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:96: /tmp/build/perf-tools-next/ui/gtk/annotate.o] Error 1
make[3]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:158: ui/gtk] Error 2
make[2]: *** [Makefile.perf:584: /tmp/build/perf-tools-next/gtk-in.o] Error 2
make[2]: *** Waiting for unfinished jobs....
LD /tmp/build/perf-tools-next/ui/perf-ui-in.o
> - Arnaldo
>
> ⬢ [acme@toolbx perf-tools-next]$ alias m='rm -rf ~/libexec/perf-core/ ; make -k GTK4=1 O=/tmp/build/$(basename $PWD)/ -C tools/perf install-bin && perf test import && cat /tmp/build/$(basename $PWD)/feature/test-all.make.output' ; export PYTHONPATH=/tmp/build/$(basename $PWD)/python
> ⬢ [acme@toolbx perf-tools-next]$ m
> make: Entering directory '/home/acme/git/perf-tools-next/tools/perf'
> BUILD: Doing 'make -j32' parallel build
> Makefile.config:781: GTK4 not found, disables GTK4 support. Please install gtk4-devel or libgtk-4-dev
>
> Auto-detecting system features:
> ... libdw: [ on ]
> ... glibc: [ on ]
> ... gtk4: [ OFF ]
> ... libelf: [ on ]
> ... libnuma: [ on ]
> ... numa_num_possible_cpus: [ on ]
> ... libpython: [ on ]
> ... libcapstone: [ on ]
> ... llvm-perf: [ on ]
> ... zlib: [ on ]
> ... lzma: [ on ]
> ... bpf: [ on ]
> ... libaio: [ on ]
> ... libzstd: [ on ]
> ... libopenssl: [ on ]
> ... rust: [ on ]
>
> INSTALL libsubcmd_headers
> INSTALL libsymbol_headers
> INSTALL libapi_headers
> INSTALL libperf_headers
> CC /tmp/build/perf-tools-next/libperf/core.o
> CC /tmp/build/perf-tools-next/libperf/cpumap.o
> CC /tmp/build/perf-tools-next/libperf/threadmap.o
> CC /tmp/build/perf-tools-next/libperf/evsel.o
> CC /tmp/build/perf-tools-next/libsubcmd/exec-cmd.o
> CC /tmp/build/perf-tools-next/libperf/evlist.o
> CC /tmp/build/perf-tools-next/libperf/mmap.o
> INSTALL libbpf_headers
> CC /tmp/build/perf-tools-next/libsubcmd/help.o
> CC /tmp/build/perf-tools-next/libperf/zalloc.o
> CC /tmp/build/perf-tools-next/libsubcmd/pager.o
> CC /tmp/build/perf-tools-next/libperf/xyarray.o
> CC /tmp/build/perf-tools-next/libsubcmd/parse-options.o
> CC /tmp/build/perf-tools-next/libperf/lib.o
> CC /tmp/build/perf-tools-next/libsubcmd/run-command.o
> CC /tmp/build/perf-tools-next/libsubcmd/sigchain.o
> CC /tmp/build/perf-tools-next/libsubcmd/subcmd-config.o
> LD /tmp/build/perf-tools-next/libsubcmd/libsubcmd-in.o
> AR /tmp/build/perf-tools-next/libsubcmd/libsubcmd.a
> LD /tmp/build/perf-tools-next/libperf/libperf-in.o
> AR /tmp/build/perf-tools-next/libperf/libperf.a
> MKDIR /tmp/build/perf-tools-next/ui/gtk/
> CC /tmp/build/perf-tools-next/jvmti/libjvmti.o
> MKDIR /tmp/build/perf-tools-next/ui/gtk/
> CC /tmp/build/perf-tools-next/trace/beauty/syscalltbl.o
> MKDIR /tmp/build/perf-tools-next/ui/gtk/
> CC /tmp/build/perf-tools-next/arch/common.o
> CC /tmp/build/perf-tools-next/jvmti/jvmti_agent.o
> MKDIR /tmp/build/perf-tools-next/ui/gtk/
> MKDIR /tmp/build/perf-tools-next/ui/gtk/
> CC /tmp/build/perf-tools-next/trace/beauty/arch_errno_names.o
> CC /tmp/build/perf-tools-next/ui/setup.o
> CC /tmp/build/perf-tools-next/jvmti/libstring.o
> MKDIR /tmp/build/perf-tools-next/ui/gtk/
> CC /tmp/build/perf-tools-next/ui/helpline.o
> CC /tmp/build/perf-tools-next/jvmti/libctype.o
> CC /tmp/build/perf-tools-next/arch/x86/tests/regs_load.o
> CC /tmp/build/perf-tools-next/ui/gtk/browser.o
> CC /tmp/build/perf-tools-next/ui/gtk/hists.o
> CC /tmp/build/perf-tools-next/ui/gtk/setup.o
> CC /tmp/build/perf-tools-next/ui/gtk/annotate.o
> CC /tmp/build/perf-tools-next/ui/progress.o
> CC /tmp/build/perf-tools-next/scripts/python/Perf-Trace-Util/Context.o
> CC /tmp/build/perf-tools-next/ui/gtk/util.o
> CC /tmp/build/perf-tools-next/ui/util.o
> CC /tmp/build/perf-tools-next/ui/gtk/helpline.o
> CC /tmp/build/perf-tools-next/ui/gtk/zalloc.o
> CC /tmp/build/perf-tools-next/arch/x86/tests/dwarf-unwind.o
> CC /tmp/build/perf-tools-next/ui/gtk/progress.o
> CC /tmp/build/perf-tools-next/arch/x86/tests/arch-tests.o
> CC /tmp/build/perf-tools-next/ui/hist.o
> CC /tmp/build/perf-tools-next/arch/x86/tests/hybrid.o
> CC /tmp/build/perf-tools-next/builtin-annotate.o
> CC /tmp/build/perf-tools-next/arch/x86/util/header.o
> CC /tmp/build/perf-tools-next/arch/x86/tests/intel-pt-test.o
> CC /tmp/build/perf-tools-next/ui/stdio/hist.o
> CC /tmp/build/perf-tools-next/arch/x86/tests/bp-modify.o
> CC /tmp/build/perf-tools-next/ui/browser.o
> CC /tmp/build/perf-tools-next/tests/builtin-test.o
> CC /tmp/build/perf-tools-next/ui/keysyms.o
> CC /tmp/build/perf-tools-next/arch/x86/util/tsc.o
> CC /tmp/build/perf-tools-next/arch/x86/tests/amd-ibs-via-core-pmu.o
> CC /tmp/build/perf-tools-next/tests/tests-scripts.o
> CC /tmp/build/perf-tools-next/builtin-check.o
> LD /tmp/build/perf-tools-next/trace/beauty/perf-util-in.o
> CC /tmp/build/perf-tools-next/arch/x86/util/pmu.o
> CC /tmp/build/perf-tools-next/arch/x86/tests/amd-ibs-period.o
> CC /tmp/build/perf-tools-next/builtin-config.o
> LD /tmp/build/perf-tools-next/jvmti/jvmti-in.o
> LD /tmp/build/perf-tools-next/scripts/python/Perf-Trace-Util/perf-util-in.o
> CC /tmp/build/perf-tools-next/tests/parse-events.o
> CC /tmp/build/perf-tools-next/arch/x86/util/topdown.o
> CC /tmp/build/perf-tools-next/arch/x86/tests/topdown.o
> CC /tmp/build/perf-tools-next/builtin-diff.o
> In file included from ui/gtk/setup.c:2:
> ui/gtk/gtk.h:8:10: fatal error: gtk/gtk.h: No such file or directory
> 8 | #include <gtk/gtk.h>
> | ^~~~~~~~~~~
> compilation terminated.
> CC /tmp/build/perf-tools-next/tests/uncore-event-sorting.o
> In file included from ui/gtk/annotate.c:2:
> ui/gtk/gtk.h:8:10: fatal error: gtk/gtk.h: No such file or directory
> 8 | #include <gtk/gtk.h>
> | ^~~~~~~~~~~
> In file included from ui/gtk/helpline.c:2:
> ui/gtk/gtk.h:8:10: fatal error: gtk/gtk.h: No such file or directory
> 8 | #include <gtk/gtk.h>
> | ^~~~~~~~~~~
> compilation terminated.
> compilation terminated.
> In file included from ui/gtk/browser.c:2:
> ui/gtk/gtk.h:8:10: fatal error: gtk/gtk.h: No such file or directory
> 8 | #include <gtk/gtk.h>
> | ^~~~~~~~~~~
> compilation terminated.
> CC /tmp/build/perf-tools-next/ui/tui/setup.o
> CC /tmp/build/perf-tools-next/arch/x86/util/machine.o
> In file included from ui/gtk/util.c:3:
> ui/gtk/gtk.h:8:10: fatal error: gtk/gtk.h: No such file or directory
> 8 | #include <gtk/gtk.h>
> | ^~~~~~~~~~~
> compilation terminated.
> In file included from ui/gtk/hists.c:2:
> ui/gtk/gtk.h:8:10: fatal error: gtk/gtk.h: No such file or directory
> 8 | #include <gtk/gtk.h>
> | ^~~~~~~~~~~
> compilation terminated.
> make[4]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:96: /tmp/build/perf-tools-next/ui/gtk/annotate.o] Error 1
> make[4]: *** Waiting for unfinished jobs....
> make[4]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:96: /tmp/build/perf-tools-next/ui/gtk/browser.o] Error 1
> CC /tmp/build/perf-tools-next/ui/browsers/annotate.o
> make[4]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:96: /tmp/build/perf-tools-next/ui/gtk/helpline.o] Error 1
> make[4]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:96: /tmp/build/perf-tools-next/ui/gtk/setup.o] Error 1
> CC /tmp/build/perf-tools-next/tests/dso-data.o
> make[4]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:96: /tmp/build/perf-tools-next/ui/gtk/hists.o] Error 1
> make[4]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:96: /tmp/build/perf-tools-next/ui/gtk/util.o] Error 1
> CC /tmp/build/perf-tools-next/arch/x86/util/event.o
> CC /tmp/build/perf-tools-next/builtin-evlist.o
> CC /tmp/build/perf-tools-next/ui/tui/util.o
> LD /tmp/build/perf-tools-next/scripts/perf-util-in.o
> CC /tmp/build/perf-tools-next/tests/vmlinux-kallsyms.o
> CC /tmp/build/perf-tools-next/arch/x86/util/evlist.o
> CC /tmp/build/perf-tools-next/ui/tui/helpline.o
> CC /tmp/build/perf-tools-next/builtin-ftrace.o
> CC /tmp/build/perf-tools-next/ui/browsers/annotate-data.o
> CC /tmp/build/perf-tools-next/arch/x86/util/mem-events.o
> CC /tmp/build/perf-tools-next/tests/openat-syscall.o
> CC /tmp/build/perf-tools-next/ui/tui/progress.o
> CC /tmp/build/perf-tools-next/builtin-help.o
> CC /tmp/build/perf-tools-next/ui/browsers/hists.o
> CC /tmp/build/perf-tools-next/tests/openat-syscall-all-cpus.o
> CC /tmp/build/perf-tools-next/arch/x86/util/evsel.o
> CC /tmp/build/perf-tools-next/builtin-buildid-list.o
> CC /tmp/build/perf-tools-next/tests/openat-syscall-tp-fields.o
> LD /tmp/build/perf-tools-next/arch/x86/tests/perf-test-in.o
> In file included from ui/gtk/progress.c:5:
> ui/gtk/gtk.h:8:10: fatal error: gtk/gtk.h: No such file or directory
> 8 | #include <gtk/gtk.h>
> | ^~~~~~~~~~~
> compilation terminated.
> CC /tmp/build/perf-tools-next/builtin-buildid-cache.o
> CC /tmp/build/perf-tools-next/tests/mmap-basic.o
> CC /tmp/build/perf-tools-next/builtin-kallsyms.o
> CC /tmp/build/perf-tools-next/ui/browsers/map.o
> CC /tmp/build/perf-tools-next/tests/perf-record.o
> make[4]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:96: /tmp/build/perf-tools-next/ui/gtk/progress.o] Error 1
> CC /tmp/build/perf-tools-next/arch/x86/util/iostat.o
> CC /tmp/build/perf-tools-next/builtin-list.o
> CC /tmp/build/perf-tools-next/ui/browsers/scripts.o
> CC /tmp/build/perf-tools-next/tests/evsel-roundtrip-name.o
> CC /tmp/build/perf-tools-next/arch/x86/util/auxtrace.o
> CC /tmp/build/perf-tools-next/ui/browsers/header.o
> CC /tmp/build/perf-tools-next/builtin-record.o
> LD /tmp/build/perf-tools-next/arch/x86/perf-test-in.o
> CC /tmp/build/perf-tools-next/tests/evsel-tp-sched.o
> CC /tmp/build/perf-tools-next/arch/x86/util/intel-pt.o
> CC /tmp/build/perf-tools-next/builtin-report.o
> CC /tmp/build/perf-tools-next/ui/browsers/res_sample.o
> CC /tmp/build/perf-tools-next/builtin-stat.o
> LD /tmp/build/perf-tools-next/arch/perf-test-in.o
> CC /tmp/build/perf-tools-next/arch/x86/util/intel-bts.o
> CC /tmp/build/perf-tools-next/ui/browsers/c2c-function.o
> CC /tmp/build/perf-tools-next/builtin-top.o
> CC /tmp/build/perf-tools-next/builtin-script.o
> CC /tmp/build/perf-tools-next/tests/fdarray.o
> LINK /tmp/build/perf-tools-next/libperf-jvmti.so
> CC /tmp/build/perf-tools-next/builtin-kvm.o
> CC /tmp/build/perf-tools-next/tests/pmu.o
> CC /tmp/build/perf-tools-next/builtin-inject.o
> CC /tmp/build/perf-tools-next/tests/pmu-events.o
> CC /tmp/build/perf-tools-next/builtin-mem.o
> CC /tmp/build/perf-tools-next/tests/hists_common.o
> CC /tmp/build/perf-tools-next/builtin-data.o
> CC /tmp/build/perf-tools-next/builtin-version.o
> LD /tmp/build/perf-tools-next/arch/x86/util/perf-util-in.o
> CC /tmp/build/perf-tools-next/tests/hists_link.o
> CC /tmp/build/perf-tools-next/builtin-c2c.o
> CC /tmp/build/perf-tools-next/tests/hists_filter.o
> make[3]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:158: ui/gtk] Error 2
> make[2]: *** [Makefile.perf:584: /tmp/build/perf-tools-next/gtk-in.o] Error 2
> make[2]: *** Waiting for unfinished jobs....
> CC /tmp/build/perf-tools-next/builtin-daemon.o
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v8 0/3] perf tools: port UI from GTK2 to GTK4
2026-09-09 11:35 ` Arnaldo Carvalho de Melo
@ 2026-09-09 11:43 ` Arnaldo Carvalho de Melo
2026-09-09 11:52 ` Arnaldo Carvalho de Melo
0 siblings, 1 reply; 11+ messages in thread
From: Arnaldo Carvalho de Melo @ 2026-09-09 11:43 UTC (permalink / raw)
To: Matt Turner
Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Mark Rutland,
Alexander Shishkin, Jiri Olsa, Ian Rogers, Adrian Hunter,
James Clark, linux-kernel, linux-perf-users
On Wed, Sep 09, 2026 at 08:35:20AM -0300, Arnaldo Carvalho de Melo wrote:
> On Wed, Sep 09, 2026 at 08:29:52AM -0300, Arnaldo Carvalho de Melo wrote:
> > On Wed, Sep 09, 2026 at 08:25:41AM -0300, Arnaldo Carvalho de Melo wrote:
> > > patching file tools/perf/ui/setup.c
> > > ⬢ [acme@toolbx perf-tools-next]$
> > >
> > > I fixed it up quickly, now lets see the rest...
> >
> > Trying to build with it with just the first patch in this series in it
> > correctly discovers that the gtk4 devel files are not available but then
> > proceed to try to include gtk code and thus fail, where it should just
> > do what the feature detection states: disable gtk support but build
> > successfully without it, I'm checking if this is a quick surgery.
>
> This is a pre-existing condition, if I try without your series and
> without gtk2 devel files, I get the same problem, so I'll now try to
> build it with the required gtk4 devel files, we can fix this
> pre-existing problem afterwards, its not a regression introduced by your
> series.
Now, with GTK4=1 and trying to build the first patch after installing
gtk4-devel on fedora 43 it fails to detect gtk4 support:
⬢ [acme@toolbx perf-tools-next]$ m
make: Entering directory '/home/acme/git/perf-tools-next/tools/perf'
BUILD: Doing 'make -j32' parallel build
Auto-detecting system features:
... libdw: [ on ]
... glibc: [ on ]
... gtk4: [ OFF ]
... libelf: [ on ]
... libnuma: [ on ]
... numa_num_possible_cpus: [ on ]
... libpython: [ on ]
... libcapstone: [ on ]
... llvm-perf: [ on ]
... zlib: [ on ]
... lzma: [ on ]
... bpf: [ on ]
... libaio: [ on ]
... libzstd: [ on ]
... libopenssl: [ on ]
... rust: [ on ]
And:
⬢ [acme@toolbx perf-tools-next]$ cat /tmp/build/perf-tools-next/feature/test-gtk4.make.output
cat: /tmp/build/perf-tools-next/feature/test-gtk4.make.output: No such file or directory
⬢ [acme@toolbx perf-tools-next]$ ls -la /tmp/build/perf-tools-next/feature/test-gtk4*
ls: cannot access '/tmp/build/perf-tools-next/feature/test-gtk4*': No such file or directory
⬢ [acme@toolbx perf-tools-next]$ cat /tmp/build/perf-tools-next/feature/test-all.make.output
⬢ [acme@toolbx perf-tools-next]$ ldd /tmp/build/perf-tools-next/feature/test-all.
test-all.bin test-all.d test-all.make.output
⬢ [acme@toolbx perf-tools-next]$ ldd /tmp/build/perf-tools-next/feature/test-all.bin
linux-vdso.so.1 (0x00007f271bb90000)
libdw.so.1 => /lib64/libdw.so.1 (0x00007f271bae1000)
libpython3.14.so.1.0 => /lib64/libpython3.14.so.1.0 (0x00007f271b4a7000)
libm.so.6 => /lib64/libm.so.6 (0x00007f271b3b2000)
libtraceevent.so.1 => /lib64/libtraceevent.so.1 (0x00007f271b391000)
libelf.so.1 => /lib64/libelf.so.1 (0x00007f271b374000)
libnuma.so.1 => /lib64/libnuma.so.1 (0x00007f271b366000)
libslang.so.2 => /lib64/libslang.so.2 (0x00007f271b072000)
libz.so.1 => /lib64/libz.so.1 (0x00007f271b04a000)
liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f271b015000)
libzstd.so.1 => /lib64/libzstd.so.1 (0x00007f271af52000)
libssl.so.3 => /lib64/libssl.so.3 (0x00007f271ae67000)
libcrypto.so.3 => /lib64/libcrypto.so.3 (0x00007f271a925000)
libc.so.6 => /lib64/libc.so.6 (0x00007f271a731000)
libbz2.so.1 => /lib64/libbz2.so.1 (0x00007f271a71d000)
/lib64/ld-linux-x86-64.so.2 (0x00007f271bb92000)
⬢ [acme@toolbx perf-tools-next]$
Meaning its feature detection isn't being called at all, remains at
undetected:
⬢ [acme@toolbx perf-tools-next]$ grep gtk4 /tmp/build/perf-tools-next/FEATURE-DUMP
⬢ [acme@toolbx perf-tools-next]$
Probably this is pre-existing, but I wonder how you managed to test
then?
- Arnaldo
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v8 0/3] perf tools: port UI from GTK2 to GTK4
2026-09-09 11:43 ` Arnaldo Carvalho de Melo
@ 2026-09-09 11:52 ` Arnaldo Carvalho de Melo
2026-09-09 20:02 ` Arnaldo Carvalho de Melo
0 siblings, 1 reply; 11+ messages in thread
From: Arnaldo Carvalho de Melo @ 2026-09-09 11:52 UTC (permalink / raw)
To: Matt Turner
Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Mark Rutland,
Alexander Shishkin, Jiri Olsa, Ian Rogers, Adrian Hunter,
James Clark, linux-kernel, linux-perf-users
On Wed, Sep 09, 2026 at 08:43:20AM -0300, Arnaldo Carvalho de Melo wrote:
> On Wed, Sep 09, 2026 at 08:35:20AM -0300, Arnaldo Carvalho de Melo wrote:
> > On Wed, Sep 09, 2026 at 08:29:52AM -0300, Arnaldo Carvalho de Melo wrote:
> > > On Wed, Sep 09, 2026 at 08:25:41AM -0300, Arnaldo Carvalho de Melo wrote:
> > > > patching file tools/perf/ui/setup.c
> > > > ⬢ [acme@toolbx perf-tools-next]$
> > > >
> > > > I fixed it up quickly, now lets see the rest...
> > >
> > > Trying to build with it with just the first patch in this series in it
> > > correctly discovers that the gtk4 devel files are not available but then
> > > proceed to try to include gtk code and thus fail, where it should just
> > > do what the feature detection states: disable gtk support but build
> > > successfully without it, I'm checking if this is a quick surgery.
> >
> > This is a pre-existing condition, if I try without your series and
> > without gtk2 devel files, I get the same problem, so I'll now try to
> > build it with the required gtk4 devel files, we can fix this
> > pre-existing problem afterwards, its not a regression introduced by your
> > series.
>
> Now, with GTK4=1 and trying to build the first patch after installing
> gtk4-devel on fedora 43 it fails to detect gtk4 support:
>
> ⬢ [acme@toolbx perf-tools-next]$ m
> make: Entering directory '/home/acme/git/perf-tools-next/tools/perf'
> BUILD: Doing 'make -j32' parallel build
>
> Auto-detecting system features:
> ... libdw: [ on ]
> ... glibc: [ on ]
> ... gtk4: [ OFF ]
> ... libelf: [ on ]
> ... libnuma: [ on ]
I see, you do it with tools/perf being your cwd, I tried that and it
works now:
⬢ [acme@toolbx perf-tools-next]$ cd tools/perf/
⬢ [acme@toolbx perf]$ make GTK4=1
BUILD: Doing 'make -j32' parallel build
Auto-detecting system features:
... libdw: [ on ]
... glibc: [ on ]
... gtk4: [ on ]
... libelf: [ on ]
... libnuma: [ on ]
... numa_num_possible_cpus: [ on ]
... libpython: [ on ]
... libcapstone: [ on ]
... llvm-perf: [ on ]
... zlib: [ on ]
... lzma: [ on ]
... bpf: [ on ]
... libaio: [ on ]
... libzstd: [ on ]
... libopenssl: [ on ]
... rust: [ on ]
INSTALL libsubcmd_headers
INSTALL libapi_headers
PERF_VERSION = 7.3.rc2.g581f81a14c5c
INSTALL libsymbol_headers
GEN perf-archive
INSTALL libperf_headers
GEN perf-iostat
CC /home/acme/git/perf-tools-next/tools/perf/libperf/core.o
CC /home/acme/git/perf-tools-next/tools/perf/libperf/cpumap.o
CC /home/acme/git/perf-tools-next/tools/perf/libperf/threadmap.o
CC /home/acme/git/perf-tools-next/tools/perf/libperf/evsel.o
INSTALL libbpf_headers
CC /home/acme/git/perf-tools-next/tools/perf/libperf/evlist.o
CC /home/acme/git/perf-tools-next/tools/perf/libperf/mmap.o
CC /home/acme/git/perf-tools-next/tools/perf/libperf/zalloc.o
CC /home/acme/git/perf-tools-next/tools/perf/libperf/xyarray.o
CC /home/acme/git/perf-tools-next/tools/perf/libperf/lib.o
LD /home/acme/git/perf-tools-next/tools/perf/libperf/libperf-in.o
AR /home/acme/git/perf-tools-next/tools/perf/libperf/libperf.a
CC ui/gtk/browser.o
CC jvmti/libjvmti.o
CC ui/gtk/hists.o
CC arch/common.o
CC ui/gtk/setup.o
CC trace/beauty/syscalltbl.o
CC ui/gtk/util.o
CC jvmti/jvmti_agent.o
CC ui/gtk/helpline.o
CC trace/beauty/arch_errno_names.o
CC jvmti/libstring.o
CC ui/gtk/progress.o
CC jvmti/libctype.o
CC ui/gtk/annotate.o
<SNIP>
LD perf-bench-in.o
AR libperf-bench.a
LINK perf
LINK libperf-gtk.so
⬢ [acme@toolbx perf]$
I don't think this was present before, lemme try...
My bad, I made a mistake and was trying to build with gtk4 while using
GTK2=1 on the make command line, that I had switched to test building
with gtk2 for that pre-existing problem and forgot to switch back to
GTK4=1 when returning to test your patches...
Now, with it it works as expected, using 'make GTK4=1 -C tools/perf',
building the first patch:
⬢ [acme@toolbx perf-tools-next]$ rm -rf /tmp/build/`basename $PWD` ; mkdir -p /tmp/build/`basename $PWD`
⬢ [acme@toolbx perf-tools-next]$ alias m='rm -rf ~/libexec/perf-core/ ; make -k GTK4=1 O=/tmp/build/$(basename $PWD)/ -C tools/perf install-bin && perf test import && cat /tmp/build/$(basename $PWD)/feature/test-all.make.output' ; export PYTHONPATH=/tmp/build/$(basename $PWD)/python
⬢ [acme@toolbx perf-tools-next]$ m
make: Entering directory '/home/acme/git/perf-tools-next/tools/perf'
BUILD: Doing 'make -j32' parallel build
Auto-detecting system features:
... libdw: [ on ]
... glibc: [ on ]
... gtk4: [ on ]
... libelf: [ on ]
... libnuma: [ on ]
... numa_num_possible_cpus: [ on ]
... libpython: [ on ]
... libcapstone: [ on ]
... llvm-perf: [ on ]
... zlib: [ on ]
... lzma: [ on ]
... bpf: [ on ]
... libaio: [ on ]
... libzstd: [ on ]
... libopenssl: [ on ]
... rust: [ on ]
CC /tmp/build/perf-tools-next/dlfilters/dlfilter-test-api-v0.o
CC /tmp/build/perf-tools-next/dlfilters/dlfilter-test-api-v2.o
CC /tmp/build/perf-tools-next/dlfilters/dlfilter-show-cycles.o
GEN /tmp/build/perf-tools-next/arch/arm64/include/generated/asm/sysreg-defs.h
<SNIP>
LINK /tmp/build/perf-tools-next/perf
LINK /tmp/build/perf-tools-next/libperf-gtk.so
GEN /tmp/build/perf-tools-next/python/perf.cpython-314-x86_64-linux-gnu.so
INSTALL GTK UI
INSTALL binaries
INSTALL tests
INSTALL libperf-jvmti.so
INSTALL libexec
INSTALL perf-archive
INSTALL perf-iostat
INSTALL python-scripts
install: omitting directory 'scripts/python/Perf-Trace-Util/lib/Perf/Trace/__pycache__'
INSTALL dlfilters
INSTALL perf_completion-script
INSTALL perf-tip
make: Leaving directory '/home/acme/git/perf-tools-next/tools/perf'
104: 'import perf' in python : Ok
=== Test Summary ===
Passed main tests : 1
Passed subtests : 0
Skipped tests : 0
Failed tests : 0
⬢ [acme@toolbx perf-tools-next]$
And, which makes me recall why we made t his a plugin :-)
⬢ [acme@toolbx perf-tools-next]$ ldd /tmp/build/perf-tools-next/libperf-gtk.so
linux-vdso.so.1 (0x00007f8588fb8000)
libgtk-4.so.1 => /lib64/libgtk-4.so.1 (0x00007f858854c000)
libpangocairo-1.0.so.0 => /lib64/libpangocairo-1.0.so.0 (0x00007f8588539000)
libpango-1.0.so.0 => /lib64/libpango-1.0.so.0 (0x00007f85884cd000)
libharfbuzz.so.0 => /lib64/libharfbuzz.so.0 (0x00007f8588399000)
libgdk_pixbuf-2.0.so.0 => /lib64/libgdk_pixbuf-2.0.so.0 (0x00007f858836b000)
libcairo-gobject.so.2 => /lib64/libcairo-gobject.so.2 (0x00007f8588362000)
libcairo.so.2 => /lib64/libcairo.so.2 (0x00007f8588222000)
libvulkan.so.1 => /lib64/libvulkan.so.1 (0x00007f858819a000)
libgraphene-1.0.so.0 => /lib64/libgraphene-1.0.so.0 (0x00007f858817d000)
libgio-2.0.so.0 => /lib64/libgio-2.0.so.0 (0x00007f8587faa000)
libgobject-2.0.so.0 => /lib64/libgobject-2.0.so.0 (0x00007f8587f4b000)
libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007f8587df4000)
libc.so.6 => /lib64/libc.so.6 (0x00007f8587c00000)
libgmodule-2.0.so.0 => /lib64/libgmodule-2.0.so.0 (0x00007f8587bfa000)
libharfbuzz-subset.so.0 => /lib64/libharfbuzz-subset.so.0 (0x00007f8587ac5000)
libfribidi.so.0 => /lib64/libfribidi.so.0 (0x00007f8587aa5000)
libfontconfig.so.1 => /lib64/libfontconfig.so.1 (0x00007f8587a55000)
libepoxy.so.0 => /lib64/libepoxy.so.0 (0x00007f8587949000)
libm.so.6 => /lib64/libm.so.6 (0x00007f8587852000)
libgstplay-1.0.so.0 => /lib64/libgstplay-1.0.so.0 (0x00007f858782e000)
libgstvideo-1.0.so.0 => /lib64/libgstvideo-1.0.so.0 (0x00007f8587759000)
libgstreamer-1.0.so.0 => /lib64/libgstreamer-1.0.so.0 (0x00007f8587600000)
libgstgl-1.0.so.0 => /lib64/libgstgl-1.0.so.0 (0x00007f858756d000)
libgstallocators-1.0.so.0 => /lib64/libgstallocators-1.0.so.0 (0x00007f8587564000)
librsvg-2.so.2 => /lib64/librsvg-2.so.2 (0x00007f85870a0000)
libXi.so.6 => /lib64/libXi.so.6 (0x00007f858708d000)
libX11.so.6 => /lib64/libX11.so.6 (0x00007f8586f48000)
libpangoft2-1.0.so.0 => /lib64/libpangoft2-1.0.so.0 (0x00007f8586f2c000)
libtinysparql-3.0.so.0 => /lib64/libtinysparql-3.0.so.0 (0x00007f8586e58000)
libpng16.so.16 => /lib64/libpng16.so.16 (0x00007f8586e1c000)
libtiff.so.6 => /lib64/libtiff.so.6 (0x00007f8586d83000)
libjpeg.so.62 => /lib64/libjpeg.so.62 (0x00007f8586ce1000)
libxkbcommon.so.0 => /lib64/libxkbcommon.so.0 (0x00007f8586c88000)
libwayland-client.so.0 => /lib64/libwayland-client.so.0 (0x00007f8586c78000)
libwayland-egl.so.1 => /lib64/libwayland-egl.so.1 (0x00007f8586c74000)
libXext.so.6 => /lib64/libXext.so.6 (0x00007f8586c60000)
libXcursor.so.1 => /lib64/libXcursor.so.1 (0x00007f8586c51000)
libXdamage.so.1 => /lib64/libXdamage.so.1 (0x00007f8586c4d000)
libXfixes.so.3 => /lib64/libXfixes.so.3 (0x00007f8586c46000)
libXrandr.so.2 => /lib64/libXrandr.so.2 (0x00007f8586c39000)
libXinerama.so.1 => /lib64/libXinerama.so.1 (0x00007f8586c35000)
libcairo-script-interpreter.so.2 => /lib64/libcairo-script-interpreter.so.2 (0x00007f8586c12000)
libcups.so.2 => /lib64/libcups.so.2 (0x00007f8586b7c000)
libcolord.so.2 => /lib64/libcolord.so.2 (0x00007f8586b21000)
libthai.so.0 => /lib64/libthai.so.0 (0x00007f8586b16000)
libfreetype.so.6 => /lib64/libfreetype.so.6 (0x00007f8586a4c000)
libgraphite2.so.3 => /lib64/libgraphite2.so.3 (0x00007f8586a2d000)
libglycin-2.so.0 => /lib64/libglycin-2.so.0 (0x00007f858660b000)
libz.so.1 => /lib64/libz.so.1 (0x00007f85865e3000)
libXrender.so.1 => /lib64/libXrender.so.1 (0x00007f85865d7000)
libxcb.so.1 => /lib64/libxcb.so.1 (0x00007f85865ad000)
libxcb-render.so.0 => /lib64/libxcb-render.so.0 (0x00007f858659e000)
libxcb-shm.so.0 => /lib64/libxcb-shm.so.0 (0x00007f858659a000)
libpixman-1.so.0 => /lib64/libpixman-1.so.0 (0x00007f85864e9000)
libmount.so.1 => /lib64/libmount.so.1 (0x00007f8586493000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f8586462000)
libffi.so.8 => /lib64/libffi.so.8 (0x00007f8586452000)
libpcre2-8.so.0 => /lib64/libpcre2-8.so.0 (0x00007f85863a5000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8588fba000)
libxml2.so.2 => /lib64/libxml2.so.2 (0x00007f8586245000)
libgsttag-1.0.so.0 => /lib64/libgsttag-1.0.so.0 (0x00007f8586206000)
libgstpbutils-1.0.so.0 => /lib64/libgstpbutils-1.0.so.0 (0x00007f85861c1000)
libgstbase-1.0.so.0 => /lib64/libgstbase-1.0.so.0 (0x00007f858613d000)
liborc-0.4.so.0 => /lib64/liborc-0.4.so.0 (0x00007f8586099000)
libunwind.so.8 => /lib64/libunwind.so.8 (0x00007f858607c000)
libdw.so.1 => /lib64/libdw.so.1 (0x00007f8585fdf000)
libEGL.so.1 => /lib64/libEGL.so.1 (0x00007f8585fce000)
libGLX.so.0 => /lib64/libGLX.so.0 (0x00007f8585f9d000)
libwayland-cursor.so.0 => /lib64/libwayland-cursor.so.0 (0x00007f8585f93000)
libX11-xcb.so.1 => /lib64/libX11-xcb.so.1 (0x00007f8585f8f000)
libgudev-1.0.so.0 => /lib64/libgudev-1.0.so.0 (0x00007f8585f80000)
libdrm.so.2 => /lib64/libdrm.so.2 (0x00007f8585f69000)
libgbm.so.1 => /lib64/libgbm.so.1 (0x00007f8585f63000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f8585f37000)
libdav1d.so.7 => /lib64/libdav1d.so.7 (0x00007f8585d53000)
libjson-glib-1.0.so.0 => /lib64/libjson-glib-1.0.so.0 (0x00007f8585d26000)
libsqlite3.so.0 => /lib64/libsqlite3.so.0 (0x00007f8585bac000)
libwebp.so.7 => /lib64/libwebp.so.7 (0x00007f8585b26000)
libzstd.so.1 => /lib64/libzstd.so.1 (0x00007f8585a63000)
libLerc.so.4 => /lib64/libLerc.so.4 (0x00007f85859ce000)
libjbig.so.2.1 => /lib64/libjbig.so.2.1 (0x00007f85859c0000)
liblzo2.so.2 => /lib64/liblzo2.so.2 (0x00007f8585998000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f8585941000)
libavahi-common.so.3 => /lib64/libavahi-common.so.3 (0x00007f8585932000)
libavahi-client.so.3 => /lib64/libavahi-client.so.3 (0x00007f858591e000)
libgnutls.so.30 => /lib64/libgnutls.so.30 (0x00007f8585679000)
liblcms2.so.2 => /lib64/liblcms2.so.2 (0x00007f858560f000)
libudev.so.1 => /lib64/libudev.so.1 (0x00007f85855c5000)
libdatrie.so.1 => /lib64/libdatrie.so.1 (0x00007f85855bd000)
libbz2.so.1 => /lib64/libbz2.so.1 (0x00007f85855a9000)
libbrotlidec.so.1 => /lib64/libbrotlidec.so.1 (0x00007f858559b000)
libseccomp.so.2 => /lib64/libseccomp.so.2 (0x00007f858556f000)
libXau.so.6 => /lib64/libXau.so.6 (0x00007f858556a000)
libblkid.so.1 => /lib64/libblkid.so.1 (0x00007f8585530000)
liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f85854fb000)
libgstaudio-1.0.so.0 => /lib64/libgstaudio-1.0.so.0 (0x00007f8585476000)
libelf.so.1 => /lib64/libelf.so.1 (0x00007f8585457000)
libGLdispatch.so.0 => /lib64/libGLdispatch.so.0 (0x00007f85853df000)
libexpat.so.1 => /lib64/libexpat.so.1 (0x00007f85853b4000)
libsharpyuv.so.0 => /lib64/libsharpyuv.so.0 (0x00007f85853ac000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f8585134000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f8585067000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f858504f000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f8585049000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f8585039000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f8585033000)
libcrypto.so.3 => /lib64/libcrypto.so.3 (0x00007f8584af1000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f8584adc000)
libdbus-1.so.3 => /lib64/libdbus-1.so.3 (0x00007f8584a88000)
libp11-kit.so.0 => /lib64/libp11-kit.so.0 (0x00007f85848fb000)
libidn2.so.0 => /lib64/libidn2.so.0 (0x00007f85848ab000)
libunistring.so.5 => /lib64/libunistring.so.5 (0x00007f85846fe000)
libtasn1.so.6 => /lib64/libtasn1.so.6 (0x00007f85846e6000)
libhogweed.so.6 => /lib64/libhogweed.so.6 (0x00007f85846a3000)
libnettle.so.8 => /lib64/libnettle.so.8 (0x00007f858464d000)
libgmp.so.10 => /lib64/libgmp.so.10 (0x00007f85845a6000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007f858459a000)
libbrotlicommon.so.1 => /lib64/libbrotlicommon.so.1 (0x00007f8584577000)
libsystemd.so.0 => /lib64/libsystemd.so.0 (0x00007f858444d000)
⬢ [acme@toolbx perf-tools-next]$
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v8 0/3] perf tools: port UI from GTK2 to GTK4
2026-09-09 11:52 ` Arnaldo Carvalho de Melo
@ 2026-09-09 20:02 ` Arnaldo Carvalho de Melo
0 siblings, 0 replies; 11+ messages in thread
From: Arnaldo Carvalho de Melo @ 2026-09-09 20:02 UTC (permalink / raw)
To: Matt Turner
Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Mark Rutland,
Alexander Shishkin, Jiri Olsa, Ian Rogers, Adrian Hunter,
James Clark, linux-kernel, linux-perf-users
On Wed, Sep 09, 2026 at 08:52:48AM -0300, Arnaldo Carvalho de Melo wrote:
> On Wed, Sep 09, 2026 at 08:43:20AM -0300, Arnaldo Carvalho de Melo wrote:
> > On Wed, Sep 09, 2026 at 08:35:20AM -0300, Arnaldo Carvalho de Melo wrote:
> > Now, with GTK4=1 and trying to build the first patch after installing
> > gtk4-devel on fedora 43 it fails to detect gtk4 support:
> >
> > ⬢ [acme@toolbx perf-tools-next]$ m
> > make: Entering directory '/home/acme/git/perf-tools-next/tools/perf'
> > BUILD: Doing 'make -j32' parallel build
> >
> > Auto-detecting system features:
> > ... libdw: [ on ]
> > ... glibc: [ on ]
> > ... gtk4: [ OFF ]
I removed gtk4 from FEATURES_DISPLAY, as it is opt-in, no point in
telling most of the time it is OFF, when developing one can use 'make
VF=1' to see if it was detected:
⬢ [acme@toolbx perf-tools-next]$ alias m='rm -rf ~/libexec/perf-core/ ; make VF=1 CORESIGHT=1 -k O=/tmp/build/$(basename $PWD)/ -C tools/perf install-bin && perf test import && cat /tmp/build/$(basename $PWD)/feature/test-all.make.output' ; export PYTHONPATH=/tmp/build/$(basename $PWD)/python
⬢ [acme@toolbx perf-tools-next]$ m
make: Entering directory '/home/acme/git/perf-tools-next/tools/perf'
BUILD: Doing 'make -j32' parallel build
Auto-detecting system features:
... libdw: [ on ]
... glibc: [ on ]
... libelf: [ on ]
... libnuma: [ on ]
... numa_num_possible_cpus: [ on ]
... libpython: [ on ]
... libcapstone: [ on ]
... llvm-perf: [ on ]
... zlib: [ on ]
... lzma: [ on ]
... bpf: [ on ]
... libaio: [ on ]
... libzstd: [ on ]
... libopenssl: [ on ]
... rust: [ on ]
... backtrace: [ on ]
... eventfd: [ on ]
... fortify-source: [ on ]
... gettid: [ on ]
... libbfd: [ on ]
... libbfd-threadsafe: [ on ]
... libelf-getphdrnum: [ on ]
... libelf-gelf_getnote: [ on ]
... libelf-getshdrstrndx: [ on ]
... libelf-zstd: [ on ]
... libslang: [ on ]
... libtraceevent: [ on ]
... libcpupower: [ on ]
... pthread-attr-setaffinity-np: [ on ]
... pthread-barrier: [ on ]
... reallocarray: [ on ]
... stackprotector-all: [ on ]
... timerfd: [ on ]
... scandirat: [ on ]
... sched_getcpu: [ on ]
... sdt: [ on ]
... setns: [ on ]
... disassembler-four-args: [ on ]
... disassembler-init-styled: [ on ]
... file-handle: [ on ]
... bionic: [ OFF ]
... compile-32: [ OFF ]
... compile-x32: [ OFF ]
... cplus-demangle: [ OFF ]
... cxa-demangle: [ on ]
... gtk4: [ OFF ]
... hello: [ OFF ]
... babeltrace2-ctf-writer: [ on ]
... libcapstone: [ on ]
... libcheck: [ OFF ]
... libbfd-liberty: [ OFF ]
... libbfd-liberty-z: [ OFF ]
... libopencsd: [ on ]
... libperl: [ OFF ]
... llvm: [ OFF ]
... libbpf: [ OFF ]
... libpfm4: [ on ]
... libdebuginfod: [ on ]
... clang-bpf-co-re: [ on ]
... bpftool-skeletons: [ OFF ]
... libunwind: [ OFF ]
... libunwind-debug-frame: [ OFF ]
... libunwind-aarch64: [ OFF ]
... libunwind-debug-frame-aarch64: [ OFF ]
... libunwind-arm: [ OFF ]
... libunwind-debug-frame-arm: [ OFF ]
... libunwind-loongarch64: [ OFF ]
... libunwind-debug-frame-loongarch64: [ OFF ]
... libunwind-mips: [ OFF ]
... libunwind-debug-frame-mips: [ OFF ]
... libunwind-ppc32: [ OFF ]
... libunwind-debug-frame-ppc32: [ OFF ]
... libunwind-ppc64: [ OFF ]
... libunwind-debug-frame-ppc64: [ OFF ]
... libunwind-riscv: [ OFF ]
... libunwind-debug-frame-riscv: [ OFF ]
... libunwind-s390x: [ OFF ]
... libunwind-debug-frame-s390x: [ OFF ]
... libunwind-x86: [ OFF ]
... libunwind-debug-frame-x86: [ OFF ]
... libunwind-x86_64: [ OFF ]
... libunwind-debug-frame-x86_64: [ OFF ]
... prefix: /home/acme
... bindir: /home/acme/bin
... libdir: /home/acme/lib64
... sysconfdir: /home/acme/etc
... LIBUNWIND_DIR:
... LIBDW_DIR:
... JDIR: /usr/lib/jvm/java-latest-openjdk
... DWARF post unwind library: libdw
- Arnaldo
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2026-09-09 20:03 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-09 2:50 [PATCH v8 0/3] perf tools: port UI from GTK2 to GTK4 Matt Turner
2026-09-09 2:50 ` [PATCH v8 1/3] tools: port perf ui from GTK 2 to GTK 4 Matt Turner
2026-09-09 2:50 ` [PATCH v8 2/3] perf tools: make the GTK4 report browser actually loadable at runtime Matt Turner
2026-09-09 2:50 ` [PATCH v8 3/3] perf tools gtk: fix two hierarchy-view stack buffer overflows Matt Turner
2026-09-09 11:13 ` [PATCH v8 0/3] perf tools: port UI from GTK2 to GTK4 Arnaldo Carvalho de Melo
2026-09-09 11:25 ` Arnaldo Carvalho de Melo
2026-09-09 11:29 ` Arnaldo Carvalho de Melo
2026-09-09 11:35 ` Arnaldo Carvalho de Melo
2026-09-09 11:43 ` Arnaldo Carvalho de Melo
2026-09-09 11:52 ` Arnaldo Carvalho de Melo
2026-09-09 20:02 ` Arnaldo Carvalho de Melo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®