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