tracing: Do not (ab)use trace_seq in event_id_read()
authorOleg Nesterov <oleg@redhat.com>
Thu, 18 Jul 2013 18:47:12 +0000 (20:47 +0200)
committerSteven Rostedt <rostedt@goodmis.org>
Fri, 19 Jul 2013 01:31:33 +0000 (21:31 -0400)
event_id_read() has no reason to kmalloc "struct trace_seq"
(more than PAGE_SIZE!), it can use a small buffer instead.

Note: "if (*ppos) return 0" looks strange and even wrong,
simple_read_from_buffer() handles ppos != 0 case corrrectly.

And it seems that almost every user of trace_seq in this file
should be converted too. Unless you use seq_open(), trace_seq
buys nothing compared to the raw buffer, but it needs a bit
more memory and code.

Link: http://lkml.kernel.org/r/20130718184712.GA4786@redhat.com
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
kernel/trace/trace_events.c

index 76defd9..898f868 100644 (file)
@@ -947,23 +947,14 @@ static ssize_t
 event_id_read(struct file *filp, char __user *ubuf, size_t cnt, loff_t *ppos)
 {
        struct ftrace_event_call *call = filp->private_data;
-       struct trace_seq *s;
-       int r;
+       char buf[32];
+       int len;
 
        if (*ppos)
                return 0;
 
-       s = kmalloc(sizeof(*s), GFP_KERNEL);
-       if (!s)
-               return -ENOMEM;
-
-       trace_seq_init(s);
-       trace_seq_printf(s, "%d\n", call->event.type);
-
-       r = simple_read_from_buffer(ubuf, cnt, ppos,
-                                   s->buffer, s->len);
-       kfree(s);
-       return r;
+       len = sprintf(buf, "%d\n", call->event.type);
+       return simple_read_from_buffer(ubuf, cnt, ppos, buf, len);
 }
 
 static ssize_t