lkml.org 
[lkml]   [2012]   [Jun]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH -tip v2 4/9] ftrace: add ftrace_set_filter_ip() for address based filter
    Date
    Add a new filter update interface ftrace_set_filter_ip()
    to set ftrace filter by ip address, not only glob pattern.

    Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    ---

    include/linux/ftrace.h | 3 ++
    kernel/trace/ftrace.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++--
    2 files changed, 60 insertions(+), 2 deletions(-)

    diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h
    index 11abe4e..f3c5487 100644
    --- a/include/linux/ftrace.h
    +++ b/include/linux/ftrace.h
    @@ -263,6 +263,8 @@ struct dyn_ftrace {
    };

    int ftrace_force_update(void);
    +int ftrace_set_filter_ip(struct ftrace_ops *ops, unsigned long ip,
    + int remove, int reset);
    int ftrace_set_filter(struct ftrace_ops *ops, unsigned char *buf,
    int len, int reset);
    int ftrace_set_notrace(struct ftrace_ops *ops, unsigned char *buf,
    @@ -432,6 +434,7 @@ static inline int ftrace_text_reserved(void *start, void *end)
    */
    #define ftrace_regex_open(ops, flag, inod, file) ({ -ENODEV; })
    #define ftrace_set_early_filter(ops, buf, enable) do { } while (0)
    +#define ftrace_set_filter_ip(ops, ip, remove, reset) ({ -ENODEV; })
    #define ftrace_set_filter(ops, buf, len, reset) ({ -ENODEV; })
    #define ftrace_set_notrace(ops, buf, len, reset) ({ -ENODEV; })
    #define ftrace_free_filter(ops) do { } while (0)
    diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
    index 357b15b..3ce1219 100644
    --- a/kernel/trace/ftrace.c
    +++ b/kernel/trace/ftrace.c
    @@ -3175,8 +3175,27 @@ ftrace_notrace_write(struct file *file, const char __user *ubuf,
    }

    static int
    -ftrace_set_regex(struct ftrace_ops *ops, unsigned char *buf, int len,
    - int reset, int enable)
    +ftrace_match_addr(struct ftrace_hash *hash, unsigned long ip, int remove)
    +{
    + struct ftrace_func_entry *entry;
    +
    + if (!ftrace_location(ip))
    + return -EINVAL;
    +
    + if (remove) {
    + entry = ftrace_lookup_ip(hash, ip);
    + if (!entry)
    + return -ENOENT;
    + free_hash_entry(hash, entry);
    + return 0;
    + }
    +
    + return add_hash_entry(hash, ip);
    +}
    +
    +static int
    +ftrace_set_hash(struct ftrace_ops *ops, unsigned char *buf, int len,
    + unsigned long ip, int remove, int reset, int enable)
    {
    struct ftrace_hash **orig_hash;
    struct ftrace_hash *hash;
    @@ -3205,6 +3224,11 @@ ftrace_set_regex(struct ftrace_ops *ops, unsigned char *buf, int len,
    ret = -EINVAL;
    goto out_regex_unlock;
    }
    + if (ip) {
    + ret = ftrace_match_addr(hash, ip, remove);
    + if (ret < 0)
    + goto out_regex_unlock;
    + }

    mutex_lock(&ftrace_lock);
    ret = ftrace_hash_move(ops, enable, orig_hash, hash);
    @@ -3221,6 +3245,37 @@ ftrace_set_regex(struct ftrace_ops *ops, unsigned char *buf, int len,
    return ret;
    }

    +static int
    +ftrace_set_addr(struct ftrace_ops *ops, unsigned long ip, int remove,
    + int reset, int enable)
    +{
    + return ftrace_set_hash(ops, 0, 0, ip, remove, reset, enable);
    +}
    +
    +/**
    + * ftrace_set_filter_ip - set a function to filter on in ftrace by address
    + * @ops - the ops to set the filter with
    + * @ip - the address to add to or remove from the filter.
    + * @remove - non zero to remove the ip from the filter
    + * @reset - non zero to reset all filters before applying this filter.
    + *
    + * Filters denote which functions should be enabled when tracing is enabled
    + * If @ip is NULL, it failes to update filter.
    + */
    +int ftrace_set_filter_ip(struct ftrace_ops *ops, unsigned long ip,
    + int remove, int reset)
    +{
    + return ftrace_set_addr(ops, ip, remove, reset, 1);
    +}
    +EXPORT_SYMBOL_GPL(ftrace_set_filter_ip);
    +
    +static int
    +ftrace_set_regex(struct ftrace_ops *ops, unsigned char *buf, int len,
    + int reset, int enable)
    +{
    + return ftrace_set_hash(ops, buf, len, 0, 0, reset, enable);
    +}
    +
    /**
    * ftrace_set_filter - set a function to filter on in ftrace
    * @ops - the ops to set the filter with


    \
     
     \ /
      Last update: 2012-06-05 15:01    [W:0.048 / U:0.960 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site