lkml.org 
[lkml]   [2012]   [Apr]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 3/6][RFC] ftrace: Speed up search by skipping pages by address
    From: Steven Rostedt <srostedt@redhat.com>

    As all records in a page of the ftrace table are sorted, we can
    speed up the search algorithm by checking if the address to look for
    falls in between the first and last record ip on the page.

    This speeds up both the ftrace_location() and ftrace_text_reserved()
    algorithms, as it can skip full pages when the search address is
    not in them.

    Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    ---
    kernel/trace/ftrace.c | 22 ++++++++++++++++------
    1 file changed, 16 insertions(+), 6 deletions(-)

    diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
    index 4e608f8..333f890 100644
    --- a/kernel/trace/ftrace.c
    +++ b/kernel/trace/ftrace.c
    @@ -1411,6 +1411,8 @@ int ftrace_location(unsigned long ip)
    key.ip = ip;

    for (pg = ftrace_pages_start; pg; pg = pg->next) {
    + if (ip < pg->records[0].ip || ip > pg->records[pg->index - 1].ip)
    + continue;
    rec = bsearch(&key, pg->records, pg->index,
    sizeof(struct dyn_ftrace),
    ftrace_cmp_recs);
    @@ -1571,16 +1573,24 @@ void ftrace_bug(int failed, unsigned long ip)


    /* Return 1 if the address range is reserved for ftrace */
    -int ftrace_text_reserved(void *start, void *end)
    +int ftrace_text_reserved(void *s, void *e)
    {
    struct dyn_ftrace *rec;
    struct ftrace_page *pg;
    + unsigned long start = (unsigned long)s;
    + unsigned long end = (unsigned long)e;
    + int i;

    - do_for_each_ftrace_rec(pg, rec) {
    - if (rec->ip <= (unsigned long)end &&
    - rec->ip + MCOUNT_INSN_SIZE > (unsigned long)start)
    - return 1;
    - } while_for_each_ftrace_rec();
    + for (pg = ftrace_pages_start; pg; pg = pg->next) {
    + if (end < pg->records[0].ip ||
    + start >= (pg->records[pg->index - 1].ip + MCOUNT_INSN_SIZE))
    + continue;
    + for (i = 0; i < pg->index; i++) {
    + rec = &pg->records[i];
    + if (rec->ip <= end && rec->ip + MCOUNT_INSN_SIZE > start)
    + return 1;
    + }
    + }
    return 0;
    }

    --
    1.7.9.5

    [unhandled content-type:application/pgp-signature]
    \
     
     \ /
      Last update: 2012-04-26 04:41    [W:2.737 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site