diff options
author | Namhyung Kim <namhyung.kim@lge.com> | 2013-10-14 04:24:25 -0400 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2013-10-18 22:20:33 -0400 |
commit | 6a10108bdbbfb66e5c431fd1056534e9717d34eb (patch) | |
tree | a9d30739ba6bcf62c19418759c4c679e008ae258 /kernel | |
parent | faf982a60f7c985808f761cff5d508f21c691790 (diff) |
ftrace: Narrow down the protected area of graph_lock
The parser set up is just a generic utility that uses local variables
allocated by the function. There's no need to hold the graph_lock for
this set up.
This also makes the code simpler.
Link: http://lkml.kernel.org/r/1381739066-7531-4-git-send-email-namhyung@kernel.org
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/trace/ftrace.c | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 0ff3449b4272..26a229ab0c19 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
@@ -3973,37 +3973,33 @@ ftrace_graph_write(struct file *file, const char __user *ubuf, | |||
3973 | size_t cnt, loff_t *ppos) | 3973 | size_t cnt, loff_t *ppos) |
3974 | { | 3974 | { |
3975 | struct trace_parser parser; | 3975 | struct trace_parser parser; |
3976 | ssize_t read, ret; | 3976 | ssize_t read, ret = 0; |
3977 | struct ftrace_graph_data *fgd = file->private_data; | 3977 | struct ftrace_graph_data *fgd = file->private_data; |
3978 | 3978 | ||
3979 | if (!cnt) | 3979 | if (!cnt) |
3980 | return 0; | 3980 | return 0; |
3981 | 3981 | ||
3982 | mutex_lock(&graph_lock); | 3982 | if (trace_parser_get_init(&parser, FTRACE_BUFF_MAX)) |
3983 | 3983 | return -ENOMEM; | |
3984 | if (trace_parser_get_init(&parser, FTRACE_BUFF_MAX)) { | ||
3985 | ret = -ENOMEM; | ||
3986 | goto out_unlock; | ||
3987 | } | ||
3988 | 3984 | ||
3989 | read = trace_get_user(&parser, ubuf, cnt, ppos); | 3985 | read = trace_get_user(&parser, ubuf, cnt, ppos); |
3990 | 3986 | ||
3991 | if (read >= 0 && trace_parser_loaded((&parser))) { | 3987 | if (read >= 0 && trace_parser_loaded((&parser))) { |
3992 | parser.buffer[parser.idx] = 0; | 3988 | parser.buffer[parser.idx] = 0; |
3993 | 3989 | ||
3990 | mutex_lock(&graph_lock); | ||
3991 | |||
3994 | /* we allow only one expression at a time */ | 3992 | /* we allow only one expression at a time */ |
3995 | ret = ftrace_set_func(fgd->table, fgd->count, fgd->size, | 3993 | ret = ftrace_set_func(fgd->table, fgd->count, fgd->size, |
3996 | parser.buffer); | 3994 | parser.buffer); |
3997 | if (ret) | 3995 | |
3998 | goto out_free; | 3996 | mutex_unlock(&graph_lock); |
3999 | } | 3997 | } |
4000 | 3998 | ||
4001 | ret = read; | 3999 | if (!ret) |
4000 | ret = read; | ||
4002 | 4001 | ||
4003 | out_free: | ||
4004 | trace_parser_put(&parser); | 4002 | trace_parser_put(&parser); |
4005 | out_unlock: | ||
4006 | mutex_unlock(&graph_lock); | ||
4007 | 4003 | ||
4008 | return ret; | 4004 | return ret; |
4009 | } | 4005 | } |