summaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorNamhyung Kim <namhyung.kim@lge.com>2013-10-14 04:24:25 -0400
committerSteven Rostedt <rostedt@goodmis.org>2013-10-18 22:20:33 -0400
commit6a10108bdbbfb66e5c431fd1056534e9717d34eb (patch)
treea9d30739ba6bcf62c19418759c4c679e008ae258 /kernel
parentfaf982a60f7c985808f761cff5d508f21c691790 (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.c22
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
4003out_free:
4004 trace_parser_put(&parser); 4002 trace_parser_put(&parser);
4005out_unlock:
4006 mutex_unlock(&graph_lock);
4007 4003
4008 return ret; 4004 return ret;
4009} 4005}