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/trace | |
| 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/trace')
| -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 | } |
