* [PATCH v2 0/2] perf riscv: Implement rdtsc()
@ 2026-09-29 3:41 ` Chen Pei
0 siblings, 0 replies; 18+ messages in thread
From: Chen Pei @ 2026-09-29 3:41 UTC (permalink / raw)
To: acme, peterz, mingo, namhyung
Cc: mark.rutland, alexander.shishkin, jolsa, irogers, adrian.hunter,
james.clark, leo.yan, john.g.garry, will, mike.leach, pjw, palmer,
guoren, linux-perf-users, linux-arm-kernel, linux-riscv,
linux-kernel
tools/perf falls back to the __weak rdtsc() stub in tools/perf/util/tsc.c
on every architecture that does not override it, riscv included. The
stub returns a constant 0, so anything that reaches for the counter gets
a value that means nothing and cannot tell it apart from a counter that
happens to be at 0.
The time CSR is a natural TSC equivalent on riscv: readable from user
mode, constant frequency, and the same counter that riscv's
arch_perf_update_userpage() feeds the user page conversion fields from,
ever since commit 83c5e13b8cbb ("riscv: Prepare for user-space perf
event mmap support"). This series registers that on the tools side.
The two patches are split so that the first stands on its own:
1. Implement rdtsc() over the time CSR for riscv64.
2. Have the build system say which architectures have a usable counter,
instead of a list of compiler macros inside the test.
What this is worth beyond the subtest result:
1. The subtest is the only reader of those conversion fields riscv
can run, so it guards arithmetic that has shipped unexercised;
registering the counter at the same time leaves a future riscv
auxtrace driver the reading and the conversion already in place.
2. The flag lets a caller ask whether the architecture has a counter
before it uses the value, without keeping its own copy of a list
that has to be edited every time an architecture grows an
implementation.
Changes since v1:
- Define rdtsc() for RV64 only. RV32 now keeps the weak stub.
- Declare the capability through the build system rather than through a
weak arch__rdtsc_supported() hook, following the PERF_HAVE_JITDUMP
pattern, as Leo Yan suggested.
Tests:
======
- riscv64 QEMU virt guest with sscofpmf, comparing the build before the
series with the build after it: before, the "TSC support" subtest skips
and the conversion subtest fails while comparing against the stub's
constant 0; after, both report Ok.
- riscv64 and riscv32 cross builds: the compile command of
tests/perf-time-to-tsc.o carries -DHAVE_RDTSC on rv64 and not on
rv32, so RV32 stays on the weak stub.
- x86_64 host and arm64 cross builds: -DHAVE_RDTSC is in effect for
both, and on the host the "TSC support" subtest still reports Ok.
Chen Pei (2):
perf riscv: Implement rdtsc()
perf tsc: Declare TSC support from the build system
tools/perf/Makefile.config | 4 ++++
tools/perf/arch/arm64/Makefile | 1 +
tools/perf/arch/riscv/Makefile | 1 +
tools/perf/arch/riscv/util/Build | 1 +
tools/perf/arch/riscv/util/tsc.c | 27 +++++++++++++++++++++++++++
tools/perf/arch/x86/Makefile | 1 +
tools/perf/tests/perf-time-to-tsc.c | 19 ++++---------------
7 files changed, 39 insertions(+), 15 deletions(-)
create mode 100644 tools/perf/arch/riscv/util/tsc.c
--
2.50.1
^ permalink raw reply [flat|nested] 18+ messages in thread* [PATCH v2 0/2] perf riscv: Implement rdtsc() @ 2026-09-29 3:41 ` Chen Pei 0 siblings, 0 replies; 18+ messages in thread From: Chen Pei @ 2026-09-29 3:41 UTC (permalink / raw) To: acme, peterz, mingo, namhyung Cc: mark.rutland, alexander.shishkin, jolsa, irogers, adrian.hunter, james.clark, leo.yan, john.g.garry, will, mike.leach, pjw, palmer, guoren, linux-perf-users, linux-arm-kernel, linux-riscv, linux-kernel tools/perf falls back to the __weak rdtsc() stub in tools/perf/util/tsc.c on every architecture that does not override it, riscv included. The stub returns a constant 0, so anything that reaches for the counter gets a value that means nothing and cannot tell it apart from a counter that happens to be at 0. The time CSR is a natural TSC equivalent on riscv: readable from user mode, constant frequency, and the same counter that riscv's arch_perf_update_userpage() feeds the user page conversion fields from, ever since commit 83c5e13b8cbb ("riscv: Prepare for user-space perf event mmap support"). This series registers that on the tools side. The two patches are split so that the first stands on its own: 1. Implement rdtsc() over the time CSR for riscv64. 2. Have the build system say which architectures have a usable counter, instead of a list of compiler macros inside the test. What this is worth beyond the subtest result: 1. The subtest is the only reader of those conversion fields riscv can run, so it guards arithmetic that has shipped unexercised; registering the counter at the same time leaves a future riscv auxtrace driver the reading and the conversion already in place. 2. The flag lets a caller ask whether the architecture has a counter before it uses the value, without keeping its own copy of a list that has to be edited every time an architecture grows an implementation. Changes since v1: - Define rdtsc() for RV64 only. RV32 now keeps the weak stub. - Declare the capability through the build system rather than through a weak arch__rdtsc_supported() hook, following the PERF_HAVE_JITDUMP pattern, as Leo Yan suggested. Tests: ====== - riscv64 QEMU virt guest with sscofpmf, comparing the build before the series with the build after it: before, the "TSC support" subtest skips and the conversion subtest fails while comparing against the stub's constant 0; after, both report Ok. - riscv64 and riscv32 cross builds: the compile command of tests/perf-time-to-tsc.o carries -DHAVE_RDTSC on rv64 and not on rv32, so RV32 stays on the weak stub. - x86_64 host and arm64 cross builds: -DHAVE_RDTSC is in effect for both, and on the host the "TSC support" subtest still reports Ok. Chen Pei (2): perf riscv: Implement rdtsc() perf tsc: Declare TSC support from the build system tools/perf/Makefile.config | 4 ++++ tools/perf/arch/arm64/Makefile | 1 + tools/perf/arch/riscv/Makefile | 1 + tools/perf/arch/riscv/util/Build | 1 + tools/perf/arch/riscv/util/tsc.c | 27 +++++++++++++++++++++++++++ tools/perf/arch/x86/Makefile | 1 + tools/perf/tests/perf-time-to-tsc.c | 19 ++++--------------- 7 files changed, 39 insertions(+), 15 deletions(-) create mode 100644 tools/perf/arch/riscv/util/tsc.c -- 2.50.1 _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v2 1/2] perf riscv: Implement rdtsc() 2026-09-29 3:41 ` Chen Pei @ 2026-09-29 3:41 ` Chen Pei -1 siblings, 0 replies; 18+ messages in thread From: Chen Pei @ 2026-09-29 3:41 UTC (permalink / raw) To: acme, peterz, mingo, namhyung Cc: mark.rutland, alexander.shishkin, jolsa, irogers, adrian.hunter, james.clark, leo.yan, john.g.garry, will, mike.leach, pjw, palmer, guoren, linux-perf-users, linux-arm-kernel, linux-riscv, linux-kernel, Anup Patel Perf has no riscv implementation of rdtsc(), so it links against the weak stub in util/tsc.c and every caller reads a constant 0 that cannot be told apart from a counter standing still. Implement rdtsc() over the time CSR with rdtime. The time CSR is a TSC equivalent on riscv: readable from user mode, constant frequency, and the same counter riscv's arch_perf_update_userpage() builds the user page conversion fields from, so the counter and perf time share a timebase. Define it for RV64 only. Reading the counter whole on RV32 takes time and timeh in a loop, and no RV32 user in tools/perf needs it that much, so RV32 keeps the weak stub. Reviewed-by: Anup Patel <anup@brainfault.org> Signed-off-by: Chen Pei <cp0613@linux.alibaba.com> --- Changes in v2: - Define rdtsc() for RV64 only. tools/perf/arch/riscv/util/Build | 1 + tools/perf/arch/riscv/util/tsc.c | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 tools/perf/arch/riscv/util/tsc.c diff --git a/tools/perf/arch/riscv/util/Build b/tools/perf/arch/riscv/util/Build index 2328fb9a30a3..52cd6a481de8 100644 --- a/tools/perf/arch/riscv/util/Build +++ b/tools/perf/arch/riscv/util/Build @@ -1 +1,2 @@ perf-util-y += header.o +perf-util-y += tsc.o diff --git a/tools/perf/arch/riscv/util/tsc.c b/tools/perf/arch/riscv/util/tsc.c new file mode 100644 index 000000000000..3dd419ce9d2a --- /dev/null +++ b/tools/perf/arch/riscv/util/tsc.c @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include <linux/types.h> + +#include "../../../util/tsc.h" + +/* + * RV32 is left to the weak stub: reading the counter whole there takes time + * and timeh in a loop, and no RV32 user in tools/perf needs it that much. + */ +#if defined(__riscv) && __riscv_xlen == 64 + +u64 rdtsc(void) +{ + u64 val; + + /* + * The time CSR ticks at a constant frequency and is the same counter + * the kernel feeds into the user page conversion fields through + * sched_clock(), so it is a TSC equivalent here. + */ + asm volatile("rdtime %0" : "=r" (val)); + + return val; +} + +#endif -- 2.50.1 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v2 1/2] perf riscv: Implement rdtsc() @ 2026-09-29 3:41 ` Chen Pei 0 siblings, 0 replies; 18+ messages in thread From: Chen Pei @ 2026-09-29 3:41 UTC (permalink / raw) To: acme, peterz, mingo, namhyung Cc: mark.rutland, alexander.shishkin, jolsa, irogers, adrian.hunter, james.clark, leo.yan, john.g.garry, will, mike.leach, pjw, palmer, guoren, linux-perf-users, linux-arm-kernel, linux-riscv, linux-kernel, Anup Patel Perf has no riscv implementation of rdtsc(), so it links against the weak stub in util/tsc.c and every caller reads a constant 0 that cannot be told apart from a counter standing still. Implement rdtsc() over the time CSR with rdtime. The time CSR is a TSC equivalent on riscv: readable from user mode, constant frequency, and the same counter riscv's arch_perf_update_userpage() builds the user page conversion fields from, so the counter and perf time share a timebase. Define it for RV64 only. Reading the counter whole on RV32 takes time and timeh in a loop, and no RV32 user in tools/perf needs it that much, so RV32 keeps the weak stub. Reviewed-by: Anup Patel <anup@brainfault.org> Signed-off-by: Chen Pei <cp0613@linux.alibaba.com> --- Changes in v2: - Define rdtsc() for RV64 only. tools/perf/arch/riscv/util/Build | 1 + tools/perf/arch/riscv/util/tsc.c | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 tools/perf/arch/riscv/util/tsc.c diff --git a/tools/perf/arch/riscv/util/Build b/tools/perf/arch/riscv/util/Build index 2328fb9a30a3..52cd6a481de8 100644 --- a/tools/perf/arch/riscv/util/Build +++ b/tools/perf/arch/riscv/util/Build @@ -1 +1,2 @@ perf-util-y += header.o +perf-util-y += tsc.o diff --git a/tools/perf/arch/riscv/util/tsc.c b/tools/perf/arch/riscv/util/tsc.c new file mode 100644 index 000000000000..3dd419ce9d2a --- /dev/null +++ b/tools/perf/arch/riscv/util/tsc.c @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include <linux/types.h> + +#include "../../../util/tsc.h" + +/* + * RV32 is left to the weak stub: reading the counter whole there takes time + * and timeh in a loop, and no RV32 user in tools/perf needs it that much. + */ +#if defined(__riscv) && __riscv_xlen == 64 + +u64 rdtsc(void) +{ + u64 val; + + /* + * The time CSR ticks at a constant frequency and is the same counter + * the kernel feeds into the user page conversion fields through + * sched_clock(), so it is a TSC equivalent here. + */ + asm volatile("rdtime %0" : "=r" (val)); + + return val; +} + +#endif -- 2.50.1 _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH v2 1/2] perf riscv: Implement rdtsc() 2026-09-29 3:41 ` Chen Pei (?) @ 2026-09-29 3:47 ` sashiko-bot -1 siblings, 0 replies; 18+ messages in thread From: sashiko-bot @ 2026-09-29 3:47 UTC (permalink / raw) To: Chen Pei; +Cc: linux-perf-users > Perf has no riscv implementation of rdtsc(), so it links against the weak > stub in util/tsc.c and every caller reads a constant 0 that cannot be > told apart from a counter standing still. > > Implement rdtsc() over the time CSR with rdtime. The time CSR is a TSC > equivalent on riscv: readable from user mode, constant frequency, and the > same counter riscv's arch_perf_update_userpage() builds the user page > conversion fields from, so the counter and perf time share a timebase. > > Define it for RV64 only. Reading the counter whole on RV32 takes time and > timeh in a loop, and no RV32 user in tools/perf needs it that much, so > RV32 keeps the weak stub. > > Reviewed-by: Anup Patel <anup@brainfault.org> > Signed-off-by: Chen Pei <cp0613@linux.alibaba.com> Sashiko has reviewed this patch and found no issues. It looks great! -- Sashiko AI review · https://sashiko.dev/#/patchset/20260929034133.2153-1-cp0613@linux.alibaba.com?part=1 ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 1/2] perf riscv: Implement rdtsc() 2026-09-29 3:41 ` Chen Pei @ 2026-10-07 15:28 ` Paul Walmsley -1 siblings, 0 replies; 18+ messages in thread From: Paul Walmsley @ 2026-10-07 15:28 UTC (permalink / raw) To: Chen Pei Cc: acme, peterz, mingo, namhyung, mark.rutland, alexander.shishkin, jolsa, irogers, adrian.hunter, james.clark, leo.yan, john.g.garry, will, mike.leach, pjw, palmer, guoren, linux-perf-users, linux-arm-kernel, linux-riscv, linux-kernel, Anup Patel On Tue, 29 Sep 2026, Chen Pei wrote: > Perf has no riscv implementation of rdtsc(), so it links against the weak > stub in util/tsc.c and every caller reads a constant 0 that cannot be > told apart from a counter standing still. > > Implement rdtsc() over the time CSR with rdtime. The time CSR is a TSC > equivalent on riscv: readable from user mode, constant frequency, and the > same counter riscv's arch_perf_update_userpage() builds the user page > conversion fields from, so the counter and perf time share a timebase. > > Define it for RV64 only. Reading the counter whole on RV32 takes time and > timeh in a loop, and no RV32 user in tools/perf needs it that much, so > RV32 keeps the weak stub. > > Reviewed-by: Anup Patel <anup@brainfault.org> > Signed-off-by: Chen Pei <cp0613@linux.alibaba.com> Acked-by: Paul Walmsley <pjw@kernel.org> # arch/riscv - Paul ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 1/2] perf riscv: Implement rdtsc() @ 2026-10-07 15:28 ` Paul Walmsley 0 siblings, 0 replies; 18+ messages in thread From: Paul Walmsley @ 2026-10-07 15:28 UTC (permalink / raw) To: Chen Pei Cc: acme, peterz, mingo, namhyung, mark.rutland, alexander.shishkin, jolsa, irogers, adrian.hunter, james.clark, leo.yan, john.g.garry, will, mike.leach, pjw, palmer, guoren, linux-perf-users, linux-arm-kernel, linux-riscv, linux-kernel, Anup Patel On Tue, 29 Sep 2026, Chen Pei wrote: > Perf has no riscv implementation of rdtsc(), so it links against the weak > stub in util/tsc.c and every caller reads a constant 0 that cannot be > told apart from a counter standing still. > > Implement rdtsc() over the time CSR with rdtime. The time CSR is a TSC > equivalent on riscv: readable from user mode, constant frequency, and the > same counter riscv's arch_perf_update_userpage() builds the user page > conversion fields from, so the counter and perf time share a timebase. > > Define it for RV64 only. Reading the counter whole on RV32 takes time and > timeh in a loop, and no RV32 user in tools/perf needs it that much, so > RV32 keeps the weak stub. > > Reviewed-by: Anup Patel <anup@brainfault.org> > Signed-off-by: Chen Pei <cp0613@linux.alibaba.com> Acked-by: Paul Walmsley <pjw@kernel.org> # arch/riscv - Paul _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v2 2/2] perf tsc: Declare TSC support from the build system 2026-09-29 3:41 ` Chen Pei @ 2026-09-29 3:41 ` Chen Pei -1 siblings, 0 replies; 18+ messages in thread From: Chen Pei @ 2026-09-29 3:41 UTC (permalink / raw) To: acme, peterz, mingo, namhyung Cc: mark.rutland, alexander.shishkin, jolsa, irogers, adrian.hunter, james.clark, leo.yan, john.g.garry, will, mike.leach, pjw, palmer, guoren, linux-perf-users, linux-arm-kernel, linux-riscv, linux-kernel The "TSC support" subtest of the "Convert perf time to TSC" test decides whether the architecture is covered by matching compiler macros for x86_64, i386 and arm64. That list has to be edited for every new architecture and can drift apart from the set of architectures that really provide a counter. Declare the capability where the implementation is, following the PERF_HAVE_JITDUMP pattern: an architecture with a usable counter sets PERF_HAVE_RDTSC in its arch Makefile, Makefile.config turns it into -DHAVE_RDTSC, and the test keys off that. x86 and arm64 keep the same behaviour, riscv starts running the subtest where the previous patch defines rdtsc(). Signed-off-by: Chen Pei <cp0613@linux.alibaba.com> --- Changes in v2: - Declare the capability through the build system instead of a weak arch__rdtsc_supported() hook. tools/perf/Makefile.config | 4 ++++ tools/perf/arch/arm64/Makefile | 1 + tools/perf/arch/riscv/Makefile | 1 + tools/perf/arch/x86/Makefile | 1 + tools/perf/tests/perf-time-to-tsc.c | 19 ++++--------------- 5 files changed, 11 insertions(+), 15 deletions(-) diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config index 4d5993da9f94..f1b3bf208231 100644 --- a/tools/perf/Makefile.config +++ b/tools/perf/Makefile.config @@ -618,6 +618,10 @@ ifdef PERF_HAVE_JITDUMP endif endif +ifeq ($(PERF_HAVE_RDTSC),1) + CFLAGS += -DHAVE_RDTSC +endif + ifeq ($(SRCARCH),powerpc) ifndef NO_LIBDW CFLAGS += -DHAVE_SKIP_CALLCHAIN_IDX diff --git a/tools/perf/arch/arm64/Makefile b/tools/perf/arch/arm64/Makefile index 44cc3f023318..b9cd559065d6 100644 --- a/tools/perf/arch/arm64/Makefile +++ b/tools/perf/arch/arm64/Makefile @@ -1,2 +1,3 @@ # SPDX-License-Identifier: GPL-2.0 PERF_HAVE_JITDUMP := 1 +PERF_HAVE_RDTSC := 1 diff --git a/tools/perf/arch/riscv/Makefile b/tools/perf/arch/riscv/Makefile index 44cc3f023318..8036bf55da8e 100644 --- a/tools/perf/arch/riscv/Makefile +++ b/tools/perf/arch/riscv/Makefile @@ -1,2 +1,3 @@ # SPDX-License-Identifier: GPL-2.0 PERF_HAVE_JITDUMP := 1 +PERF_HAVE_RDTSC := $(IS_64_BIT) diff --git a/tools/perf/arch/x86/Makefile b/tools/perf/arch/x86/Makefile index 44cc3f023318..b9cd559065d6 100644 --- a/tools/perf/arch/x86/Makefile +++ b/tools/perf/arch/x86/Makefile @@ -1,2 +1,3 @@ # SPDX-License-Identifier: GPL-2.0 PERF_HAVE_JITDUMP := 1 +PERF_HAVE_RDTSC := 1 diff --git a/tools/perf/tests/perf-time-to-tsc.c b/tools/perf/tests/perf-time-to-tsc.c index f8f71fdd32b1..feb8063f8b59 100644 --- a/tools/perf/tests/perf-time-to-tsc.c +++ b/tools/perf/tests/perf-time-to-tsc.c @@ -22,16 +22,6 @@ #include "tests.h" #include "util/sample.h" -/* - * Except x86_64/i386 and Arm64, other archs don't support TSC in perf. Just - * enable the test for x86_64/i386 and Arm64 archs. - */ -#if defined(__x86_64__) || defined(__i386__) || defined(__aarch64__) -#define TSC_IS_SUPPORTED 1 -#else -#define TSC_IS_SUPPORTED 0 -#endif - #define CHECK__(x) { \ while ((x) < 0) { \ pr_debug(#x " failed!\n"); \ @@ -49,11 +39,10 @@ static int test__tsc_is_supported(struct test_suite *test __maybe_unused, int subtest __maybe_unused) { - if (!TSC_IS_SUPPORTED) { - pr_debug("Test not supported on this architecture\n"); - return TEST_SKIP; - } - +#ifndef HAVE_RDTSC + pr_debug("Test not supported on this architecture\n"); + return TEST_SKIP; +#endif return TEST_OK; } -- 2.50.1 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v2 2/2] perf tsc: Declare TSC support from the build system @ 2026-09-29 3:41 ` Chen Pei 0 siblings, 0 replies; 18+ messages in thread From: Chen Pei @ 2026-09-29 3:41 UTC (permalink / raw) To: acme, peterz, mingo, namhyung Cc: mark.rutland, alexander.shishkin, jolsa, irogers, adrian.hunter, james.clark, leo.yan, john.g.garry, will, mike.leach, pjw, palmer, guoren, linux-perf-users, linux-arm-kernel, linux-riscv, linux-kernel The "TSC support" subtest of the "Convert perf time to TSC" test decides whether the architecture is covered by matching compiler macros for x86_64, i386 and arm64. That list has to be edited for every new architecture and can drift apart from the set of architectures that really provide a counter. Declare the capability where the implementation is, following the PERF_HAVE_JITDUMP pattern: an architecture with a usable counter sets PERF_HAVE_RDTSC in its arch Makefile, Makefile.config turns it into -DHAVE_RDTSC, and the test keys off that. x86 and arm64 keep the same behaviour, riscv starts running the subtest where the previous patch defines rdtsc(). Signed-off-by: Chen Pei <cp0613@linux.alibaba.com> --- Changes in v2: - Declare the capability through the build system instead of a weak arch__rdtsc_supported() hook. tools/perf/Makefile.config | 4 ++++ tools/perf/arch/arm64/Makefile | 1 + tools/perf/arch/riscv/Makefile | 1 + tools/perf/arch/x86/Makefile | 1 + tools/perf/tests/perf-time-to-tsc.c | 19 ++++--------------- 5 files changed, 11 insertions(+), 15 deletions(-) diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config index 4d5993da9f94..f1b3bf208231 100644 --- a/tools/perf/Makefile.config +++ b/tools/perf/Makefile.config @@ -618,6 +618,10 @@ ifdef PERF_HAVE_JITDUMP endif endif +ifeq ($(PERF_HAVE_RDTSC),1) + CFLAGS += -DHAVE_RDTSC +endif + ifeq ($(SRCARCH),powerpc) ifndef NO_LIBDW CFLAGS += -DHAVE_SKIP_CALLCHAIN_IDX diff --git a/tools/perf/arch/arm64/Makefile b/tools/perf/arch/arm64/Makefile index 44cc3f023318..b9cd559065d6 100644 --- a/tools/perf/arch/arm64/Makefile +++ b/tools/perf/arch/arm64/Makefile @@ -1,2 +1,3 @@ # SPDX-License-Identifier: GPL-2.0 PERF_HAVE_JITDUMP := 1 +PERF_HAVE_RDTSC := 1 diff --git a/tools/perf/arch/riscv/Makefile b/tools/perf/arch/riscv/Makefile index 44cc3f023318..8036bf55da8e 100644 --- a/tools/perf/arch/riscv/Makefile +++ b/tools/perf/arch/riscv/Makefile @@ -1,2 +1,3 @@ # SPDX-License-Identifier: GPL-2.0 PERF_HAVE_JITDUMP := 1 +PERF_HAVE_RDTSC := $(IS_64_BIT) diff --git a/tools/perf/arch/x86/Makefile b/tools/perf/arch/x86/Makefile index 44cc3f023318..b9cd559065d6 100644 --- a/tools/perf/arch/x86/Makefile +++ b/tools/perf/arch/x86/Makefile @@ -1,2 +1,3 @@ # SPDX-License-Identifier: GPL-2.0 PERF_HAVE_JITDUMP := 1 +PERF_HAVE_RDTSC := 1 diff --git a/tools/perf/tests/perf-time-to-tsc.c b/tools/perf/tests/perf-time-to-tsc.c index f8f71fdd32b1..feb8063f8b59 100644 --- a/tools/perf/tests/perf-time-to-tsc.c +++ b/tools/perf/tests/perf-time-to-tsc.c @@ -22,16 +22,6 @@ #include "tests.h" #include "util/sample.h" -/* - * Except x86_64/i386 and Arm64, other archs don't support TSC in perf. Just - * enable the test for x86_64/i386 and Arm64 archs. - */ -#if defined(__x86_64__) || defined(__i386__) || defined(__aarch64__) -#define TSC_IS_SUPPORTED 1 -#else -#define TSC_IS_SUPPORTED 0 -#endif - #define CHECK__(x) { \ while ((x) < 0) { \ pr_debug(#x " failed!\n"); \ @@ -49,11 +39,10 @@ static int test__tsc_is_supported(struct test_suite *test __maybe_unused, int subtest __maybe_unused) { - if (!TSC_IS_SUPPORTED) { - pr_debug("Test not supported on this architecture\n"); - return TEST_SKIP; - } - +#ifndef HAVE_RDTSC + pr_debug("Test not supported on this architecture\n"); + return TEST_SKIP; +#endif return TEST_OK; } -- 2.50.1 _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH v2 2/2] perf tsc: Declare TSC support from the build system 2026-09-29 3:41 ` Chen Pei (?) @ 2026-09-29 3:48 ` sashiko-bot -1 siblings, 0 replies; 18+ messages in thread From: sashiko-bot @ 2026-09-29 3:48 UTC (permalink / raw) To: Chen Pei; +Cc: linux-perf-users > The "TSC support" subtest of the "Convert perf time to TSC" test decides > whether the architecture is covered by matching compiler macros for > x86_64, i386 and arm64. That list has to be edited for every new > architecture and can drift apart from the set of architectures that really > provide a counter. > > Declare the capability where the implementation is, following the > PERF_HAVE_JITDUMP pattern: an architecture with a usable counter sets > PERF_HAVE_RDTSC in its arch Makefile, Makefile.config turns it into > -DHAVE_RDTSC, and the test keys off that. > > x86 and arm64 keep the same behaviour, riscv starts running the subtest > where the previous patch defines rdtsc(). > > Signed-off-by: Chen Pei <cp0613@linux.alibaba.com> Sashiko has reviewed this patch and found no issues. It looks great! -- Sashiko AI review · https://sashiko.dev/#/patchset/20260929034133.2153-1-cp0613@linux.alibaba.com?part=2 ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 2/2] perf tsc: Declare TSC support from the build system 2026-09-29 3:41 ` Chen Pei @ 2026-09-29 9:49 ` Leo Yan -1 siblings, 0 replies; 18+ messages in thread From: Leo Yan @ 2026-09-29 9:49 UTC (permalink / raw) To: Chen Pei Cc: acme, peterz, mingo, namhyung, mark.rutland, alexander.shishkin, jolsa, irogers, adrian.hunter, james.clark, leo.yan, john.g.garry, will, mike.leach, pjw, palmer, guoren, linux-perf-users, linux-arm-kernel, linux-riscv, linux-kernel On Tue, Sep 29, 2026 at 11:41:33AM +0800, Chen Pei wrote: > x86 and arm64 keep the same behaviour, riscv starts running the subtest > where the previous patch defines rdtsc(). > > Signed-off-by: Chen Pei <cp0613@linux.alibaba.com> For arm64: Tested-by: Leo Yan <leo.yan@arm.com> ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 2/2] perf tsc: Declare TSC support from the build system @ 2026-09-29 9:49 ` Leo Yan 0 siblings, 0 replies; 18+ messages in thread From: Leo Yan @ 2026-09-29 9:49 UTC (permalink / raw) To: Chen Pei Cc: acme, peterz, mingo, namhyung, mark.rutland, alexander.shishkin, jolsa, irogers, adrian.hunter, james.clark, leo.yan, john.g.garry, will, mike.leach, pjw, palmer, guoren, linux-perf-users, linux-arm-kernel, linux-riscv, linux-kernel On Tue, Sep 29, 2026 at 11:41:33AM +0800, Chen Pei wrote: > x86 and arm64 keep the same behaviour, riscv starts running the subtest > where the previous patch defines rdtsc(). > > Signed-off-by: Chen Pei <cp0613@linux.alibaba.com> For arm64: Tested-by: Leo Yan <leo.yan@arm.com> _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 2/2] perf tsc: Declare TSC support from the build system 2026-09-29 3:41 ` Chen Pei @ 2026-10-06 13:16 ` Adrian Hunter -1 siblings, 0 replies; 18+ messages in thread From: Adrian Hunter @ 2026-10-06 13:16 UTC (permalink / raw) To: Chen Pei, acme, peterz, mingo, namhyung Cc: mark.rutland, alexander.shishkin, jolsa, irogers, james.clark, leo.yan, john.g.garry, will, mike.leach, pjw, palmer, guoren, linux-perf-users, linux-arm-kernel, linux-riscv, linux-kernel On 29/09/2026 06:41, Chen Pei wrote: > The "TSC support" subtest of the "Convert perf time to TSC" test decides > whether the architecture is covered by matching compiler macros for > x86_64, i386 and arm64. That list has to be edited for every new > architecture and can drift apart from the set of architectures that really > provide a counter. > > Declare the capability where the implementation is, following the > PERF_HAVE_JITDUMP pattern: an architecture with a usable counter sets > PERF_HAVE_RDTSC in its arch Makefile, Makefile.config turns it into > -DHAVE_RDTSC, and the test keys off that. > > x86 and arm64 keep the same behaviour, riscv starts running the subtest > where the previous patch defines rdtsc(). > > Signed-off-by: Chen Pei <cp0613@linux.alibaba.com> One minor style comment below. In any case: Reviewed-by: Adrian Hunter <adrian.hunter@intel.com> > --- > Changes in v2: > - Declare the capability through the build system instead of a weak > arch__rdtsc_supported() hook. > > tools/perf/Makefile.config | 4 ++++ > tools/perf/arch/arm64/Makefile | 1 + > tools/perf/arch/riscv/Makefile | 1 + > tools/perf/arch/x86/Makefile | 1 + > tools/perf/tests/perf-time-to-tsc.c | 19 ++++--------------- > 5 files changed, 11 insertions(+), 15 deletions(-) > > diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config > index 4d5993da9f94..f1b3bf208231 100644 > --- a/tools/perf/Makefile.config > +++ b/tools/perf/Makefile.config > @@ -618,6 +618,10 @@ ifdef PERF_HAVE_JITDUMP > endif > endif > > +ifeq ($(PERF_HAVE_RDTSC),1) > + CFLAGS += -DHAVE_RDTSC > +endif > + > ifeq ($(SRCARCH),powerpc) > ifndef NO_LIBDW > CFLAGS += -DHAVE_SKIP_CALLCHAIN_IDX > diff --git a/tools/perf/arch/arm64/Makefile b/tools/perf/arch/arm64/Makefile > index 44cc3f023318..b9cd559065d6 100644 > --- a/tools/perf/arch/arm64/Makefile > +++ b/tools/perf/arch/arm64/Makefile > @@ -1,2 +1,3 @@ > # SPDX-License-Identifier: GPL-2.0 > PERF_HAVE_JITDUMP := 1 > +PERF_HAVE_RDTSC := 1 > diff --git a/tools/perf/arch/riscv/Makefile b/tools/perf/arch/riscv/Makefile > index 44cc3f023318..8036bf55da8e 100644 > --- a/tools/perf/arch/riscv/Makefile > +++ b/tools/perf/arch/riscv/Makefile > @@ -1,2 +1,3 @@ > # SPDX-License-Identifier: GPL-2.0 > PERF_HAVE_JITDUMP := 1 > +PERF_HAVE_RDTSC := $(IS_64_BIT) > diff --git a/tools/perf/arch/x86/Makefile b/tools/perf/arch/x86/Makefile > index 44cc3f023318..b9cd559065d6 100644 > --- a/tools/perf/arch/x86/Makefile > +++ b/tools/perf/arch/x86/Makefile > @@ -1,2 +1,3 @@ > # SPDX-License-Identifier: GPL-2.0 > PERF_HAVE_JITDUMP := 1 > +PERF_HAVE_RDTSC := 1 > diff --git a/tools/perf/tests/perf-time-to-tsc.c b/tools/perf/tests/perf-time-to-tsc.c > index f8f71fdd32b1..feb8063f8b59 100644 > --- a/tools/perf/tests/perf-time-to-tsc.c > +++ b/tools/perf/tests/perf-time-to-tsc.c > @@ -22,16 +22,6 @@ > #include "tests.h" > #include "util/sample.h" > > -/* > - * Except x86_64/i386 and Arm64, other archs don't support TSC in perf. Just > - * enable the test for x86_64/i386 and Arm64 archs. > - */ > -#if defined(__x86_64__) || defined(__i386__) || defined(__aarch64__) > -#define TSC_IS_SUPPORTED 1 > -#else > -#define TSC_IS_SUPPORTED 0 > -#endif > - > #define CHECK__(x) { \ > while ((x) < 0) { \ > pr_debug(#x " failed!\n"); \ > @@ -49,11 +39,10 @@ > static int test__tsc_is_supported(struct test_suite *test __maybe_unused, > int subtest __maybe_unused) > { > - if (!TSC_IS_SUPPORTED) { > - pr_debug("Test not supported on this architecture\n"); > - return TEST_SKIP; > - } > - > +#ifndef HAVE_RDTSC > + pr_debug("Test not supported on this architecture\n"); > + return TEST_SKIP; > +#endif Perhaps with #include <tools/config.h> the following is tidier: if (!IS_BUILTIN(HAVE_RDTSC)) { pr_debug("Test not supported on this architecture\n"); return TEST_SKIP; } > return TEST_OK; > } > ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 2/2] perf tsc: Declare TSC support from the build system @ 2026-10-06 13:16 ` Adrian Hunter 0 siblings, 0 replies; 18+ messages in thread From: Adrian Hunter @ 2026-10-06 13:16 UTC (permalink / raw) To: Chen Pei, acme, peterz, mingo, namhyung Cc: mark.rutland, alexander.shishkin, jolsa, irogers, james.clark, leo.yan, john.g.garry, will, mike.leach, pjw, palmer, guoren, linux-perf-users, linux-arm-kernel, linux-riscv, linux-kernel On 29/09/2026 06:41, Chen Pei wrote: > The "TSC support" subtest of the "Convert perf time to TSC" test decides > whether the architecture is covered by matching compiler macros for > x86_64, i386 and arm64. That list has to be edited for every new > architecture and can drift apart from the set of architectures that really > provide a counter. > > Declare the capability where the implementation is, following the > PERF_HAVE_JITDUMP pattern: an architecture with a usable counter sets > PERF_HAVE_RDTSC in its arch Makefile, Makefile.config turns it into > -DHAVE_RDTSC, and the test keys off that. > > x86 and arm64 keep the same behaviour, riscv starts running the subtest > where the previous patch defines rdtsc(). > > Signed-off-by: Chen Pei <cp0613@linux.alibaba.com> One minor style comment below. In any case: Reviewed-by: Adrian Hunter <adrian.hunter@intel.com> > --- > Changes in v2: > - Declare the capability through the build system instead of a weak > arch__rdtsc_supported() hook. > > tools/perf/Makefile.config | 4 ++++ > tools/perf/arch/arm64/Makefile | 1 + > tools/perf/arch/riscv/Makefile | 1 + > tools/perf/arch/x86/Makefile | 1 + > tools/perf/tests/perf-time-to-tsc.c | 19 ++++--------------- > 5 files changed, 11 insertions(+), 15 deletions(-) > > diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config > index 4d5993da9f94..f1b3bf208231 100644 > --- a/tools/perf/Makefile.config > +++ b/tools/perf/Makefile.config > @@ -618,6 +618,10 @@ ifdef PERF_HAVE_JITDUMP > endif > endif > > +ifeq ($(PERF_HAVE_RDTSC),1) > + CFLAGS += -DHAVE_RDTSC > +endif > + > ifeq ($(SRCARCH),powerpc) > ifndef NO_LIBDW > CFLAGS += -DHAVE_SKIP_CALLCHAIN_IDX > diff --git a/tools/perf/arch/arm64/Makefile b/tools/perf/arch/arm64/Makefile > index 44cc3f023318..b9cd559065d6 100644 > --- a/tools/perf/arch/arm64/Makefile > +++ b/tools/perf/arch/arm64/Makefile > @@ -1,2 +1,3 @@ > # SPDX-License-Identifier: GPL-2.0 > PERF_HAVE_JITDUMP := 1 > +PERF_HAVE_RDTSC := 1 > diff --git a/tools/perf/arch/riscv/Makefile b/tools/perf/arch/riscv/Makefile > index 44cc3f023318..8036bf55da8e 100644 > --- a/tools/perf/arch/riscv/Makefile > +++ b/tools/perf/arch/riscv/Makefile > @@ -1,2 +1,3 @@ > # SPDX-License-Identifier: GPL-2.0 > PERF_HAVE_JITDUMP := 1 > +PERF_HAVE_RDTSC := $(IS_64_BIT) > diff --git a/tools/perf/arch/x86/Makefile b/tools/perf/arch/x86/Makefile > index 44cc3f023318..b9cd559065d6 100644 > --- a/tools/perf/arch/x86/Makefile > +++ b/tools/perf/arch/x86/Makefile > @@ -1,2 +1,3 @@ > # SPDX-License-Identifier: GPL-2.0 > PERF_HAVE_JITDUMP := 1 > +PERF_HAVE_RDTSC := 1 > diff --git a/tools/perf/tests/perf-time-to-tsc.c b/tools/perf/tests/perf-time-to-tsc.c > index f8f71fdd32b1..feb8063f8b59 100644 > --- a/tools/perf/tests/perf-time-to-tsc.c > +++ b/tools/perf/tests/perf-time-to-tsc.c > @@ -22,16 +22,6 @@ > #include "tests.h" > #include "util/sample.h" > > -/* > - * Except x86_64/i386 and Arm64, other archs don't support TSC in perf. Just > - * enable the test for x86_64/i386 and Arm64 archs. > - */ > -#if defined(__x86_64__) || defined(__i386__) || defined(__aarch64__) > -#define TSC_IS_SUPPORTED 1 > -#else > -#define TSC_IS_SUPPORTED 0 > -#endif > - > #define CHECK__(x) { \ > while ((x) < 0) { \ > pr_debug(#x " failed!\n"); \ > @@ -49,11 +39,10 @@ > static int test__tsc_is_supported(struct test_suite *test __maybe_unused, > int subtest __maybe_unused) > { > - if (!TSC_IS_SUPPORTED) { > - pr_debug("Test not supported on this architecture\n"); > - return TEST_SKIP; > - } > - > +#ifndef HAVE_RDTSC > + pr_debug("Test not supported on this architecture\n"); > + return TEST_SKIP; > +#endif Perhaps with #include <tools/config.h> the following is tidier: if (!IS_BUILTIN(HAVE_RDTSC)) { pr_debug("Test not supported on this architecture\n"); return TEST_SKIP; } > return TEST_OK; > } > _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 2/2] perf tsc: Declare TSC support from the build system 2026-10-06 13:16 ` Adrian Hunter @ 2026-10-07 15:31 ` Paul Walmsley -1 siblings, 0 replies; 18+ messages in thread From: Paul Walmsley @ 2026-10-07 15:31 UTC (permalink / raw) To: Adrian Hunter Cc: Chen Pei, acme, peterz, mingo, namhyung, mark.rutland, alexander.shishkin, jolsa, irogers, james.clark, leo.yan, john.g.garry, will, mike.leach, pjw, palmer, guoren, linux-perf-users, linux-arm-kernel, linux-riscv, linux-kernel On Tue, 6 Oct 2026, Adrian Hunter wrote: > On 29/09/2026 06:41, Chen Pei wrote: > > The "TSC support" subtest of the "Convert perf time to TSC" test decides > > whether the architecture is covered by matching compiler macros for > > x86_64, i386 and arm64. That list has to be edited for every new > > architecture and can drift apart from the set of architectures that really > > provide a counter. > > > > Declare the capability where the implementation is, following the > > PERF_HAVE_JITDUMP pattern: an architecture with a usable counter sets > > PERF_HAVE_RDTSC in its arch Makefile, Makefile.config turns it into > > -DHAVE_RDTSC, and the test keys off that. > > > > x86 and arm64 keep the same behaviour, riscv starts running the subtest > > where the previous patch defines rdtsc(). > > > > Signed-off-by: Chen Pei <cp0613@linux.alibaba.com> > > One minor style comment below. In any case: > > Reviewed-by: Adrian Hunter <adrian.hunter@intel.com> Reviewed-by: Paul Walmsley <pjw@kernel.org> - Paul ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 2/2] perf tsc: Declare TSC support from the build system @ 2026-10-07 15:31 ` Paul Walmsley 0 siblings, 0 replies; 18+ messages in thread From: Paul Walmsley @ 2026-10-07 15:31 UTC (permalink / raw) To: Adrian Hunter Cc: Chen Pei, acme, peterz, mingo, namhyung, mark.rutland, alexander.shishkin, jolsa, irogers, james.clark, leo.yan, john.g.garry, will, mike.leach, pjw, palmer, guoren, linux-perf-users, linux-arm-kernel, linux-riscv, linux-kernel On Tue, 6 Oct 2026, Adrian Hunter wrote: > On 29/09/2026 06:41, Chen Pei wrote: > > The "TSC support" subtest of the "Convert perf time to TSC" test decides > > whether the architecture is covered by matching compiler macros for > > x86_64, i386 and arm64. That list has to be edited for every new > > architecture and can drift apart from the set of architectures that really > > provide a counter. > > > > Declare the capability where the implementation is, following the > > PERF_HAVE_JITDUMP pattern: an architecture with a usable counter sets > > PERF_HAVE_RDTSC in its arch Makefile, Makefile.config turns it into > > -DHAVE_RDTSC, and the test keys off that. > > > > x86 and arm64 keep the same behaviour, riscv starts running the subtest > > where the previous patch defines rdtsc(). > > > > Signed-off-by: Chen Pei <cp0613@linux.alibaba.com> > > One minor style comment below. In any case: > > Reviewed-by: Adrian Hunter <adrian.hunter@intel.com> Reviewed-by: Paul Walmsley <pjw@kernel.org> - Paul _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 2/2] perf tsc: Declare TSC support from the build system 2026-10-06 13:16 ` Adrian Hunter @ 2026-10-09 2:24 ` Chen Pei -1 siblings, 0 replies; 18+ messages in thread From: Chen Pei @ 2026-10-09 2:24 UTC (permalink / raw) To: adrian.hunter Cc: acme, alexander.shishkin, guoren, irogers, james.clark, john.g.garry, jolsa, leo.yan, linux-arm-kernel, linux-kernel, linux-perf-users, linux-riscv, mark.rutland, mike.leach, mingo, namhyung, palmer, peterz, pjw, will Hi Adrian, On Tue, 6 Oct 2026, Adrian Hunter wrote: > Perhaps with #include <tools/config.h> the following is tidier: > > if (!IS_BUILTIN(HAVE_RDTSC)) { > pr_debug("Test not supported on this architecture\n"); > return TEST_SKIP; > } Thanks for the review. I'll change it as suggested and post v3. Best regards, Pei _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 2/2] perf tsc: Declare TSC support from the build system @ 2026-10-09 2:24 ` Chen Pei 0 siblings, 0 replies; 18+ messages in thread From: Chen Pei @ 2026-10-09 2:24 UTC (permalink / raw) To: adrian.hunter Cc: acme, alexander.shishkin, guoren, irogers, james.clark, john.g.garry, jolsa, leo.yan, linux-arm-kernel, linux-kernel, linux-perf-users, linux-riscv, mark.rutland, mike.leach, mingo, namhyung, palmer, peterz, pjw, will Hi Adrian, On Tue, 6 Oct 2026, Adrian Hunter wrote: > Perhaps with #include <tools/config.h> the following is tidier: > > if (!IS_BUILTIN(HAVE_RDTSC)) { > pr_debug("Test not supported on this architecture\n"); > return TEST_SKIP; > } Thanks for the review. I'll change it as suggested and post v3. Best regards, Pei ^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2026-10-09 2:25 UTC | newest] Thread overview: 18+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-09-29 3:41 [PATCH v2 0/2] perf riscv: Implement rdtsc() Chen Pei 2026-09-29 3:41 ` Chen Pei 2026-09-29 3:41 ` [PATCH v2 1/2] " Chen Pei 2026-09-29 3:41 ` Chen Pei 2026-09-29 3:47 ` sashiko-bot 2026-10-07 15:28 ` Paul Walmsley 2026-10-07 15:28 ` Paul Walmsley 2026-09-29 3:41 ` [PATCH v2 2/2] perf tsc: Declare TSC support from the build system Chen Pei 2026-09-29 3:41 ` Chen Pei 2026-09-29 3:48 ` sashiko-bot 2026-09-29 9:49 ` Leo Yan 2026-09-29 9:49 ` Leo Yan 2026-10-06 13:16 ` Adrian Hunter 2026-10-06 13:16 ` Adrian Hunter 2026-10-07 15:31 ` Paul Walmsley 2026-10-07 15:31 ` Paul Walmsley 2026-10-09 2:24 ` Chen Pei 2026-10-09 2:24 ` Chen Pei
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.