lkml.org 
[lkml]   [2009]   [Jun]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 6/7] ftrace: don't manipulate @pos in t_start()
    It's rather confusing that in t_start(), in some cases @pos is
    incremented, and in some cases it's decremented and then incremented.

    This patch rewrites t_start() in a much more general way.

    Thus we fix a bug that if ftrace_filtered == 1, functions have tracer
    hooks won't be printed, because the branch is always unreachable:

    static void *t_start(...)
    {
    ...
    if (!p)
    return t_hash_start(m, pos);
    return p;
    }

    Before:
    # echo 'sys_open' > /mnt/tracing/set_ftrace_filter
    # echo 'sys_write:traceon:4' >> /mnt/tracing/set_ftrace_filter
    sys_open

    After:
    # echo 'sys_open' > /mnt/tracing/set_ftrace_filter
    # echo 'sys_write:traceon:4' >> /mnt/tracing/set_ftrace_filter
    sys_open
    sys_write:traceon:count=4

    [ Impact: show selected functions when filter is on ]

    Reviewed-by: Liming Wang <liming.wang@windriver.com>
    Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
    ---
    kernel/trace/ftrace.c | 19 ++++++++-----------
    1 files changed, 8 insertions(+), 11 deletions(-)

    diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
    index c06e9ab..7946938 100644
    --- a/kernel/trace/ftrace.c
    +++ b/kernel/trace/ftrace.c
    @@ -1466,8 +1466,6 @@ t_next(struct seq_file *m, void *v, loff_t *pos)
    iter->pg = iter->pg->next;
    iter->idx = 0;
    goto retry;
    - } else {
    - iter->idx = -1;
    }
    } else {
    rec = &iter->pg->records[iter->idx++];
    @@ -1496,6 +1494,7 @@ static void *t_start(struct seq_file *m, loff_t *pos)
    {
    struct ftrace_iterator *iter = m->private;
    void *p = NULL;
    + loff_t l;

    mutex_lock(&ftrace_lock);
    /*
    @@ -1507,23 +1506,21 @@ static void *t_start(struct seq_file *m, loff_t *pos)
    if (*pos > 0)
    return t_hash_start(m, pos);
    iter->flags |= FTRACE_ITER_PRINTALL;
    - (*pos)++;
    return iter;
    }

    if (iter->flags & FTRACE_ITER_HASH)
    return t_hash_start(m, pos);

    - if (*pos > 0) {
    - if (iter->idx < 0)
    - return p;
    - (*pos)--;
    - iter->idx--;
    + iter->pg = ftrace_pages_start;
    + iter->idx = 0;
    + for (l = 0; l <= *pos; ) {
    + p = t_next(m, p, &l);
    + if (!p)
    + break;
    }

    - p = t_next(m, p, pos);
    -
    - if (!p)
    + if (!p && iter->flags & FTRACE_ITER_FILTER)
    return t_hash_start(m, pos);

    return p;
    --
    1.5.4.rc3


    \
     
     \ /
      Last update: 2009-06-24 03:55    [W:4.384 / U:0.176 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site