lkml.org 
[lkml]   [2020]   [Aug]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 186/212] ftrace: Setup correct FTRACE_FL_REGS flags for module
    Date
    From: Chengming Zhou <zhouchengming@bytedance.com>

    commit 8a224ffb3f52b0027f6b7279854c71a31c48fc97 upstream.

    When module loaded and enabled, we will use __ftrace_replace_code
    for module if any ftrace_ops referenced it found. But we will get
    wrong ftrace_addr for module rec in ftrace_get_addr_new, because
    rec->flags has not been setup correctly. It can cause the callback
    function of a ftrace_ops has FTRACE_OPS_FL_SAVE_REGS to be called
    with pt_regs set to NULL.
    So setup correct FTRACE_FL_REGS flags for rec when we call
    referenced_filters to find ftrace_ops references it.

    Link: https://lkml.kernel.org/r/20200728180554.65203-1-zhouchengming@bytedance.com

    Cc: stable@vger.kernel.org
    Fixes: 8c4f3c3fa9681 ("ftrace: Check module functions being traced on reload")
    Signed-off-by: Chengming Zhou <zhouchengming@bytedance.com>
    Signed-off-by: Muchun Song <songmuchun@bytedance.com>
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    kernel/trace/ftrace.c | 11 +++++++----
    1 file changed, 7 insertions(+), 4 deletions(-)

    --- a/kernel/trace/ftrace.c
    +++ b/kernel/trace/ftrace.c
    @@ -4987,8 +4987,11 @@ static int referenced_filters(struct dyn
    int cnt = 0;

    for (ops = ftrace_ops_list; ops != &ftrace_list_end; ops = ops->next) {
    - if (ops_references_rec(ops, rec))
    - cnt++;
    + if (ops_references_rec(ops, rec)) {
    + cnt++;
    + if (ops->flags & FTRACE_OPS_FL_SAVE_REGS)
    + rec->flags |= FTRACE_FL_REGS;
    + }
    }

    return cnt;
    @@ -5084,8 +5087,8 @@ void ftrace_module_enable(struct module
    if (ftrace_start_up)
    cnt += referenced_filters(rec);

    - /* This clears FTRACE_FL_DISABLED */
    - rec->flags = cnt;
    + rec->flags &= ~FTRACE_FL_DISABLED;
    + rec->flags += cnt;

    if (ftrace_start_up && cnt) {
    int failed = __ftrace_replace_code(rec, 1);

    \
     
     \ /
      Last update: 2020-08-20 13:42    [W:4.264 / U:0.344 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site