On Mon, 6 May 2019 21:04:16 -0400 Steven Rostedt rostedt@goodmis.org wrote:
static int add_breakpoints(struct dyn_ftrace *rec, int enable) { unsigned long ftrace_addr; int ret;
ftrace_addr = ftrace_get_addr_curr(rec);
ret = ftrace_test_record(rec, enable);
switch (ret) { case FTRACE_UPDATE_IGNORE: return 0;
case FTRACE_UPDATE_MAKE_CALL: /* converting nop to call */ return add_brk_on_nop(rec);
case FTRACE_UPDATE_MODIFY_CALL:
The FTRACE_UPDATE_MODIFY_CALL is the case where we switch from calling one trampoline to calling another. As you can plainly see from this switch statement, we treat it the same as converting to a nop. That's the bug we are trying to fix. It shouldn't be treated as a nop. It should be treated as a call to the old or new function. Either is fine, but it must be one or the other, not a nop.
-- Steve
case FTRACE_UPDATE_MAKE_NOP: /* converting a call to a nop */ return add_brk_on_call(rec, ftrace_addr); } return 0; }