On Wed, Jan 14, 2015 at 10:40:01AM -0500, Steven Rostedt wrote: > From: "Steven Rostedt (Red Hat)" <rostedt@xxxxxxxxxxx> > > If the function graph tracer traces a jprobe callback, the system will > crash. This can easily be demonstrated by compiling the jprobe > sample module that is in the kernel tree, loading it and running the > function graph tracer. > > # modprobe jprobe_example.ko > # echo function_graph > /sys/kernel/debug/tracing/current_tracer > # ls > > The first two commands end up in a nice crash after the first fork. > (do_fork has a jprobe attached to it, so "ls" just triggers that fork) > > The problem is caused by the jprobe_return() that all jprobe callbacks > must end with. The way jprobes works is that the function a jprobe > is attached to has a breakpoint placed at the start of it (or it uses > ftrace if fentry is supported). The breakpoint handler (or ftrace callback) > will copy the stack frame and change the ip address to return to the > jprobe handler instead of the function. The jprobe handler must end > with jprobe_return() which swaps the stack and does an int3 (breakpoint). > This breakpoint handler will then put back the saved stack frame, > simulate the instruction at the beginning of the function it added > a breakpoint to, and then continue on. > > For function tracing to work, it hijakes the return address from the > stack frame, and replaces it with a hook function that will trace > the end of the call. This hook function will restore the return > address of the function call. > > If the function tracer traces the jprobe handler, the hook function > for that handler will not be called, and its saved return address > will be used for the next function. This will result in a kernel crash. > > To solve this, pause function tracing before the jprobe handler is called > and unpause it before it returns back to the function it probed. Err, stupid question: marking the jprobe handler "notrace" doesn't help? -- Regards/Gruss, Boris. Sent from a fat crate under my desk. Formatting is fine. -- -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html