Patch "ftrace: Fix kmemleak in unregister_ftrace_graph" has been added to the 4.13-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
ftrace: Fix kmemleak in unregister_ftrace_graph
to the 4.13-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
ftrace-fix-kmemleak-in-unregister_ftrace_graph.patch
and it can be found in the queue-4.13 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
2b0b8499ae75df91455bbeb7491d45affc384fb0Mon Sep 17 00:00:00 2001
From: Shu Wang <[email protected]>
Date: Tue, 12 Sep 2017 10:14:54 +0800
Subject: ftrace: Fix kmemleak in unregister_ftrace_graph
From: Shu Wang <[email protected]>
commit 2b0b8499ae75df91455bbeb7491d45affc384fb0 upstream.
The trampoline allocated by function tracer was overwriten by function_graph tracer, and caused a memory leak. The save_global_trampoline should have saved the previous trampoline in register_ftrace_graph() and restored it in unregister_ftrace_graph(). But as it is implemented, save_global_trampoline was only used in unregister_ftrace_graph as default value 0, and it overwrote the previous trampoline's value. Causing the previous allocated trampoline to be lost.
kmmeleak backtrace:
kmemleak_vmalloc+0x77/0xc0
__vmalloc_node_range+0x1b5/0x2c0
module_alloc+0x7c/0xd0
arch_ftrace_update_trampoline+0xb5/0x290
ftrace_startup+0x78/0x210
register_ftrace_function+0x8b/0xd0
function_trace_init+0x4f/0x80
tracing_set_tracer+0xe6/0x170
tracing_set_trace_write+0x90/0xd0
__vfs_write+0x37/0x170
vfs_write+0xb2/0x1b0
SyS_write+0x55/0xc0
do_syscall_64+0x67/0x180
return_from_SYSCALL_64+0x0/0x6a[
Looking further into this, I found that this was left over from when the function and function graph tracers shared the same ftrace_ops. But in commit 5f151b2401 ("ftrace: Fix function_profiler and function tracer together"), the two were separated, and the save_global_trampoline no longer was necessary (and it may have been broken back then too). -- Steven Rostedt
]
--- kernel/trace/ftrace.c | 14 -------------- 1 file changed, 14 deletions(-)
kernel/trace/ftrace.c +0 -14
@@ -4954,9 +4954,6 @@ static char ftrace_graph_buf[FTRACE_FILTstatic char ftrace_graph_notrace_buf[FTRACE_FILTER_SIZE ]__initdata ;static int ftrace_graph_set_hash (struct ftrace_hash *hash,char *buffer); -static unsigned long save_global_trampoline; -static unsigned long save_global_flags; -static int __init set_graph_function (char *str) {strlcpy (ftrace_graph_buf, str,FTRACE_FILTER_SIZE );
@@ -6756,17 +6753,6 @@ void unregister_ftrace_graph(void)unregister_pm_notifier (&ftrace_suspend_notifier);unregister_trace_sched_switch (ftrace_graph_probe_sched_switch,NULL ); -#ifdef CONFIG_DYNAMIC_FTRACE -/* -* Function graph does not allocate the trampoline, but -* other global_ops do. We need to reset the ALLOC_TRAMP flag -* if one was used. -*/ - global_ops.trampoline = save_global_trampoline; -if (save_global_flags &FTRACE_OPS_FL_ALLOC_TRAMP ) - global_ops.flags |=FTRACE_OPS_FL_ALLOC_TRAMP ; -#endif - out:mutex_unlock (&ftrace_lock); }
Patches currently in stable-queue which might be from [email protected] are
queue-4.13/ftrace-fix-kmemleak-in-unregister_ftrace_graph.patch