ftrace: add ftrace_set_filter_ip() for address based filter
Add a new filter update interface ftrace_set_filter_ip() to set ftrace filter by ip address, not only glob pattern. Link: http://lkml.kernel.org/r/20120605102808.27845.67952.stgit@localhost.localdomain Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@redhat.com> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com> Cc: "Frank Ch. Eigler" <fche@redhat.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Frederic Weisbecker <fweisbec@gmail.com> Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>hifive-unleashed-5.1
parent
ad97772ad8
commit
647664eaf4
|
@ -317,6 +317,8 @@ struct dyn_ftrace {
|
||||||
};
|
};
|
||||||
|
|
||||||
int ftrace_force_update(void);
|
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 ftrace_set_filter(struct ftrace_ops *ops, unsigned char *buf,
|
||||||
int len, int reset);
|
int len, int reset);
|
||||||
int ftrace_set_notrace(struct ftrace_ops *ops, unsigned char *buf,
|
int ftrace_set_notrace(struct ftrace_ops *ops, unsigned char *buf,
|
||||||
|
@ -544,6 +546,7 @@ static inline int ftrace_text_reserved(void *start, void *end)
|
||||||
*/
|
*/
|
||||||
#define ftrace_regex_open(ops, flag, inod, file) ({ -ENODEV; })
|
#define ftrace_regex_open(ops, flag, inod, file) ({ -ENODEV; })
|
||||||
#define ftrace_set_early_filter(ops, buf, enable) do { } while (0)
|
#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_filter(ops, buf, len, reset) ({ -ENODEV; })
|
||||||
#define ftrace_set_notrace(ops, buf, len, reset) ({ -ENODEV; })
|
#define ftrace_set_notrace(ops, buf, len, reset) ({ -ENODEV; })
|
||||||
#define ftrace_free_filter(ops) do { } while (0)
|
#define ftrace_free_filter(ops) do { } while (0)
|
||||||
|
|
|
@ -3242,8 +3242,27 @@ ftrace_notrace_write(struct file *file, const char __user *ubuf,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
ftrace_set_regex(struct ftrace_ops *ops, unsigned char *buf, int len,
|
ftrace_match_addr(struct ftrace_hash *hash, unsigned long ip, int remove)
|
||||||
int reset, int enable)
|
{
|
||||||
|
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 **orig_hash;
|
||||||
struct ftrace_hash *hash;
|
struct ftrace_hash *hash;
|
||||||
|
@ -3272,6 +3291,11 @@ ftrace_set_regex(struct ftrace_ops *ops, unsigned char *buf, int len,
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto out_regex_unlock;
|
goto out_regex_unlock;
|
||||||
}
|
}
|
||||||
|
if (ip) {
|
||||||
|
ret = ftrace_match_addr(hash, ip, remove);
|
||||||
|
if (ret < 0)
|
||||||
|
goto out_regex_unlock;
|
||||||
|
}
|
||||||
|
|
||||||
mutex_lock(&ftrace_lock);
|
mutex_lock(&ftrace_lock);
|
||||||
ret = ftrace_hash_move(ops, enable, orig_hash, hash);
|
ret = ftrace_hash_move(ops, enable, orig_hash, hash);
|
||||||
|
@ -3288,6 +3312,37 @@ ftrace_set_regex(struct ftrace_ops *ops, unsigned char *buf, int len,
|
||||||
return ret;
|
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
|
* ftrace_set_filter - set a function to filter on in ftrace
|
||||||
* @ops - the ops to set the filter with
|
* @ops - the ops to set the filter with
|
||||||
|
|
Loading…
Reference in New Issue