On Tue, 2010-03-09 at 19:04 +0100, Jan Kiszka wrote:
> The following changes since commit 7c90959b7e4eb5ef8a775ec17005c23f30daade1:
> Philippe Gerum (1):
> ipipe: introduce 3-level IRQ pending map
>
> are available in the git repository at:
>
> git://git.kiszka.org/ipipe-2.6 queues/2.6.32-noarch
>
> These patches address various possible configuration errors around
> ftrace that can cause hard crashes over I-pipe kernels. Moreover, one
> patch enables the safe use of ftrace's PID filtering that comes for free
> for the I-pipe tracer now.
>
> The patches also apply on 2.6.33-noarch but were only tested on
> 2.6.32-x86.
>
>
> Jan Kiszka (5):
> Use ipipe_safe_current in ftrace_pid_func
> Prevent unsafe ftrace usage over I-pipe
This one looks pretty ugly. I would rather define a entry point for
registering ftrace hooks allowed to run in NMI context, and deny the
regular unsafe registration routine when the I-pipe tracer is enabled.
E.g.
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 872f2fe..c4ac9d5 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -2992,7 +2992,7 @@ void ftrace_kill(void)
* with "notrace", otherwise it will go into a
* recursive loop.
*/
-int register_ftrace_function(struct ftrace_ops *ops)
+static int _register_ftrace_function(struct ftrace_ops *ops)
{
int ret;
@@ -3008,6 +3008,23 @@ int register_ftrace_function(struct ftrace_ops *ops)
return ret;
}
+#ifdef CONFIG_IPIPE_TRACE
+int register_ftrace_function(struct ftrace_ops *ops)
+{
+ return -EINVAL;
+}
+
+int register_ftrace_nmi_function(struct ftrace_ops *ops)
+{
+ return _register_ftrace_function(ops);
+}
+#else
+int register_ftrace_function(struct ftrace_ops *ops)
+{
+ return _register_ftrace_function(ops);
+}
+#endif
+
diff --git a/kernel/ipipe/tracer.c b/kernel/ipipe/tracer.c
index 0a37201..e408cab 100644
--- a/kernel/ipipe/tracer.c
+++ b/kernel/ipipe/tracer.c
@@ -1331,7 +1331,7 @@ static int __ipipe_wr_enable(struct file *file, const
char __user *buffer,
if (!val)
unregister_ftrace_function(&ipipe_trace_ops);
} else if (val)
- register_ftrace_function(&ipipe_trace_ops);
+ register_ftrace_nmi_function(&ipipe_trace_ops);
ipipe_trace_enable = val;
@@ -1405,7 +1405,7 @@ void __init __ipipe_init_tracer(void)
#ifdef CONFIG_IPIPE_TRACE_ENABLE
ipipe_trace_enable = 1;
#ifdef CONFIG_IPIPE_TRACE_MCOUNT
- register_ftrace_function(&ipipe_trace_ops);
+ register_ftrace_nmi_function(&ipipe_trace_ops);
#endif /* CONFIG_IPIPE_TRACE_MCOUNT */
#endif /* CONFIG_IPIPE_TRACE_ENABLE */
> Disable branch tracing/profiling under I-pipe
> Do no kill ftrace on failing function test
> Fix ipipe_safe_current definition for !CONFIG_IPIPE
>
> include/linux/ftrace.h | 1 +
> include/linux/ipipe.h | 2 +-
> kernel/ipipe/tracer.c | 3 ++-
> kernel/trace/Kconfig | 2 ++
> kernel/trace/ftrace.c | 7 ++++++-
> kernel/trace/trace_selftest.c | 2 ++
> 6 files changed, 14 insertions(+), 3 deletions(-)
>
> _______________________________________________
> Adeos-main mailing list
> [email protected]
> https://mail.gna.org/listinfo/adeos-main
--
Philippe.
_______________________________________________
Adeos-main mailing list
[email protected]
https://mail.gna.org/listinfo/adeos-main