diff options
author | Oleg Nesterov <oleg@redhat.com> | 2013-07-18 14:47:12 -0400 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2013-07-18 21:31:33 -0400 |
commit | cd458ba9d5a5592d37b5145e560071e91ea762ac (patch) | |
tree | d6a560b077696e68584995ba23e10556fcebcd8d /kernel | |
parent | 7710b639953b791610f0022a7d52d9801c93b969 (diff) |
tracing: Do not (ab)use trace_seq in event_id_read()
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>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/trace/trace_events.c | 17 |
1 files changed, 4 insertions, 13 deletions
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index 76defd91f9b4..898f868833f2 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c | |||
@@ -947,23 +947,14 @@ static ssize_t | |||
947 | event_id_read(struct file *filp, char __user *ubuf, size_t cnt, loff_t *ppos) | 947 | event_id_read(struct file *filp, char __user *ubuf, size_t cnt, loff_t *ppos) |
948 | { | 948 | { |
949 | struct ftrace_event_call *call = filp->private_data; | 949 | struct ftrace_event_call *call = filp->private_data; |
950 | struct trace_seq *s; | 950 | char buf[32]; |
951 | int r; | 951 | int len; |
952 | 952 | ||
953 | if (*ppos) | 953 | if (*ppos) |
954 | return 0; | 954 | return 0; |
955 | 955 | ||
956 | s = kmalloc(sizeof(*s), GFP_KERNEL); | 956 | len = sprintf(buf, "%d\n", call->event.type); |
957 | if (!s) | 957 | return simple_read_from_buffer(ubuf, cnt, ppos, buf, len); |
958 | return -ENOMEM; | ||
959 | |||
960 | trace_seq_init(s); | ||
961 | trace_seq_printf(s, "%d\n", call->event.type); | ||
962 | |||
963 | r = simple_read_from_buffer(ubuf, cnt, ppos, | ||
964 | s->buffer, s->len); | ||
965 | kfree(s); | ||
966 | return r; | ||
967 | } | 958 | } |
968 | 959 | ||
969 | static ssize_t | 960 | static ssize_t |