Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'ftrace-v6.13-rc5-2' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace

Pull ftrace fixes from Steven Rostedt:

- Add needed READ_ONCE() around access to the fgraph array element

The updates to the fgraph array can happen when callbacks are
registered and unregistered. The __ftrace_return_to_handler() can
handle reading either the old value or the new value. But once it
reads that value it must stay consistent otherwise the check that
looks to see if the value is a stub may show false, but if the
compiler decides to re-read after that check, it can be true which
can cause the code to crash later on.

- Make function profiler use the top level ops for filtering again

When function graph became available for instances, its filter ops
became independent from the top level set_ftrace_filter. In the
process the function profiler received its own filter ops as well.
But the function profiler uses the top level set_ftrace_filter file
and does not have one of its own. In giving it its own filter ops, it
lost any user interface it once had. Make it use the top level
set_ftrace_filter file again. This fixes a regression.

* tag 'ftrace-v6.13-rc5-2' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace:
ftrace: Fix function profiler's filtering functionality
fgraph: Add READ_ONCE() when accessing fgraph_array[]

+3 -7
+1 -1
kernel/trace/fgraph.c
··· 833 833 #endif 834 834 { 835 835 for_each_set_bit(i, &bitmap, sizeof(bitmap) * BITS_PER_BYTE) { 836 - struct fgraph_ops *gops = fgraph_array[i]; 836 + struct fgraph_ops *gops = READ_ONCE(fgraph_array[i]); 837 837 838 838 if (gops == &fgraph_stub) 839 839 continue;
+2 -6
kernel/trace/ftrace.c
··· 902 902 } 903 903 904 904 static struct fgraph_ops fprofiler_ops = { 905 - .ops = { 906 - .flags = FTRACE_OPS_FL_INITIALIZED, 907 - INIT_OPS_HASH(fprofiler_ops.ops) 908 - }, 909 905 .entryfunc = &profile_graph_entry, 910 906 .retfunc = &profile_graph_return, 911 907 }; 912 908 913 909 static int register_ftrace_profiler(void) 914 910 { 911 + ftrace_ops_set_global_filter(&fprofiler_ops.ops); 915 912 return register_ftrace_graph(&fprofiler_ops); 916 913 } 917 914 ··· 919 922 #else 920 923 static struct ftrace_ops ftrace_profile_ops __read_mostly = { 921 924 .func = function_profile_call, 922 - .flags = FTRACE_OPS_FL_INITIALIZED, 923 - INIT_OPS_HASH(ftrace_profile_ops) 924 925 }; 925 926 926 927 static int register_ftrace_profiler(void) 927 928 { 929 + ftrace_ops_set_global_filter(&ftrace_profile_ops); 928 930 return register_ftrace_function(&ftrace_profile_ops); 929 931 } 930 932