Message ID | 20241024190353.46737-1-bjorn@kernel.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | perf, riscv: Wire up perf trace support for RISC-V | expand |
Hello, On Thu, Oct 24, 2024 at 12:03:51PM -0700, Björn Töpel wrote: > From: Björn Töpel <bjorn@rivosinc.com> > > RISC-V does not currently support perf trace, since the system call > table is not generated. > > Perform the copy/paste exercise, wiring up RISC-V system call table > generation. Can anybody with RISC-V please test this? Thanks, Namhyung > > Signed-off-by: Björn Töpel <bjorn@rivosinc.com> > --- > tools/perf/Makefile.config | 6 ++- > tools/perf/arch/riscv/Makefile | 22 +++++++++ > .../arch/riscv/entry/syscalls/mksyscalltbl | 47 +++++++++++++++++++ > tools/perf/util/syscalltbl.c | 4 ++ > 4 files changed, 78 insertions(+), 1 deletion(-) > create mode 100755 tools/perf/arch/riscv/entry/syscalls/mksyscalltbl > > diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config > index 4ddb27a48eed..1d388e71e0cc 100644 > --- a/tools/perf/Makefile.config > +++ b/tools/perf/Makefile.config > @@ -31,7 +31,7 @@ $(call detected_var,SRCARCH) > ifneq ($(NO_SYSCALL_TABLE),1) > NO_SYSCALL_TABLE := 1 > > - ifeq ($(SRCARCH),$(filter $(SRCARCH),x86 powerpc arm64 s390 mips loongarch)) > + ifeq ($(SRCARCH),$(filter $(SRCARCH),x86 powerpc arm64 s390 mips loongarch riscv)) > NO_SYSCALL_TABLE := 0 > endif > > @@ -83,6 +83,10 @@ ifeq ($(ARCH),mips) > LIBUNWIND_LIBS = -lunwind -lunwind-mips > endif > > +ifeq ($(ARCH),riscv) > + CFLAGS += -I$(OUTPUT)arch/riscv/include/generated > +endif > + > # So far there's only x86 and arm libdw unwind support merged in perf. > # Disable it on all other architectures in case libdw unwind > # support is detected in system. Add supported architectures > diff --git a/tools/perf/arch/riscv/Makefile b/tools/perf/arch/riscv/Makefile > index 90c3c476a242..481da4518695 100644 > --- a/tools/perf/arch/riscv/Makefile > +++ b/tools/perf/arch/riscv/Makefile > @@ -4,3 +4,25 @@ endif > PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET := 1 > PERF_HAVE_JITDUMP := 1 > HAVE_KVM_STAT_SUPPORT := 1 > + > +# > +# Syscall table generation for perf > +# > + > +out := $(OUTPUT)arch/riscv/include/generated/asm > +header := $(out)/syscalls.c > +incpath := $(srctree)/tools > +sysdef := $(srctree)/tools/arch/riscv/include/uapi/asm/unistd.h > +sysprf := $(srctree)/tools/perf/arch/riscv/entry/syscalls/ > +systbl := $(sysprf)/mksyscalltbl > + > +# Create output directory if not already present > +$(shell [ -d '$(out)' ] || mkdir -p '$(out)') > + > +$(header): $(sysdef) $(systbl) > + $(Q)$(SHELL) '$(systbl)' '$(CC)' '$(HOSTCC)' $(incpath) $(sysdef) > $@ > + > +clean:: > + $(call QUIET_CLEAN, riscv) $(RM) $(header) > + > +archheaders: $(header) > diff --git a/tools/perf/arch/riscv/entry/syscalls/mksyscalltbl b/tools/perf/arch/riscv/entry/syscalls/mksyscalltbl > new file mode 100755 > index 000000000000..c59f5e852b97 > --- /dev/null > +++ b/tools/perf/arch/riscv/entry/syscalls/mksyscalltbl > @@ -0,0 +1,47 @@ > +#!/bin/sh > +# SPDX-License-Identifier: GPL-2.0 > +# > +# Generate system call table for perf. Derived from > +# powerpc script. > +# > +# Copyright IBM Corp. 2017 > +# Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com> > +# Changed by: Ravi Bangoria <ravi.bangoria@linux.vnet.ibm.com> > +# Changed by: Kim Phillips <kim.phillips@arm.com> > +# Changed by: Björn Töpel <bjorn@rivosinc.com> > + > +gcc=$1 > +hostcc=$2 > +incpath=$3 > +input=$4 > + > +if ! test -r $input; then > + echo "Could not read input file" >&2 > + exit 1 > +fi > + > +create_sc_table() > +{ > + local sc nr max_nr > + > + while read sc nr; do > + printf "%s\n" " [$nr] = \"$sc\"," > + max_nr=$nr > + done > + > + echo "#define SYSCALLTBL_RISCV_MAX_ID $max_nr" > +} > + > +create_table() > +{ > + echo "#include \"$input\"" > + echo "static const char *const syscalltbl_riscv[] = {" > + create_sc_table > + echo "};" > +} > + > +$gcc -E -dM -x c -I $incpath/include/uapi $input \ > + |awk '$2 ~ "__NR" && $3 !~ "__NR3264_" { > + sub("^#define __NR(3264)?_", ""); > + print | "sort -k2 -n"}' \ > + |create_table > diff --git a/tools/perf/util/syscalltbl.c b/tools/perf/util/syscalltbl.c > index 7c15dec6900d..349986f6e5f5 100644 > --- a/tools/perf/util/syscalltbl.c > +++ b/tools/perf/util/syscalltbl.c > @@ -46,6 +46,10 @@ static const char *const *syscalltbl_native = syscalltbl_mips_n64; > #include <asm/syscalls.c> > const int syscalltbl_native_max_id = SYSCALLTBL_LOONGARCH_MAX_ID; > static const char *const *syscalltbl_native = syscalltbl_loongarch; > +#elif defined(__riscv) > +#include <asm/syscalls.c> > +const int syscalltbl_native_max_id = SYSCALLTBL_RISCV_MAX_ID; > +static const char *const *syscalltbl_native = syscalltbl_riscv; > #endif > > struct syscall { > > base-commit: c2ee9f594da826bea183ed14f2cc029c719bf4da > -- > 2.45.2 >
Hi Bjorn, Namhyung, On 30/10/2024 01:37, Namhyung Kim wrote: > Hello, > > On Thu, Oct 24, 2024 at 12:03:51PM -0700, Björn Töpel wrote: >> From: Björn Töpel <bjorn@rivosinc.com> >> >> RISC-V does not currently support perf trace, since the system call >> table is not generated. >> >> Perform the copy/paste exercise, wiring up RISC-V system call table >> generation. > Can anybody with RISC-V please test this? So before this patch, I get: Error::5File /sys/kernel/tracing//events/raw_syscalls/sys_(enter|exit) not found. Hint: Perhaps this kernel misses some CONFIG_ setting to enable this feature?. After applying this patch, I get a proper trace: .... 7.435 ( 0.332 ms): ls/1307 openat(dfd: CWD, filename: 0xb36ef668, flags: RDONLY|CLOEXEC) = 3 8.023 ( 0.454 ms): ls/1307 mmap(len: 23171, prot: READ, flags: PRIVATE, fd: 3) = 0x7fffb36cd000 8.558 ( 0.065 ms): ls/1307 close(fd: 3) = 0 8.850 ( 0.294 ms): ls/1307 openat(dfd: CWD, filename: 0xb36f9f80, flags: RDONLY|CLOEXEC) = 3 9.223 ( 0.152 ms): ls/1307 read(fd: 3, buf: 0x7fffe27b3c20, count: 832) ... So you can add: Tested-by: Alexandre Ghiti <alexghiti@rivosinc.com> Thanks, Alex > > Thanks, > Namhyung > >> Signed-off-by: Björn Töpel <bjorn@rivosinc.com> >> --- >> tools/perf/Makefile.config | 6 ++- >> tools/perf/arch/riscv/Makefile | 22 +++++++++ >> .../arch/riscv/entry/syscalls/mksyscalltbl | 47 +++++++++++++++++++ >> tools/perf/util/syscalltbl.c | 4 ++ >> 4 files changed, 78 insertions(+), 1 deletion(-) >> create mode 100755 tools/perf/arch/riscv/entry/syscalls/mksyscalltbl >> >> diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config >> index 4ddb27a48eed..1d388e71e0cc 100644 >> --- a/tools/perf/Makefile.config >> +++ b/tools/perf/Makefile.config >> @@ -31,7 +31,7 @@ $(call detected_var,SRCARCH) >> ifneq ($(NO_SYSCALL_TABLE),1) >> NO_SYSCALL_TABLE := 1 >> >> - ifeq ($(SRCARCH),$(filter $(SRCARCH),x86 powerpc arm64 s390 mips loongarch)) >> + ifeq ($(SRCARCH),$(filter $(SRCARCH),x86 powerpc arm64 s390 mips loongarch riscv)) >> NO_SYSCALL_TABLE := 0 >> endif >> >> @@ -83,6 +83,10 @@ ifeq ($(ARCH),mips) >> LIBUNWIND_LIBS = -lunwind -lunwind-mips >> endif >> >> +ifeq ($(ARCH),riscv) >> + CFLAGS += -I$(OUTPUT)arch/riscv/include/generated >> +endif >> + >> # So far there's only x86 and arm libdw unwind support merged in perf. >> # Disable it on all other architectures in case libdw unwind >> # support is detected in system. Add supported architectures >> diff --git a/tools/perf/arch/riscv/Makefile b/tools/perf/arch/riscv/Makefile >> index 90c3c476a242..481da4518695 100644 >> --- a/tools/perf/arch/riscv/Makefile >> +++ b/tools/perf/arch/riscv/Makefile >> @@ -4,3 +4,25 @@ endif >> PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET := 1 >> PERF_HAVE_JITDUMP := 1 >> HAVE_KVM_STAT_SUPPORT := 1 >> + >> +# >> +# Syscall table generation for perf >> +# >> + >> +out := $(OUTPUT)arch/riscv/include/generated/asm >> +header := $(out)/syscalls.c >> +incpath := $(srctree)/tools >> +sysdef := $(srctree)/tools/arch/riscv/include/uapi/asm/unistd.h >> +sysprf := $(srctree)/tools/perf/arch/riscv/entry/syscalls/ >> +systbl := $(sysprf)/mksyscalltbl >> + >> +# Create output directory if not already present >> +$(shell [ -d '$(out)' ] || mkdir -p '$(out)') >> + >> +$(header): $(sysdef) $(systbl) >> + $(Q)$(SHELL) '$(systbl)' '$(CC)' '$(HOSTCC)' $(incpath) $(sysdef) > $@ >> + >> +clean:: >> + $(call QUIET_CLEAN, riscv) $(RM) $(header) >> + >> +archheaders: $(header) >> diff --git a/tools/perf/arch/riscv/entry/syscalls/mksyscalltbl b/tools/perf/arch/riscv/entry/syscalls/mksyscalltbl >> new file mode 100755 >> index 000000000000..c59f5e852b97 >> --- /dev/null >> +++ b/tools/perf/arch/riscv/entry/syscalls/mksyscalltbl >> @@ -0,0 +1,47 @@ >> +#!/bin/sh >> +# SPDX-License-Identifier: GPL-2.0 >> +# >> +# Generate system call table for perf. Derived from >> +# powerpc script. >> +# >> +# Copyright IBM Corp. 2017 >> +# Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com> >> +# Changed by: Ravi Bangoria <ravi.bangoria@linux.vnet.ibm.com> >> +# Changed by: Kim Phillips <kim.phillips@arm.com> >> +# Changed by: Björn Töpel <bjorn@rivosinc.com> >> + >> +gcc=$1 >> +hostcc=$2 >> +incpath=$3 >> +input=$4 >> + >> +if ! test -r $input; then >> + echo "Could not read input file" >&2 >> + exit 1 >> +fi >> + >> +create_sc_table() >> +{ >> + local sc nr max_nr >> + >> + while read sc nr; do >> + printf "%s\n" " [$nr] = \"$sc\"," >> + max_nr=$nr >> + done >> + >> + echo "#define SYSCALLTBL_RISCV_MAX_ID $max_nr" >> +} >> + >> +create_table() >> +{ >> + echo "#include \"$input\"" >> + echo "static const char *const syscalltbl_riscv[] = {" >> + create_sc_table >> + echo "};" >> +} >> + >> +$gcc -E -dM -x c -I $incpath/include/uapi $input \ >> + |awk '$2 ~ "__NR" && $3 !~ "__NR3264_" { >> + sub("^#define __NR(3264)?_", ""); >> + print | "sort -k2 -n"}' \ >> + |create_table >> diff --git a/tools/perf/util/syscalltbl.c b/tools/perf/util/syscalltbl.c >> index 7c15dec6900d..349986f6e5f5 100644 >> --- a/tools/perf/util/syscalltbl.c >> +++ b/tools/perf/util/syscalltbl.c >> @@ -46,6 +46,10 @@ static const char *const *syscalltbl_native = syscalltbl_mips_n64; >> #include <asm/syscalls.c> >> const int syscalltbl_native_max_id = SYSCALLTBL_LOONGARCH_MAX_ID; >> static const char *const *syscalltbl_native = syscalltbl_loongarch; >> +#elif defined(__riscv) >> +#include <asm/syscalls.c> >> +const int syscalltbl_native_max_id = SYSCALLTBL_RISCV_MAX_ID; >> +static const char *const *syscalltbl_native = syscalltbl_riscv; >> #endif >> >> struct syscall { >> >> base-commit: c2ee9f594da826bea183ed14f2cc029c719bf4da >> -- >> 2.45.2 >> > _______________________________________________ > linux-riscv mailing list > linux-riscv@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-riscv
Hello, On Wed, Oct 30, 2024 at 08:31:35AM +0100, Alexandre Ghiti wrote: > Hi Bjorn, Namhyung, > > On 30/10/2024 01:37, Namhyung Kim wrote: > > Hello, > > > > On Thu, Oct 24, 2024 at 12:03:51PM -0700, Björn Töpel wrote: > > > From: Björn Töpel <bjorn@rivosinc.com> > > > > > > RISC-V does not currently support perf trace, since the system call > > > table is not generated. > > > > > > Perform the copy/paste exercise, wiring up RISC-V system call table > > > generation. > > Can anybody with RISC-V please test this? > > > So before this patch, I get: > > Error::5File /sys/kernel/tracing//events/raw_syscalls/sys_(enter|exit) not > found. > Hint: Perhaps this kernel misses some CONFIG_ setting to enable this > feature?. > > After applying this patch, I get a proper trace: > .... > > 7.435 ( 0.332 ms): ls/1307 openat(dfd: CWD, filename: 0xb36ef668, > flags: RDONLY|CLOEXEC) = 3 > 8.023 ( 0.454 ms): ls/1307 mmap(len: 23171, prot: READ, flags: PRIVATE, > fd: 3) = 0x7fffb36cd000 > 8.558 ( 0.065 ms): ls/1307 close(fd: > 3) = 0 > 8.850 ( 0.294 ms): ls/1307 openat(dfd: CWD, filename: 0xb36f9f80, > flags: RDONLY|CLOEXEC) = 3 > 9.223 ( 0.152 ms): ls/1307 read(fd: 3, buf: 0x7fffe27b3c20, count: 832) > > ... > > So you can add: > > Tested-by: Alexandre Ghiti <alexghiti@rivosinc.com> Thanks for your test! Namhyung
On Thu, 24 Oct 2024 12:03:51 -0700, Björn Töpel wrote: > RISC-V does not currently support perf trace, since the system call > table is not generated. > > Perform the copy/paste exercise, wiring up RISC-V system call table > generation. > > > [...] Applied to perf-tools-next, thanks! Best regards, Namhyung
diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config index 4ddb27a48eed..1d388e71e0cc 100644 --- a/tools/perf/Makefile.config +++ b/tools/perf/Makefile.config @@ -31,7 +31,7 @@ $(call detected_var,SRCARCH) ifneq ($(NO_SYSCALL_TABLE),1) NO_SYSCALL_TABLE := 1 - ifeq ($(SRCARCH),$(filter $(SRCARCH),x86 powerpc arm64 s390 mips loongarch)) + ifeq ($(SRCARCH),$(filter $(SRCARCH),x86 powerpc arm64 s390 mips loongarch riscv)) NO_SYSCALL_TABLE := 0 endif @@ -83,6 +83,10 @@ ifeq ($(ARCH),mips) LIBUNWIND_LIBS = -lunwind -lunwind-mips endif +ifeq ($(ARCH),riscv) + CFLAGS += -I$(OUTPUT)arch/riscv/include/generated +endif + # So far there's only x86 and arm libdw unwind support merged in perf. # Disable it on all other architectures in case libdw unwind # support is detected in system. Add supported architectures diff --git a/tools/perf/arch/riscv/Makefile b/tools/perf/arch/riscv/Makefile index 90c3c476a242..481da4518695 100644 --- a/tools/perf/arch/riscv/Makefile +++ b/tools/perf/arch/riscv/Makefile @@ -4,3 +4,25 @@ endif PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET := 1 PERF_HAVE_JITDUMP := 1 HAVE_KVM_STAT_SUPPORT := 1 + +# +# Syscall table generation for perf +# + +out := $(OUTPUT)arch/riscv/include/generated/asm +header := $(out)/syscalls.c +incpath := $(srctree)/tools +sysdef := $(srctree)/tools/arch/riscv/include/uapi/asm/unistd.h +sysprf := $(srctree)/tools/perf/arch/riscv/entry/syscalls/ +systbl := $(sysprf)/mksyscalltbl + +# Create output directory if not already present +$(shell [ -d '$(out)' ] || mkdir -p '$(out)') + +$(header): $(sysdef) $(systbl) + $(Q)$(SHELL) '$(systbl)' '$(CC)' '$(HOSTCC)' $(incpath) $(sysdef) > $@ + +clean:: + $(call QUIET_CLEAN, riscv) $(RM) $(header) + +archheaders: $(header) diff --git a/tools/perf/arch/riscv/entry/syscalls/mksyscalltbl b/tools/perf/arch/riscv/entry/syscalls/mksyscalltbl new file mode 100755 index 000000000000..c59f5e852b97 --- /dev/null +++ b/tools/perf/arch/riscv/entry/syscalls/mksyscalltbl @@ -0,0 +1,47 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# +# Generate system call table for perf. Derived from +# powerpc script. +# +# Copyright IBM Corp. 2017 +# Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com> +# Changed by: Ravi Bangoria <ravi.bangoria@linux.vnet.ibm.com> +# Changed by: Kim Phillips <kim.phillips@arm.com> +# Changed by: Björn Töpel <bjorn@rivosinc.com> + +gcc=$1 +hostcc=$2 +incpath=$3 +input=$4 + +if ! test -r $input; then + echo "Could not read input file" >&2 + exit 1 +fi + +create_sc_table() +{ + local sc nr max_nr + + while read sc nr; do + printf "%s\n" " [$nr] = \"$sc\"," + max_nr=$nr + done + + echo "#define SYSCALLTBL_RISCV_MAX_ID $max_nr" +} + +create_table() +{ + echo "#include \"$input\"" + echo "static const char *const syscalltbl_riscv[] = {" + create_sc_table + echo "};" +} + +$gcc -E -dM -x c -I $incpath/include/uapi $input \ + |awk '$2 ~ "__NR" && $3 !~ "__NR3264_" { + sub("^#define __NR(3264)?_", ""); + print | "sort -k2 -n"}' \ + |create_table diff --git a/tools/perf/util/syscalltbl.c b/tools/perf/util/syscalltbl.c index 7c15dec6900d..349986f6e5f5 100644 --- a/tools/perf/util/syscalltbl.c +++ b/tools/perf/util/syscalltbl.c @@ -46,6 +46,10 @@ static const char *const *syscalltbl_native = syscalltbl_mips_n64; #include <asm/syscalls.c> const int syscalltbl_native_max_id = SYSCALLTBL_LOONGARCH_MAX_ID; static const char *const *syscalltbl_native = syscalltbl_loongarch; +#elif defined(__riscv) +#include <asm/syscalls.c> +const int syscalltbl_native_max_id = SYSCALLTBL_RISCV_MAX_ID; +static const char *const *syscalltbl_native = syscalltbl_riscv; #endif struct syscall {