tracing: tracing_stats_read() uses simple buffer instead of trace_seq
PATCH 3/6 tracing: tracing_stats_read() uses simple buffer instead of trace_seq
It seems that struct trace_seq is too heavy for tracing_stats_read(). we use simple buffer instead of struct trace_seq.
Signed-off-by Lai Jiangshan <[email protected]>
---
kernel/trace/trace.c +7 -12
@@ -3807,27 +3807,22 @@ tracing_stats_read(struct file *filp, char __user *ubuf, {unsigned long cpu = (unsigned long )filp->private_data;struct trace_array *tr = &global_trace; -struct trace_seq *s;unsigned long cnt; - s =kmalloc (sizeof (*s),GFP_KERNEL ); -if (!s) -return -ENOMEM ; - -trace_seq_init (s); +unsigned char buf[128 ]; +int len =0 ; cnt =ring_buffer_entries_cpu (tr->buffer, cpu); -trace_seq_printf (s,"entries: %ld\n" , cnt); + len +=sprintf (buf + len,"entries: %ld\n" , cnt); cnt =ring_buffer_overrun_cpu (tr->buffer, cpu); -trace_seq_printf (s,"overrun: %ld\n" , cnt); + len +=sprintf (buf + len,"overrun: %ld\n" , cnt); cnt =ring_buffer_commit_overrun_cpu (tr->buffer, cpu); -trace_seq_printf (s,"commit overrun: %ld\n" , cnt); - - count =simple_read_from_buffer (ubuf, count, ppos, s->buffer, s->len); + len +=sprintf (buf + len,"commit overrun: %ld\n" , cnt); -kfree (s); +BUG_ON (len >=sizeof (buf));/* should not happen, 128 is enough. */ + count =simple_read_from_buffer (ubuf, count, ppos, buf, len);return count; }
Quoted 13 lines · Lai Jiangshan
It seems that struct
trace_seqis too heavy fortracing_stats_read(). we use simple buffer instead of structtrace_seq.Signed-off-by Lai Jiangshan <[email protected]>---
kernel/trace/trace.c +0
-0@@ -3807,27 +3807,22 @@ tracing_stats_read(struct file *filp, char __user *ubuf, {unsigned long cpu = (unsigned long )filp->private_data;
kernel/trace/trace.c tracing_stats_read(struct file *filp, char __user *ubuf, · line 3812
Quoted 10 lines
kernel/trace/trace.c +1
-6struct trace_array *tr = &global_trace; -struct trace_seq *s;unsigned long cnt; - s =kmalloc (sizeof (*s),GFP_KERNEL ); -if (!s) -return -ENOMEM ; - -trace_seq_init (s); +unsigned char buf[128 ];
No problem with the conversion. But perhaps keep using a dynamic buffer as 128 is a bit big for a kernel stack.
Quoted 23 lines
kernel/trace/trace.c +6
-6+int len =0 ; cnt =ring_buffer_entries_cpu (tr->buffer, cpu); -trace_seq_printf (s,"entries: %ld\n" , cnt); + len +=sprintf (buf + len,"entries: %ld\n" , cnt); cnt =ring_buffer_overrun_cpu (tr->buffer, cpu); -trace_seq_printf (s,"overrun: %ld\n" , cnt); + len +=sprintf (buf + len,"overrun: %ld\n" , cnt); cnt =ring_buffer_commit_overrun_cpu (tr->buffer, cpu); -trace_seq_printf (s,"commit overrun: %ld\n" , cnt); - - count =simple_read_from_buffer (ubuf, count, ppos, s->buffer, s->len); + len +=sprintf (buf + len,"commit overrun: %ld\n" , cnt); -kfree (s); +BUG_ON (len >=sizeof (buf));/* should not happen, 128 is enough. */ + count =simple_read_from_buffer (ubuf, count, ppos, buf, len);return count; }