* [PATCH 0/3] ftrace fixes for PA-RISC
@ 2021-10-19 18:31 Sven Schnelle
2021-10-19 18:31 ` [PATCH 1/3] parisc: don't use dereference_function_descriptor() in trace stub Sven Schnelle
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Sven Schnelle @ 2021-10-19 18:31 UTC (permalink / raw)
To: Helge Deller; +Cc: linux-parisc
I tried to enable ftrace, but it didn't work. These are the required
fixes to make it work again.
Sven Schnelle (3):
parisc: don't use dereference_function_descriptor() in trace stub
parisc/ftrace: use static key to enable function graph
parisc: mark xchg functions notrace
arch/parisc/kernel/ftrace.c | 13 ++++++-------
arch/parisc/lib/bitops.c | 12 ++++++------
2 files changed, 12 insertions(+), 13 deletions(-)
--
2.33.0
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/3] parisc: don't use dereference_function_descriptor() in trace stub
2021-10-19 18:31 [PATCH 0/3] ftrace fixes for PA-RISC Sven Schnelle
@ 2021-10-19 18:31 ` Sven Schnelle
2021-10-19 18:31 ` [PATCH 2/3] parisc/ftrace: use static key to enable function graph Sven Schnelle
2021-10-19 18:31 ` [PATCH 3/3] parisc: mark xchg functions notrace Sven Schnelle
2 siblings, 0 replies; 4+ messages in thread
From: Sven Schnelle @ 2021-10-19 18:31 UTC (permalink / raw)
To: Helge Deller; +Cc: linux-parisc
dereference_function_descriptor() calls get_kernel_nofault(),
which itself might call into tracing. This leads to a deadlock.
Instead of reverting back to casts to compare whether there's
a trace function set, just always call the appropriate trace function.
With dynamic ftrace this function shouldn't be called at all
when ftrace is disabled. It adds a function call for the non-dynamic
case, but people concerned about the costs of ftrace should use
dynamic ftrace anyways.
Signed-off-by: Sven Schnelle <svens@stackframe.org>
---
arch/parisc/kernel/ftrace.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/arch/parisc/kernel/ftrace.c b/arch/parisc/kernel/ftrace.c
index 0a1e75af5382..f5f467ebf94c 100644
--- a/arch/parisc/kernel/ftrace.c
+++ b/arch/parisc/kernel/ftrace.c
@@ -58,10 +58,7 @@ void notrace __hot ftrace_function_trampoline(unsigned long parent,
#endif
extern struct ftrace_ops *function_trace_op;
- if (function_trace_op->flags & FTRACE_OPS_FL_ENABLED &&
- ftrace_trace_function != ftrace_stub)
- ftrace_trace_function(self_addr, parent,
- function_trace_op, fregs);
+ ftrace_trace_function(self_addr, parent, function_trace_op, fregs);
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
if (dereference_function_descriptor(ftrace_graph_return) !=
@@ -101,6 +98,7 @@ int __init ftrace_dyn_arch_init(void)
}
int ftrace_update_ftrace_func(ftrace_func_t func)
{
+ ftrace_trace_function = func;
return 0;
}
--
2.33.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/3] parisc/ftrace: use static key to enable function graph
2021-10-19 18:31 [PATCH 0/3] ftrace fixes for PA-RISC Sven Schnelle
2021-10-19 18:31 ` [PATCH 1/3] parisc: don't use dereference_function_descriptor() in trace stub Sven Schnelle
@ 2021-10-19 18:31 ` Sven Schnelle
2021-10-19 18:31 ` [PATCH 3/3] parisc: mark xchg functions notrace Sven Schnelle
2 siblings, 0 replies; 4+ messages in thread
From: Sven Schnelle @ 2021-10-19 18:31 UTC (permalink / raw)
To: Helge Deller; +Cc: linux-parisc
Instead of comparing function descriptors add a static branch
so the condition gets patched during runtime.
Signed-off-by: Sven Schnelle <svens@stackframe.org>
---
arch/parisc/kernel/ftrace.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/arch/parisc/kernel/ftrace.c b/arch/parisc/kernel/ftrace.c
index f5f467ebf94c..7a2de664242a 100644
--- a/arch/parisc/kernel/ftrace.c
+++ b/arch/parisc/kernel/ftrace.c
@@ -23,6 +23,7 @@
#define __hot __section(".text.hot")
+static DEFINE_STATIC_KEY_FALSE(ftrace_graph_enabled);
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
/*
* Hook the return address and push it in the stack of return addrs
@@ -61,9 +62,7 @@ void notrace __hot ftrace_function_trampoline(unsigned long parent,
ftrace_trace_function(self_addr, parent, function_trace_op, fregs);
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
- if (dereference_function_descriptor(ftrace_graph_return) !=
- dereference_function_descriptor(ftrace_stub) ||
- ftrace_graph_entry != ftrace_graph_entry_stub) {
+ if (static_branch_unlikely(&ftrace_graph_enabled)) {
unsigned long *parent_rp;
/* calculate pointer to %rp in stack */
@@ -81,11 +80,13 @@ void notrace __hot ftrace_function_trampoline(unsigned long parent,
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
int ftrace_enable_ftrace_graph_caller(void)
{
+ static_key_enable(&ftrace_graph_enabled.key);
return 0;
}
int ftrace_disable_ftrace_graph_caller(void)
{
+ static_key_disable(&ftrace_graph_enabled.key);
return 0;
}
#endif
--
2.33.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 3/3] parisc: mark xchg functions notrace
2021-10-19 18:31 [PATCH 0/3] ftrace fixes for PA-RISC Sven Schnelle
2021-10-19 18:31 ` [PATCH 1/3] parisc: don't use dereference_function_descriptor() in trace stub Sven Schnelle
2021-10-19 18:31 ` [PATCH 2/3] parisc/ftrace: use static key to enable function graph Sven Schnelle
@ 2021-10-19 18:31 ` Sven Schnelle
2 siblings, 0 replies; 4+ messages in thread
From: Sven Schnelle @ 2021-10-19 18:31 UTC (permalink / raw)
To: Helge Deller; +Cc: linux-parisc
tracing the xchg functions leads to recursion in various
places. Therefore mark the function as notrace.
Signed-off-by: Sven Schnelle <svens@stackframe.org>
---
arch/parisc/lib/bitops.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/arch/parisc/lib/bitops.c b/arch/parisc/lib/bitops.c
index 9ac683bf6ae7..36a314199074 100644
--- a/arch/parisc/lib/bitops.c
+++ b/arch/parisc/lib/bitops.c
@@ -18,7 +18,7 @@ arch_spinlock_t __atomic_hash[ATOMIC_HASH_SIZE] __lock_aligned = {
#endif
#ifdef CONFIG_64BIT
-unsigned long __xchg64(unsigned long x, volatile unsigned long *ptr)
+unsigned long notrace __xchg64(unsigned long x, volatile unsigned long *ptr)
{
unsigned long temp, flags;
@@ -30,7 +30,7 @@ unsigned long __xchg64(unsigned long x, volatile unsigned long *ptr)
}
#endif
-unsigned long __xchg32(int x, volatile int *ptr)
+unsigned long notrace __xchg32(int x, volatile int *ptr)
{
unsigned long flags;
long temp;
@@ -43,7 +43,7 @@ unsigned long __xchg32(int x, volatile int *ptr)
}
-unsigned long __xchg8(char x, volatile char *ptr)
+unsigned long notrace __xchg8(char x, volatile char *ptr)
{
unsigned long flags;
long temp;
@@ -56,7 +56,7 @@ unsigned long __xchg8(char x, volatile char *ptr)
}
-u64 __cmpxchg_u64(volatile u64 *ptr, u64 old, u64 new)
+u64 notrace __cmpxchg_u64(volatile u64 *ptr, u64 old, u64 new)
{
unsigned long flags;
u64 prev;
@@ -68,7 +68,7 @@ u64 __cmpxchg_u64(volatile u64 *ptr, u64 old, u64 new)
return prev;
}
-unsigned long __cmpxchg_u32(volatile unsigned int *ptr, unsigned int old, unsigned int new)
+unsigned long notrace __cmpxchg_u32(volatile unsigned int *ptr, unsigned int old, unsigned int new)
{
unsigned long flags;
unsigned int prev;
@@ -80,7 +80,7 @@ unsigned long __cmpxchg_u32(volatile unsigned int *ptr, unsigned int old, unsign
return (unsigned long)prev;
}
-u8 __cmpxchg_u8(volatile u8 *ptr, u8 old, u8 new)
+u8 notrace __cmpxchg_u8(volatile u8 *ptr, u8 old, u8 new)
{
unsigned long flags;
u8 prev;
--
2.33.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2021-10-19 19:18 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-10-19 18:31 [PATCH 0/3] ftrace fixes for PA-RISC Sven Schnelle
2021-10-19 18:31 ` [PATCH 1/3] parisc: don't use dereference_function_descriptor() in trace stub Sven Schnelle
2021-10-19 18:31 ` [PATCH 2/3] parisc/ftrace: use static key to enable function graph Sven Schnelle
2021-10-19 18:31 ` [PATCH 3/3] parisc: mark xchg functions notrace Sven Schnelle
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).