tracing: Minor fixes
Subsystems (3)
Steven Rostedt
maintainercover tracing: Minor fixes
Three minor tracing fixes:
- Fix missing prototypes in sample module for direct functions
- Fix check of valid buffer in get_trace_buf()
- Fix annotations of percpu pointers.
Jiri Olsa (1):
ftrace/samples: Add missing prototypes direct functions
Naveen N. Rao (2):
tracing: Fix check for trace_percpu_buffer validity in get_trace_buf()
tracing: Tag trace_percpu_buffer as a percpu pointer
----
kernel/trace/trace.c | 6 +++--- samples/ftrace/ftrace-direct-modify.c | 3 +++ samples/ftrace/ftrace-direct-multi-modify.c | 3 +++ samples/ftrace/ftrace-direct-too.c | 3 +++ samples/ftrace/ftrace-direct.c | 2 ++ 5 files changed, 14 insertions(+), 3 deletions(-)
Steven Rostedt
maintainerPATCH 1/3 ftrace/samples: Add missing prototypes direct functions
From: Jiri Olsa <[email protected]>
There's another compilation fail (first here [1]) reported by kernel test robot for W=1 clang build:
Quoted 1 line
Quoted 1 line
samples/ftrace/ftrace-direct-multi-modify.c:7:6: warning: no previous
prototype for function 'my_direct_func1' [-Wmissing-prototypes]
void my_direct_func1(unsigned long ip)
Direct functions in ftrace direct sample modules need to have prototypes defined. They are already global in order to be visible for the inline assembly, so there's no problem.
The kernel test robot reported just error for ftrace-direct-multi-modify, but I got same errors also for the rest of the modules touched by this patch.
[1] 67d4f6e3bf5d ftrace/samples: Add missing prototype for my_direct_func
--- samples/ftrace/ftrace-direct-modify.c | 3 +++ samples/ftrace/ftrace-direct-multi-modify.c | 3 +++ samples/ftrace/ftrace-direct-too.c | 3 +++ samples/ftrace/ftrace-direct.c | 2 ++ 4 files changed, 11 insertions(+)
samples/ftrace/ftrace-direct-modify.c +3 -0
@@ -4,6 +4,9 @@#include <linux/ftrace.h> #include <asm/asm-offsets.h> +extern void my_direct_func1 (void ); +extern void my_direct_func2 (void ); +void my_direct_func1 (void ) {trace_printk ("my direct func1\n" );
samples/ftrace/ftrace-direct-multi-modify.c +3 -0
@@ -4,6 +4,9 @@#include <linux/ftrace.h> #include <asm/asm-offsets.h> +extern void my_direct_func1 (unsigned long ip); +extern void my_direct_func2 (unsigned long ip); +void my_direct_func1 (unsigned long ip) {trace_printk ("my direct func1 ip %lx\n" , ip);
samples/ftrace/ftrace-direct-too.c +3 -0
@@ -5,6 +5,9 @@#include <linux/ftrace.h> #include <asm/asm-offsets.h> +extern void my_direct_func (struct vm_area_struct *vma, +unsigned long address,unsigned int flags); +void my_direct_func (struct vm_area_struct *vma,unsigned long address,unsigned int flags) {
samples/ftrace/ftrace-direct.c +2 -0
@@ -5,6 +5,8 @@#include <linux/ftrace.h> #include <asm/asm-offsets.h> +extern void my_direct_func (struct task_struct *p); +void my_direct_func (struct task_struct *p) {trace_printk ("waking up %s-%d\n" , p->comm, p->pid);
Signature · 1 line
2.33.0
Steven Rostedt
maintainerPATCH 2/3 tracing: Fix check for trace_percpu_buffer validity in get_trace_buf()
In reply to Steven RostedtFrom: "Naveen N. Rao" <[email protected]>
With the new osnoise tracer, we are seeing the below splat:
Kernel attempted to read user page (c7d880000) - exploit attempt? (uid: 0)
BUG: Unable to handle kernel data access on read at 0xc7d880000
Faulting instruction address: 0xc0000000002ffa10
Oops: Kernel access of bad area, sig: 11 [#1]
LE PAGE_SIZE=64K MMU=Radix SMP NR_CPUS=2048 NUMA pSeries
...
NIP [c0000000002ffa10] __trace_array_vprintk.part.0+0x70/0x2f0
LR [c0000000002ff9fc] __trace_array_vprintk.part.0+0x5c/0x2f0
Call Trace:
[c0000008bdd73b80] [c0000000001c49cc] put_prev_task_fair+0x3c/0x60 (unreliable)
[c0000008bdd73be0] [c000000000301430] trace_array_printk_buf+0x70/0x90
[c0000008bdd73c00] [c0000000003178b0] trace_sched_switch_callback+0x250/0x290
[c0000008bdd73c90] [c000000000e70d60] __schedule+0x410/0x710
[c0000008bdd73d40] [c000000000e710c0] schedule+0x60/0x130
[c0000008bdd73d70] [c000000000030614] interrupt_exit_user_prepare_main+0x264/0x270
[c0000008bdd73de0] [c000000000030a70] syscall_exit_prepare+0x150/0x180
[c0000008bdd73e10] [c00000000000c174] system_call_vectored_common+0xf4/0x278osnoise tracer on ppc64le is triggering osnoise_taint() for negative duration in get_int_safe_duration() called from trace_sched_switch_callback()->thread_exit().
The problem though is that the check for a valid trace_percpu_buffer is incorrect in get_trace_buf(). The check is being done after calculating the pointer for the current cpu, rather than on the main percpu pointer. Fix the check to be against trace_percpu_buffer.
--- kernel/trace/trace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/trace/trace.c +1 -1
@@ -3217,7 +3217,7 @@ static char *get_trace_buf(void) {struct trace_buffer_struct *buffer =this_cpu_ptr (trace_percpu_buffer); -if (!buffer || buffer->nesting >=4 ) +if (!trace_percpu_buffer || buffer->nesting >=4 )return NULL ; buffer->nesting++;
Signature · 1 line
2.33.0
Steven Rostedt
maintainerPATCH 3/3 tracing: Tag trace_percpu_buffer as a percpu pointer
In reply to Steven RostedtFrom: "Naveen N. Rao" <[email protected]>
Tag trace_percpu_buffer as a percpu pointer to resolve warnings
reported by sparse:
/linux/kernel/trace/trace.c:3218:46: warning: incorrect type in initializer (different address spaces)
/linux/kernel/trace/trace.c:3218:46: expected void const [noderef] __percpu *__vpp_verify
/linux/kernel/trace/trace.c:3218:46: got struct trace_buffer_struct *
/linux/kernel/trace/trace.c:3234:9: warning: incorrect type in initializer (different address spaces)
/linux/kernel/trace/trace.c:3234:9: expected void const [noderef] __percpu *__vpp_verify
/linux/kernel/trace/trace.c:3234:9: got int *
--- kernel/trace/trace.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
kernel/trace/trace.c +2 -2
@@ -3207,7 +3207,7 @@ struct trace_buffer_struct {char buffer[4 ][TRACE_BUF_SIZE ]; }; -static struct trace_buffer_struct *trace_percpu_buffer; +static struct trace_buffer_struct __percpu *trace_percpu_buffer;/* * This allows for lockless recording. If we're nested too deeply, then
@@ -3236,7 +3236,7 @@ static void put_trace_buf(void)static int alloc_percpu_trace_buffer (void ) { -struct trace_buffer_struct *buffers; +struct trace_buffer_struct __percpu *buffers;if (trace_percpu_buffer)return 0 ;
Signature · 1 line
2.33.0