lkml.org 
[lkml]   [2022]   [Feb]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v2 12/39] x86/ibt,ftrace: Search for __fentry__ location
    Have ftrace_location() search the symbol for the __fentry__ location
    when it isn't at func+0 and use this for {,un}register_ftrace_direct().

    This avoids a whole bunch of assumptions about __fentry__ being at
    func+0.

    Suggested-by: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    ---
    kernel/trace/ftrace.c | 30 ++++++++++++++++++++++++++++--
    1 file changed, 28 insertions(+), 2 deletions(-)

    --- a/kernel/trace/ftrace.c
    +++ b/kernel/trace/ftrace.c
    @@ -1578,7 +1578,24 @@ unsigned long ftrace_location_range(unsi
    */
    unsigned long ftrace_location(unsigned long ip)
    {
    - return ftrace_location_range(ip, ip);
    + struct dyn_ftrace *rec;
    + unsigned long offset;
    + unsigned long size;
    +
    + rec = lookup_rec(ip, ip);
    + if (!rec) {
    + if (!kallsyms_lookup_size_offset(ip, &size, &offset))
    + goto out;
    +
    + if (!offset)
    + rec = lookup_rec(ip - offset, (ip - offset) + size);
    + }
    +
    + if (rec)
    + return rec->ip;
    +
    +out:
    + return 0;
    }

    /**
    @@ -5110,11 +5127,16 @@ int register_ftrace_direct(unsigned long
    struct ftrace_func_entry *entry;
    struct ftrace_hash *free_hash = NULL;
    struct dyn_ftrace *rec;
    - int ret = -EBUSY;
    + int ret = -ENODEV;

    mutex_lock(&direct_mutex);

    + ip = ftrace_location(ip);
    + if (!ip)
    + goto out_unlock;
    +
    /* See if there's a direct function at @ip already */
    + ret = -EBUSY;
    if (ftrace_find_rec_direct(ip))
    goto out_unlock;

    @@ -5222,6 +5244,10 @@ int unregister_ftrace_direct(unsigned lo

    mutex_lock(&direct_mutex);

    + ip = ftrace_location(ip);
    + if (!ip)
    + goto out_unlock;
    +
    entry = find_direct_entry(&ip, NULL);
    if (!entry)
    goto out_unlock;

    \
     
     \ /
      Last update: 2022-02-24 16:19    [W:5.280 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site