2023-05-11 09:52:37

by Song Shuai

[permalink] [raw]
Subject: [PATCH V10 0/4] riscv: Optimize function trace

Changes in v10:

- add Acked-by from Björn Töpel in patch 2 and patch 4
- replace `move` with `mv` in patch3
- prettify patch 2/4 with proper tabs

You can directly try it with:

https://github.com/sugarfillet/linux/tree/6.4-rc1-rv-ftrace-v10


This series optimizes function trace. The first 3 independent
patches has been picked in the V7 version of this series, the
subsequent version continues the following 4 patches:

select FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY [1] (patch 1)
==========================================================

In RISC-V, -fpatchable-function-entry option is used to support
dynamic ftrace in this commit afc76b8b8011 ("riscv: Using
PATCHABLE_FUNCTION_ENTRY instead of MCOUNT"). So recordmcount
don't have to be called to create the __mcount_loc section before
the vmlinux linking.

Here selects FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY to tell
Makefile not to run recordmcount.

Make function graph use ftrace directly [2] (patch 2)
========================================================

In RISC-V architecture, when we enable the ftrace_graph tracer on some
functions, the function tracings on other functions will suffer extra
graph tracing work. In essence, graph_ops isn't limited by its func_hash
due to the global ftrace_graph_[regs]_call label. That should be
corrected.

What inspires me is the commit 0c0593b45c9b ("x86/ftrace: Make function
graph use ftrace directly") that uses graph_ops::func function to
install return_hooker and makes the function called against its
func_hash.

Add WITH_DIRECT_CALLS support [3] (patch 3, 4)
==============================================

This series adds DYNAMIC_FTRACE_WITH_DIRECT_CALLS support for RISC-V.
SAMPLE_FTRACE_DIRECT and SAMPLE_FTRACE_DIRECT_MULTI are also included
here as the samples for testing DIRECT_CALLS related interface.

First, select the DYNAMIC_FTRACE_WITH_DIRECT_CALLS to provide
register_ftrace_direct[_multi] interfaces allowing user to register
the customed trampoline (direct_caller) as the mcount for one or
more target functions. And modify_ftrace_direct[_multi] are also
provided for modify direct_caller.

At the same time, the samples in ./samples/ftrace/ can be built
as kerenl module for testing these interfaces with SAMPLE_FTRACE_DIRECT
and SAMPLE_FTRACE_DIRECT_MULTI selected.

Second, to make the direct_caller and the other ftrace hooks
(eg. function/fgraph tracer, k[ret]probes) co-exist, a temporary
register
are nominated to store the address of direct_caller in
ftrace_regs_caller.
After the setting of the address direct_caller by direct_ops->func and
the RESTORE_REGS in ftrace_regs_caller, direct_caller will be jumped to
by the `jr` inst.

The series's old changes related these patches
==========================================

Changes in v9:
https://lore.kernel.org/linux-riscv/[email protected]/

1. add Acked-by from Björn Töpel in patch 1

2. rebase patch2/patch3 on Linux v6.4-rc1

- patch 2: to make the `SAVE_ABI_REGS` configurable, revert the
modification of mcount-dyn.S from commit (45b32b946a97 "riscv:
entry: Consolidate general regs saving/restoring")

- patch 3: to pass the trace_selftest, add the implement of
`ftrace_stub_direct_tramp` from commit (fee86a4ed536 "ftrace:
selftest: remove broken trace_direct_tramp") ; and fixup the context
conflict in Kconfig

Changes in v8:
https://lore.kernel.org/linux-riscv/[email protected]/
- Fix incorrect address values in the 4nd patch
- Rebased on v6.3-rc2

Changes in v7:
https://lore.kernel.org/linux-riscv/[email protected]/
- Fixup RESTORE_ABI_REGS by remove PT_T0(sp) overwrite.
- Add FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY [1]
- Fixup kconfig with HAVE_SAMPLE_FTRACE_DIRECT &
HAVE_SAMPLE_FTRACE_DIRECT_MULTI

Changes in v6:
https://lore.kernel.org/linux-riscv/[email protected]/
- Replace 8 with MCOUNT_INSN_SIZE
- Replace "REG_L a1, PT_RA(sp)" with "mv a1, ra"
- Add Evgenii Shatokhin comment

Changes in v5:
https://lore.kernel.org/linux-riscv/[email protected]/
- Sort Kconfig entries in alphabetical order.

Changes in v4:
https://lore.kernel.org/linux-riscv/[email protected]/
- Include [3] for maintenance. [Song Shuai]

Changes in V3:
https://lore.kernel.org/linux-riscv/[email protected]/
- Include [2] for maintenance. [Song Shuai]

[1]: https://lore.kernel.org/linux-riscv/CAAYs2=j3Eak9vU6xbAw0zPuoh00rh8v5C2U3fePkokZFibWs2g@mail.gmail.com/T/#t
[2]: https://lore.kernel.org/lkml/[email protected]/
[3]: https://lore.kernel.org/linux-riscv/[email protected]/

Song Shuai (4):
riscv: select FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY
riscv: ftrace: Add ftrace_graph_func
riscv: ftrace: Add DYNAMIC_FTRACE_WITH_DIRECT_CALLS support
samples: ftrace: Add riscv support for SAMPLE_FTRACE_DIRECT[_MULTI]

arch/riscv/Kconfig | 4 +
arch/riscv/include/asm/ftrace.h | 19 +-
arch/riscv/kernel/ftrace.c | 30 ++-
arch/riscv/kernel/mcount-dyn.S | 200 ++++++++++++++++----
samples/ftrace/ftrace-direct-modify.c | 34 ++++
samples/ftrace/ftrace-direct-multi-modify.c | 40 ++++
samples/ftrace/ftrace-direct-multi.c | 24 +++
samples/ftrace/ftrace-direct-too.c | 27 +++
samples/ftrace/ftrace-direct.c | 23 +++
9 files changed, 345 insertions(+), 56 deletions(-)

--
2.20.1



2023-05-11 10:11:38

by Song Shuai

[permalink] [raw]
Subject: [PATCH V10 4/4] samples: ftrace: Add riscv support for SAMPLE_FTRACE_DIRECT[_MULTI]

select HAVE_SAMPLE_FTRACE_DIRECT and HAVE_SAMPLE_FTRACE_DIRECT_MULTI
for ARCH_RV64I in arch/riscv/Kconfig. And add riscv asm code for
the ftrace-direct*.c files in samples/ftrace/.

Link: https://lore.kernel.org/linux-riscv/[email protected]/T/#ma13012560331c66b051b580b3ab4a04ba44455ec
Tested-by: Evgenii Shatokhin <[email protected]>
Signed-off-by: Song Shuai <[email protected]>
Tested-by: Guo Ren <[email protected]>
Signed-off-by: Guo Ren <[email protected]>
Acked-by: Björn Töpel <[email protected]>
---
arch/riscv/Kconfig | 2 ++
samples/ftrace/ftrace-direct-modify.c | 34 ++++++++++++++++++
samples/ftrace/ftrace-direct-multi-modify.c | 40 +++++++++++++++++++++
samples/ftrace/ftrace-direct-multi.c | 24 +++++++++++++
samples/ftrace/ftrace-direct-too.c | 27 ++++++++++++++
samples/ftrace/ftrace-direct.c | 23 ++++++++++++
6 files changed, 150 insertions(+)

diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index fdf0b219a02c..cb94ef086f0c 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -121,6 +121,8 @@ config RISCV
select HAVE_POSIX_CPU_TIMERS_TASK_WORK
select HAVE_REGS_AND_STACK_ACCESS_API
select HAVE_RSEQ
+ select HAVE_SAMPLE_FTRACE_DIRECT
+ select HAVE_SAMPLE_FTRACE_DIRECT_MULTI
select HAVE_STACKPROTECTOR
select HAVE_SYSCALL_TRACEPOINTS
select IRQ_DOMAIN
diff --git a/samples/ftrace/ftrace-direct-modify.c b/samples/ftrace/ftrace-direct-modify.c
index 06d889149012..e90ca7b68314 100644
--- a/samples/ftrace/ftrace-direct-modify.c
+++ b/samples/ftrace/ftrace-direct-modify.c
@@ -22,6 +22,40 @@ extern void my_tramp2(void *);

static unsigned long my_ip = (unsigned long)schedule;

+#ifdef CONFIG_RISCV
+
+asm (
+" .pushsection .text, \"ax\", @progbits\n"
+" .type my_tramp1, @function\n"
+" .globl my_tramp1\n"
+" my_tramp1:\n"
+" addi sp,sp,-16\n"
+" sd t0,0(sp)\n"
+" sd ra,8(sp)\n"
+" call my_direct_func1\n"
+" ld t0,0(sp)\n"
+" ld ra,8(sp)\n"
+" addi sp,sp,16\n"
+" jr t0\n"
+" .size my_tramp1, .-my_tramp1\n"
+
+" .type my_tramp2, @function\n"
+" .globl my_tramp2\n"
+" my_tramp2:\n"
+" addi sp,sp,-16\n"
+" sd t0,0(sp)\n"
+" sd ra,8(sp)\n"
+" call my_direct_func2\n"
+" ld t0,0(sp)\n"
+" ld ra,8(sp)\n"
+" addi sp,sp,16\n"
+" jr t0\n"
+" .size my_tramp2, .-my_tramp2\n"
+" .popsection\n"
+);
+
+#endif /* CONFIG_RISCV */
+
#ifdef CONFIG_X86_64

#include <asm/ibt.h>
diff --git a/samples/ftrace/ftrace-direct-multi-modify.c b/samples/ftrace/ftrace-direct-multi-modify.c
index 62f6b681999e..5a81af7b3af3 100644
--- a/samples/ftrace/ftrace-direct-multi-modify.c
+++ b/samples/ftrace/ftrace-direct-multi-modify.c
@@ -20,6 +20,46 @@ void my_direct_func2(unsigned long ip)
extern void my_tramp1(void *);
extern void my_tramp2(void *);

+#ifdef CONFIG_RISCV
+
+asm (
+" .pushsection .text, \"ax\", @progbits\n"
+" .type my_tramp1, @function\n"
+" .globl my_tramp1\n"
+" my_tramp1:\n"
+" addi sp,sp,-24\n"
+" sd a0,0(sp)\n"
+" sd t0,8(sp)\n"
+" sd ra,16(sp)\n"
+" mv a0,t0\n"
+" call my_direct_func1\n"
+" ld a0,0(sp)\n"
+" ld t0,8(sp)\n"
+" ld ra,16(sp)\n"
+" addi sp,sp,24\n"
+" jr t0\n"
+" .size my_tramp1, .-my_tramp1\n"
+
+" .type my_tramp2, @function\n"
+" .globl my_tramp2\n"
+" my_tramp2:\n"
+" addi sp,sp,-24\n"
+" sd a0,0(sp)\n"
+" sd t0,8(sp)\n"
+" sd ra,16(sp)\n"
+" mv a0,t0\n"
+" call my_direct_func2\n"
+" ld a0,0(sp)\n"
+" ld t0,8(sp)\n"
+" ld ra,16(sp)\n"
+" addi sp,sp,24\n"
+" jr t0\n"
+" .size my_tramp2, .-my_tramp2\n"
+" .popsection\n"
+);
+
+#endif /* CONFIG_RISCV */
+
#ifdef CONFIG_X86_64

#include <asm/ibt.h>
diff --git a/samples/ftrace/ftrace-direct-multi.c b/samples/ftrace/ftrace-direct-multi.c
index 5482cf616b43..0e9bb94edade 100644
--- a/samples/ftrace/ftrace-direct-multi.c
+++ b/samples/ftrace/ftrace-direct-multi.c
@@ -15,6 +15,30 @@ void my_direct_func(unsigned long ip)

extern void my_tramp(void *);

+#ifdef CONFIG_RISCV
+
+asm (
+" .pushsection .text, \"ax\", @progbits\n"
+" .type my_tramp, @function\n"
+" .globl my_tramp\n"
+" my_tramp:\n"
+" addi sp,sp,-24\n"
+" sd a0,0(sp)\n"
+" sd t0,8(sp)\n"
+" sd ra,16(sp)\n"
+" mv a0,t0\n"
+" call my_direct_func\n"
+" ld a0,0(sp)\n"
+" ld t0,8(sp)\n"
+" ld ra,16(sp)\n"
+" addi sp,sp,24\n"
+" jr t0\n"
+" .size my_tramp, .-my_tramp\n"
+" .popsection\n"
+);
+
+#endif /* CONFIG_RISCV */
+
#ifdef CONFIG_X86_64

#include <asm/ibt.h>
diff --git a/samples/ftrace/ftrace-direct-too.c b/samples/ftrace/ftrace-direct-too.c
index a05bc2cc2261..5c319db48af2 100644
--- a/samples/ftrace/ftrace-direct-too.c
+++ b/samples/ftrace/ftrace-direct-too.c
@@ -17,6 +17,33 @@ void my_direct_func(struct vm_area_struct *vma,

extern void my_tramp(void *);

+#ifdef CONFIG_RISCV
+
+asm (
+" .pushsection .text, \"ax\", @progbits\n"
+" .type my_tramp, @function\n"
+" .globl my_tramp\n"
+" my_tramp:\n"
+" addi sp,sp,-40\n"
+" sd a0,0(sp)\n"
+" sd a1,8(sp)\n"
+" sd a2,16(sp)\n"
+" sd t0,24(sp)\n"
+" sd ra,32(sp)\n"
+" call my_direct_func\n"
+" ld a0,0(sp)\n"
+" ld a1,8(sp)\n"
+" ld a2,16(sp)\n"
+" ld t0,24(sp)\n"
+" ld ra,32(sp)\n"
+" addi sp,sp,40\n"
+" jr t0\n"
+" .size my_tramp, .-my_tramp\n"
+" .popsection\n"
+);
+
+#endif /* CONFIG_RISCV */
+
#ifdef CONFIG_X86_64

#include <asm/ibt.h>
diff --git a/samples/ftrace/ftrace-direct.c b/samples/ftrace/ftrace-direct.c
index 06879bbd3399..ca95506b0350 100644
--- a/samples/ftrace/ftrace-direct.c
+++ b/samples/ftrace/ftrace-direct.c
@@ -14,6 +14,29 @@ void my_direct_func(struct task_struct *p)

extern void my_tramp(void *);

+#ifdef CONFIG_RISCV
+
+asm (
+" .pushsection .text, \"ax\", @progbits\n"
+" .type my_tramp, @function\n"
+" .globl my_tramp\n"
+" my_tramp:\n"
+" addi sp,sp,-24\n"
+" sd a0,0(sp)\n"
+" sd t0,8(sp)\n"
+" sd ra,16(sp)\n"
+" call my_direct_func\n"
+" ld a0,0(sp)\n"
+" ld t0,8(sp)\n"
+" ld ra,16(sp)\n"
+" addi sp,sp,24\n"
+" jr t0\n"
+" .size my_tramp, .-my_tramp\n"
+" .popsection\n"
+);
+
+#endif /* CONFIG_RISCV */
+
#ifdef CONFIG_X86_64

#include <asm/ibt.h>
--
2.20.1


2023-05-15 18:57:21

by Steven Rostedt

[permalink] [raw]
Subject: Re: [PATCH V10 4/4] samples: ftrace: Add riscv support for SAMPLE_FTRACE_DIRECT[_MULTI]

On Thu, 11 May 2023 17:32:34 +0800
Song Shuai <[email protected]> wrote:

> select HAVE_SAMPLE_FTRACE_DIRECT and HAVE_SAMPLE_FTRACE_DIRECT_MULTI
> for ARCH_RV64I in arch/riscv/Kconfig. And add riscv asm code for
> the ftrace-direct*.c files in samples/ftrace/.
>
> Link: https://lore.kernel.org/linux-riscv/[email protected]/T/#ma13012560331c66b051b580b3ab4a04ba44455ec
> Tested-by: Evgenii Shatokhin <[email protected]>
> Signed-off-by: Song Shuai <[email protected]>
> Tested-by: Guo Ren <[email protected]>
> Signed-off-by: Guo Ren <[email protected]>
> Acked-by: Björn Töpel <[email protected]>
> ---
> arch/riscv/Kconfig | 2 ++
> samples/ftrace/ftrace-direct-modify.c | 34 ++++++++++++++++++
> samples/ftrace/ftrace-direct-multi-modify.c | 40 +++++++++++++++++++++
> samples/ftrace/ftrace-direct-multi.c | 24 +++++++++++++
> samples/ftrace/ftrace-direct-too.c | 27 ++++++++++++++
> samples/ftrace/ftrace-direct.c | 23 ++++++++++++
> 6 files changed, 150 insertions(+)

I acked v8 (which you will need my ack to get these in). Unless this patch
changed since v8, you should include my ack in further versions.

Or you may be waiting longer for its acceptance.

If the patch did change, please acknowledge that in the next version (or
this one if it did change), asking me to ack it again.

-- Steve

2023-05-15 19:12:36

by Steven Rostedt

[permalink] [raw]
Subject: Re: [PATCH V10 4/4] samples: ftrace: Add riscv support for SAMPLE_FTRACE_DIRECT[_MULTI]

On Mon, 15 May 2023 14:37:00 -0400
Steven Rostedt <[email protected]> wrote:

> On Thu, 11 May 2023 17:32:34 +0800
> Song Shuai <[email protected]> wrote:
>
> > select HAVE_SAMPLE_FTRACE_DIRECT and HAVE_SAMPLE_FTRACE_DIRECT_MULTI
> > for ARCH_RV64I in arch/riscv/Kconfig. And add riscv asm code for
> > the ftrace-direct*.c files in samples/ftrace/.
> >
> > Link: https://lore.kernel.org/linux-riscv/[email protected]/T/#ma13012560331c66b051b580b3ab4a04ba44455ec
> > Tested-by: Evgenii Shatokhin <[email protected]>
> > Signed-off-by: Song Shuai <[email protected]>
> > Tested-by: Guo Ren <[email protected]>
> > Signed-off-by: Guo Ren <[email protected]>
> > Acked-by: Björn Töpel <[email protected]>
> > ---
> > arch/riscv/Kconfig | 2 ++
> > samples/ftrace/ftrace-direct-modify.c | 34 ++++++++++++++++++
> > samples/ftrace/ftrace-direct-multi-modify.c | 40 +++++++++++++++++++++
> > samples/ftrace/ftrace-direct-multi.c | 24 +++++++++++++
> > samples/ftrace/ftrace-direct-too.c | 27 ++++++++++++++
> > samples/ftrace/ftrace-direct.c | 23 ++++++++++++
> > 6 files changed, 150 insertions(+)
>
> I acked v8 (which you will need my ack to get these in). Unless this patch
> changed since v8, you should include my ack in further versions.
>
> Or you may be waiting longer for its acceptance.
>
> If the patch did change, please acknowledge that in the next version (or
> this one if it did change), asking me to ack it again.
>

Nevermind, I'm an idiot (and my inbox is not in date order). You sent this
*after* I acked v8, when I should have been acking this one. ;-)

Sorry about that! I've been traveling and my inbox is a mess :-p

-- Steve

2023-05-16 09:46:36

by Song Shuai

[permalink] [raw]
Subject: Re: [PATCH V10 4/4] samples: ftrace: Add riscv support for SAMPLE_FTRACE_DIRECT[_MULTI]

Steven Rostedt <[email protected]> 于2023年5月15日周一 18:37写道:
>
> On Thu, 11 May 2023 17:32:34 +0800
> Song Shuai <[email protected]> wrote:
>
> > select HAVE_SAMPLE_FTRACE_DIRECT and HAVE_SAMPLE_FTRACE_DIRECT_MULTI
> > for ARCH_RV64I in arch/riscv/Kconfig. And add riscv asm code for
> > the ftrace-direct*.c files in samples/ftrace/.
> >
> > Link: https://lore.kernel.org/linux-riscv/[email protected]/T/#ma13012560331c66b051b580b3ab4a04ba44455ec
> > Tested-by: Evgenii Shatokhin <[email protected]>
> > Signed-off-by: Song Shuai <[email protected]>
> > Tested-by: Guo Ren <[email protected]>
> > Signed-off-by: Guo Ren <[email protected]>
> > Acked-by: Björn Töpel <[email protected]>
> > ---
> > arch/riscv/Kconfig | 2 ++
> > samples/ftrace/ftrace-direct-modify.c | 34 ++++++++++++++++++
> > samples/ftrace/ftrace-direct-multi-modify.c | 40 +++++++++++++++++++++
> > samples/ftrace/ftrace-direct-multi.c | 24 +++++++++++++
> > samples/ftrace/ftrace-direct-too.c | 27 ++++++++++++++
> > samples/ftrace/ftrace-direct.c | 23 ++++++++++++
> > 6 files changed, 150 insertions(+)
>
> I acked v8 (which you will need my ack to get these in). Unless this patch
> changed since v8, you should include my ack in further versions.
>
There were no changes in this patch, except for a few tab pretties since v8.
your Acked-by will still be included.
> Or you may be waiting longer for its acceptance.
>
> If the patch did change, please acknowledge that in the next version (or
> this one if it did change), asking me to ack it again.
>
> -- Steve



--
Thanks,
Song

2023-05-16 10:08:43

by Song Shuai

[permalink] [raw]
Subject: Re: [PATCH V10 0/4] riscv: Optimize function trace

Song Shuai <[email protected]> 于2023年5月11日周四 09:32写道:

>
> Changes in v10:
>
> - add Acked-by from Björn Töpel in patch 2 and patch 4
> - replace `move` with `mv` in patch3
> - prettify patch 2/4 with proper tabs
>
> You can directly try it with:
>
> https://github.com/sugarfillet/linux/tree/6.4-rc1-rv-ftrace-v10
>
>
Hi, plamer:
This series is ready for its acceptance, you can pick it up.

> This series optimizes function trace. The first 3 independent
> patches has been picked in the V7 version of this series, the
> subsequent version continues the following 4 patches:
>
> select FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY [1] (patch 1)
> ==========================================================
>
> In RISC-V, -fpatchable-function-entry option is used to support
> dynamic ftrace in this commit afc76b8b8011 ("riscv: Using
> PATCHABLE_FUNCTION_ENTRY instead of MCOUNT"). So recordmcount
> don't have to be called to create the __mcount_loc section before
> the vmlinux linking.
>
> Here selects FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY to tell
> Makefile not to run recordmcount.
>
> Make function graph use ftrace directly [2] (patch 2)
> ========================================================
>
> In RISC-V architecture, when we enable the ftrace_graph tracer on some
> functions, the function tracings on other functions will suffer extra
> graph tracing work. In essence, graph_ops isn't limited by its func_hash
> due to the global ftrace_graph_[regs]_call label. That should be
> corrected.
>
> What inspires me is the commit 0c0593b45c9b ("x86/ftrace: Make function
> graph use ftrace directly") that uses graph_ops::func function to
> install return_hooker and makes the function called against its
> func_hash.
>
> Add WITH_DIRECT_CALLS support [3] (patch 3, 4)
> ==============================================
>
> This series adds DYNAMIC_FTRACE_WITH_DIRECT_CALLS support for RISC-V.
> SAMPLE_FTRACE_DIRECT and SAMPLE_FTRACE_DIRECT_MULTI are also included
> here as the samples for testing DIRECT_CALLS related interface.
>
> First, select the DYNAMIC_FTRACE_WITH_DIRECT_CALLS to provide
> register_ftrace_direct[_multi] interfaces allowing user to register
> the customed trampoline (direct_caller) as the mcount for one or
> more target functions. And modify_ftrace_direct[_multi] are also
> provided for modify direct_caller.
>
> At the same time, the samples in ./samples/ftrace/ can be built
> as kerenl module for testing these interfaces with SAMPLE_FTRACE_DIRECT
> and SAMPLE_FTRACE_DIRECT_MULTI selected.
>
> Second, to make the direct_caller and the other ftrace hooks
> (eg. function/fgraph tracer, k[ret]probes) co-exist, a temporary
> register
> are nominated to store the address of direct_caller in
> ftrace_regs_caller.
> After the setting of the address direct_caller by direct_ops->func and
> the RESTORE_REGS in ftrace_regs_caller, direct_caller will be jumped to
> by the `jr` inst.
>
> The series's old changes related these patches
> ==========================================
>
> Changes in v9:
> https://lore.kernel.org/linux-riscv/[email protected]/
>
> 1. add Acked-by from Björn Töpel in patch 1
>
> 2. rebase patch2/patch3 on Linux v6.4-rc1
>
> - patch 2: to make the `SAVE_ABI_REGS` configurable, revert the
> modification of mcount-dyn.S from commit (45b32b946a97 "riscv:
> entry: Consolidate general regs saving/restoring")
>
> - patch 3: to pass the trace_selftest, add the implement of
> `ftrace_stub_direct_tramp` from commit (fee86a4ed536 "ftrace:
> selftest: remove broken trace_direct_tramp") ; and fixup the context
> conflict in Kconfig
>
> Changes in v8:
> https://lore.kernel.org/linux-riscv/[email protected]/
> - Fix incorrect address values in the 4nd patch
> - Rebased on v6.3-rc2
>
> Changes in v7:
> https://lore.kernel.org/linux-riscv/[email protected]/
> - Fixup RESTORE_ABI_REGS by remove PT_T0(sp) overwrite.
> - Add FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY [1]
> - Fixup kconfig with HAVE_SAMPLE_FTRACE_DIRECT &
> HAVE_SAMPLE_FTRACE_DIRECT_MULTI
>
> Changes in v6:
> https://lore.kernel.org/linux-riscv/[email protected]/
> - Replace 8 with MCOUNT_INSN_SIZE
> - Replace "REG_L a1, PT_RA(sp)" with "mv a1, ra"
> - Add Evgenii Shatokhin comment
>
> Changes in v5:
> https://lore.kernel.org/linux-riscv/[email protected]/
> - Sort Kconfig entries in alphabetical order.
>
> Changes in v4:
> https://lore.kernel.org/linux-riscv/[email protected]/
> - Include [3] for maintenance. [Song Shuai]
>
> Changes in V3:
> https://lore.kernel.org/linux-riscv/[email protected]/
> - Include [2] for maintenance. [Song Shuai]
>
> [1]: https://lore.kernel.org/linux-riscv/CAAYs2=j3Eak9vU6xbAw0zPuoh00rh8v5C2U3fePkokZFibWs2g@mail.gmail.com/T/#t
> [2]: https://lore.kernel.org/lkml/[email protected]/
> [3]: https://lore.kernel.org/linux-riscv/[email protected]/
>
> Song Shuai (4):
> riscv: select FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY
> riscv: ftrace: Add ftrace_graph_func
> riscv: ftrace: Add DYNAMIC_FTRACE_WITH_DIRECT_CALLS support
> samples: ftrace: Add riscv support for SAMPLE_FTRACE_DIRECT[_MULTI]
>
> arch/riscv/Kconfig | 4 +
> arch/riscv/include/asm/ftrace.h | 19 +-
> arch/riscv/kernel/ftrace.c | 30 ++-
> arch/riscv/kernel/mcount-dyn.S | 200 ++++++++++++++++----
> samples/ftrace/ftrace-direct-modify.c | 34 ++++
> samples/ftrace/ftrace-direct-multi-modify.c | 40 ++++
> samples/ftrace/ftrace-direct-multi.c | 24 +++
> samples/ftrace/ftrace-direct-too.c | 27 +++
> samples/ftrace/ftrace-direct.c | 23 +++
> 9 files changed, 345 insertions(+), 56 deletions(-)
>
> --
> 2.20.1
>


--
Thanks,
Song

2023-05-17 11:31:31

by Song Shuai

[permalink] [raw]
Subject: Re: [PATCH V10 0/4] riscv: Optimize function trace

Song Shuai <[email protected]> 于2023年5月16日周二 09:50写道:
>
> Song Shuai <[email protected]> 于2023年5月11日周四 09:32写道:
>
> >
> > Changes in v10:
> >
> > - add Acked-by from Björn Töpel in patch 2 and patch 4
> > - replace `move` with `mv` in patch3
> > - prettify patch 2/4 with proper tabs
> >
> > You can directly try it with:
> >
> > https://github.com/sugarfillet/linux/tree/6.4-rc1-rv-ftrace-v10
> >
> >
> Hi, plamer:
> This series is ready for its acceptance, you can pick it up.
>
Apologize for the typo in your name, Palmer.

> > This series optimizes function trace. The first 3 independent
> > patches has been picked in the V7 version of this series, the
> > subsequent version continues the following 4 patches:
> >
> > select FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY [1] (patch 1)
> > ==========================================================
> >
> > In RISC-V, -fpatchable-function-entry option is used to support
> > dynamic ftrace in this commit afc76b8b8011 ("riscv: Using
> > PATCHABLE_FUNCTION_ENTRY instead of MCOUNT"). So recordmcount
> > don't have to be called to create the __mcount_loc section before
> > the vmlinux linking.
> >
> > Here selects FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY to tell
> > Makefile not to run recordmcount.
> >
> > Make function graph use ftrace directly [2] (patch 2)
> > ========================================================
> >
> > In RISC-V architecture, when we enable the ftrace_graph tracer on some
> > functions, the function tracings on other functions will suffer extra
> > graph tracing work. In essence, graph_ops isn't limited by its func_hash
> > due to the global ftrace_graph_[regs]_call label. That should be
> > corrected.
> >
> > What inspires me is the commit 0c0593b45c9b ("x86/ftrace: Make function
> > graph use ftrace directly") that uses graph_ops::func function to
> > install return_hooker and makes the function called against its
> > func_hash.
> >
> > Add WITH_DIRECT_CALLS support [3] (patch 3, 4)
> > ==============================================
> >
> > This series adds DYNAMIC_FTRACE_WITH_DIRECT_CALLS support for RISC-V.
> > SAMPLE_FTRACE_DIRECT and SAMPLE_FTRACE_DIRECT_MULTI are also included
> > here as the samples for testing DIRECT_CALLS related interface.
> >
> > First, select the DYNAMIC_FTRACE_WITH_DIRECT_CALLS to provide
> > register_ftrace_direct[_multi] interfaces allowing user to register
> > the customed trampoline (direct_caller) as the mcount for one or
> > more target functions. And modify_ftrace_direct[_multi] are also
> > provided for modify direct_caller.
> >
> > At the same time, the samples in ./samples/ftrace/ can be built
> > as kerenl module for testing these interfaces with SAMPLE_FTRACE_DIRECT
> > and SAMPLE_FTRACE_DIRECT_MULTI selected.
> >
> > Second, to make the direct_caller and the other ftrace hooks
> > (eg. function/fgraph tracer, k[ret]probes) co-exist, a temporary
> > register
> > are nominated to store the address of direct_caller in
> > ftrace_regs_caller.
> > After the setting of the address direct_caller by direct_ops->func and
> > the RESTORE_REGS in ftrace_regs_caller, direct_caller will be jumped to
> > by the `jr` inst.
> >
> > The series's old changes related these patches
> > ==========================================
> >
> > Changes in v9:
> > https://lore.kernel.org/linux-riscv/[email protected]/
> >
> > 1. add Acked-by from Björn Töpel in patch 1
> >
> > 2. rebase patch2/patch3 on Linux v6.4-rc1
> >
> > - patch 2: to make the `SAVE_ABI_REGS` configurable, revert the
> > modification of mcount-dyn.S from commit (45b32b946a97 "riscv:
> > entry: Consolidate general regs saving/restoring")
> >
> > - patch 3: to pass the trace_selftest, add the implement of
> > `ftrace_stub_direct_tramp` from commit (fee86a4ed536 "ftrace:
> > selftest: remove broken trace_direct_tramp") ; and fixup the context
> > conflict in Kconfig
> >
> > Changes in v8:
> > https://lore.kernel.org/linux-riscv/[email protected]/
> > - Fix incorrect address values in the 4nd patch
> > - Rebased on v6.3-rc2
> >
> > Changes in v7:
> > https://lore.kernel.org/linux-riscv/[email protected]/
> > - Fixup RESTORE_ABI_REGS by remove PT_T0(sp) overwrite.
> > - Add FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY [1]
> > - Fixup kconfig with HAVE_SAMPLE_FTRACE_DIRECT &
> > HAVE_SAMPLE_FTRACE_DIRECT_MULTI
> >
> > Changes in v6:
> > https://lore.kernel.org/linux-riscv/[email protected]/
> > - Replace 8 with MCOUNT_INSN_SIZE
> > - Replace "REG_L a1, PT_RA(sp)" with "mv a1, ra"
> > - Add Evgenii Shatokhin comment
> >
> > Changes in v5:
> > https://lore.kernel.org/linux-riscv/[email protected]/
> > - Sort Kconfig entries in alphabetical order.
> >
> > Changes in v4:
> > https://lore.kernel.org/linux-riscv/[email protected]/
> > - Include [3] for maintenance. [Song Shuai]
> >
> > Changes in V3:
> > https://lore.kernel.org/linux-riscv/[email protected]/
> > - Include [2] for maintenance. [Song Shuai]
> >
> > [1]: https://lore.kernel.org/linux-riscv/CAAYs2=j3Eak9vU6xbAw0zPuoh00rh8v5C2U3fePkokZFibWs2g@mail.gmail.com/T/#t
> > [2]: https://lore.kernel.org/lkml/[email protected]/
> > [3]: https://lore.kernel.org/linux-riscv/[email protected]/
> >
> > Song Shuai (4):
> > riscv: select FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY
> > riscv: ftrace: Add ftrace_graph_func
> > riscv: ftrace: Add DYNAMIC_FTRACE_WITH_DIRECT_CALLS support
> > samples: ftrace: Add riscv support for SAMPLE_FTRACE_DIRECT[_MULTI]
> >
> > arch/riscv/Kconfig | 4 +
> > arch/riscv/include/asm/ftrace.h | 19 +-
> > arch/riscv/kernel/ftrace.c | 30 ++-
> > arch/riscv/kernel/mcount-dyn.S | 200 ++++++++++++++++----
> > samples/ftrace/ftrace-direct-modify.c | 34 ++++
> > samples/ftrace/ftrace-direct-multi-modify.c | 40 ++++
> > samples/ftrace/ftrace-direct-multi.c | 24 +++
> > samples/ftrace/ftrace-direct-too.c | 27 +++
> > samples/ftrace/ftrace-direct.c | 23 +++
> > 9 files changed, 345 insertions(+), 56 deletions(-)
> >
> > --
> > 2.20.1
> >
>
>
> --
> Thanks,
> Song



--
Thanks,
Song

2023-06-25 20:51:25

by Palmer Dabbelt

[permalink] [raw]
Subject: Re: [PATCH V10 4/4] samples: ftrace: Add riscv support for SAMPLE_FTRACE_DIRECT[_MULTI]

On Tue, 16 May 2023 02:37:53 PDT (-0700), [email protected] wrote:
> Steven Rostedt <[email protected]> 于2023年5月15日周一 18:37写道:
>>
>> On Thu, 11 May 2023 17:32:34 +0800
>> Song Shuai <[email protected]> wrote:
>>
>> > select HAVE_SAMPLE_FTRACE_DIRECT and HAVE_SAMPLE_FTRACE_DIRECT_MULTI
>> > for ARCH_RV64I in arch/riscv/Kconfig. And add riscv asm code for
>> > the ftrace-direct*.c files in samples/ftrace/.
>> >
>> > Link: https://lore.kernel.org/linux-riscv/[email protected]/T/#ma13012560331c66b051b580b3ab4a04ba44455ec
>> > Tested-by: Evgenii Shatokhin <[email protected]>
>> > Signed-off-by: Song Shuai <[email protected]>
>> > Tested-by: Guo Ren <[email protected]>
>> > Signed-off-by: Guo Ren <[email protected]>
>> > Acked-by: Björn Töpel <[email protected]>
>> > ---
>> > arch/riscv/Kconfig | 2 ++
>> > samples/ftrace/ftrace-direct-modify.c | 34 ++++++++++++++++++
>> > samples/ftrace/ftrace-direct-multi-modify.c | 40 +++++++++++++++++++++
>> > samples/ftrace/ftrace-direct-multi.c | 24 +++++++++++++
>> > samples/ftrace/ftrace-direct-too.c | 27 ++++++++++++++
>> > samples/ftrace/ftrace-direct.c | 23 ++++++++++++
>> > 6 files changed, 150 insertions(+)
>>
>> I acked v8 (which you will need my ack to get these in). Unless this patch
>> changed since v8, you should include my ack in further versions.
>>
> There were no changes in this patch, except for a few tab pretties since v8.
> your Acked-by will still be included.
>> Or you may be waiting longer for its acceptance.
>>
>> If the patch did change, please acknowledge that in the next version (or
>> this one if it did change), asking me to ack it again.

The samples fail to build on rv32, they're rv64-specific. I think
something like this should do it

diff --git a/samples/ftrace/ftrace-direct-too.c b/samples/ftrace/ftrace-direct-too.c
index 5c319db48af2..3707c447a42d 100644
--- a/samples/ftrace/ftrace-direct-too.c
+++ b/samples/ftrace/ftrace-direct-too.c
@@ -24,19 +24,19 @@ asm (
" .type my_tramp, @function\n"
" .globl my_tramp\n"
" my_tramp:\n"
-" addi sp,sp,-40\n"
-" sd a0,0(sp)\n"
-" sd a1,8(sp)\n"
-" sd a2,16(sp)\n"
-" sd t0,24(sp)\n"
-" sd ra,32(sp)\n"
+" addi sp,sp,-8*SZREG\n"
+" REG_S a0,0*SZREG(sp)\n"
+" REG_S a1,1*SZREG(sp)\n"
+" REG_S a2,2*SZREG(sp)\n"
+" REG_S t0,3*SZREG(sp)\n"
+" REG_S ra,4*SZREG(sp)\n"
" call my_direct_func\n"
-" ld a0,0(sp)\n"
-" ld a1,8(sp)\n"
-" ld a2,16(sp)\n"
-" ld t0,24(sp)\n"
-" ld ra,32(sp)\n"
-" addi sp,sp,40\n"
+" REG_L a0,0*SZREG(sp)\n"
+" REG_L a1,1*SZREG(sp)\n"
+" REG_L a2,2*SZREG(sp)\n"
+" REG_L t0,3*SZREG(sp)\n"
+" REG_L ra,4*SZREG(sp)\n"
+" addi sp,sp,8*SZREG\n"
" jr t0\n"
" .size my_tramp, .-my_tramp\n"
" .popsection\n"

probably for all of them. Do you mind sending a v11 with that fixed?

>>
>> -- Steve
>
>
>
> --
> Thanks,
> Song