[for-next][PATCH 5/6] ftrace: Narrow down the protected area of graph_lock

From: Steven Rostedt
Date: Sun Oct 20 2013 - 22:47:58 EST


From: Namhyung Kim <namhyung.kim@xxxxxxx>

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@xxxxxxxxxx

Signed-off-by: Namhyung Kim <namhyung@xxxxxxxxxx>
Signed-off-by: Steven Rostedt <rostedt@xxxxxxxxxxx>
---
kernel/trace/ftrace.c | 22 +++++++++-------------
1 file changed, 9 insertions(+), 13 deletions(-)

diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 0ff3449..26a229a 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,
size_t cnt, loff_t *ppos)
{
struct trace_parser parser;
- ssize_t read, ret;
+ ssize_t read, ret = 0;
struct ftrace_graph_data *fgd = file->private_data;

if (!cnt)
return 0;

- mutex_lock(&graph_lock);
-
- if (trace_parser_get_init(&parser, FTRACE_BUFF_MAX)) {
- ret = -ENOMEM;
- goto out_unlock;
- }
+ if (trace_parser_get_init(&parser, FTRACE_BUFF_MAX))
+ return -ENOMEM;

read = trace_get_user(&parser, ubuf, cnt, ppos);

if (read >= 0 && trace_parser_loaded((&parser))) {
parser.buffer[parser.idx] = 0;

+ mutex_lock(&graph_lock);
+
/* we allow only one expression at a time */
ret = ftrace_set_func(fgd->table, fgd->count, fgd->size,
parser.buffer);
- if (ret)
- goto out_free;
+
+ mutex_unlock(&graph_lock);
}

- ret = read;
+ if (!ret)
+ ret = read;

-out_free:
trace_parser_put(&parser);
-out_unlock:
- mutex_unlock(&graph_lock);

return ret;
}
--
1.8.4.rc3


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/