From 054391cfa9180b3d478a2cbddbd1294dde5028d4 Mon Sep 17 00:00:00 2001 From: Steven Rostedt Date: Wed, 11 Mar 2009 14:33:00 -0400 Subject: [PATCH] --- yaml --- r: 140921 b: refs/heads/master c: 1852fcce181faa237c010a3dbedb473cf9d4555f h: refs/heads/master i: 140919: d36a963e63f4698da9c987f2c482b53ca58b89f5 v: v3 --- [refs] | 2 +- trunk/kernel/trace/trace.c | 20 ++++++++++++++++++++ trunk/kernel/trace/trace.h | 3 +++ trunk/kernel/trace/trace_events.c | 8 ++++++++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 120bcd85ff6c..fa087a1a213d 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 73c5162aa362a543793f4a957c6c536dcbaa89ce +refs/heads/master: 1852fcce181faa237c010a3dbedb473cf9d4555f diff --git a/trunk/kernel/trace/trace.c b/trunk/kernel/trace/trace.c index 0c1dc1850858..35ee63ae4122 100644 --- a/trunk/kernel/trace/trace.c +++ b/trunk/kernel/trace/trace.c @@ -2357,6 +2357,26 @@ static int tracing_resize_ring_buffer(unsigned long size) return ret; } +/** + * tracing_update_buffers - used by tracing facility to expand ring buffers + * + * To save on memory when the tracing is never used on a system with it + * configured in. The ring buffers are set to a minimum size. But once + * a user starts to use the tracing facility, then they need to grow + * to their default size. + * + * This function is to be called when a tracer is about to be used. + */ +int tracing_update_buffers(void) +{ + int ret = 0; + + if (!ring_buffer_expanded) + ret = tracing_resize_ring_buffer(trace_buf_size); + + return ret; +} + struct trace_option_dentry; static struct trace_option_dentry * diff --git a/trunk/kernel/trace/trace.h b/trunk/kernel/trace/trace.h index c5e1d8865fe4..336324d717f8 100644 --- a/trunk/kernel/trace/trace.h +++ b/trunk/kernel/trace/trace.h @@ -737,6 +737,9 @@ static inline void trace_branch_disable(void) } #endif /* CONFIG_BRANCH_TRACER */ +/* set ring buffers to default size if not already done so */ +int tracing_update_buffers(void); + /* trace event type bit fields, not numeric */ enum { TRACE_EVENT_TYPE_PRINTF = 1, diff --git a/trunk/kernel/trace/trace_events.c b/trunk/kernel/trace/trace_events.c index 769dfd00fc85..ca624df73591 100644 --- a/trunk/kernel/trace/trace_events.c +++ b/trunk/kernel/trace/trace_events.c @@ -141,6 +141,10 @@ ftrace_event_write(struct file *file, const char __user *ubuf, if (!cnt || cnt < 0) return 0; + ret = tracing_update_buffers(); + if (ret < 0) + return ret; + ret = get_user(ch, ubuf++); if (ret) return ret; @@ -331,6 +335,10 @@ event_enable_write(struct file *filp, const char __user *ubuf, size_t cnt, if (ret < 0) return ret; + ret = tracing_update_buffers(); + if (ret < 0) + return ret; + switch (val) { case 0: case 1: