diff options
author | Hiraku Toyooka <hiraku.toyooka.gu@hitachi.com> | 2012-10-16 22:56:16 -0400 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2012-11-15 17:10:21 -0500 |
commit | d60da506cbeb3f1907a740547dd7ef04a93e908e (patch) | |
tree | b9d32b5ac2061c2c86f0e9d074349f70d8d52199 /kernel | |
parent | 1c7d66732458dc187008e3f5b2f71e019e320fc2 (diff) |
tracing: Add a resize function to make one buffer equivalent to another buffer
Trace buffer size is now per-cpu, so that there are the following two
patterns in resizing of buffers.
(1) resize per-cpu buffers to same given size
(2) resize per-cpu buffers to another trace_array's buffer size
for each CPU (such as preparing the max_tr which is equivalent
to the global_trace's size)
__tracing_resize_ring_buffer() can be used for (1), and had
implemented (2) inside it for resetting the global_trace to the
original size.
(2) was also implemented in another place. So this patch assembles
them in a new function - resize_buffer_duplicate_size().
Link: http://lkml.kernel.org/r/20121017025616.2627.91226.stgit@falsita
Signed-off-by: Hiraku Toyooka <hiraku.toyooka.gu@hitachi.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/trace/trace.c | 58 |
1 files changed, 31 insertions, 27 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index b69cc380322d..64ad9bc4275b 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
@@ -3034,6 +3034,31 @@ static void set_buffer_entries(struct trace_array *tr, unsigned long val) | |||
3034 | tr->data[cpu]->entries = val; | 3034 | tr->data[cpu]->entries = val; |
3035 | } | 3035 | } |
3036 | 3036 | ||
3037 | /* resize @tr's buffer to the size of @size_tr's entries */ | ||
3038 | static int resize_buffer_duplicate_size(struct trace_array *tr, | ||
3039 | struct trace_array *size_tr, int cpu_id) | ||
3040 | { | ||
3041 | int cpu, ret = 0; | ||
3042 | |||
3043 | if (cpu_id == RING_BUFFER_ALL_CPUS) { | ||
3044 | for_each_tracing_cpu(cpu) { | ||
3045 | ret = ring_buffer_resize(tr->buffer, | ||
3046 | size_tr->data[cpu]->entries, cpu); | ||
3047 | if (ret < 0) | ||
3048 | break; | ||
3049 | tr->data[cpu]->entries = size_tr->data[cpu]->entries; | ||
3050 | } | ||
3051 | } else { | ||
3052 | ret = ring_buffer_resize(tr->buffer, | ||
3053 | size_tr->data[cpu_id]->entries, cpu_id); | ||
3054 | if (ret == 0) | ||
3055 | tr->data[cpu_id]->entries = | ||
3056 | size_tr->data[cpu_id]->entries; | ||
3057 | } | ||
3058 | |||
3059 | return ret; | ||
3060 | } | ||
3061 | |||
3037 | static int __tracing_resize_ring_buffer(unsigned long size, int cpu) | 3062 | static int __tracing_resize_ring_buffer(unsigned long size, int cpu) |
3038 | { | 3063 | { |
3039 | int ret; | 3064 | int ret; |
@@ -3058,23 +3083,8 @@ static int __tracing_resize_ring_buffer(unsigned long size, int cpu) | |||
3058 | 3083 | ||
3059 | ret = ring_buffer_resize(max_tr.buffer, size, cpu); | 3084 | ret = ring_buffer_resize(max_tr.buffer, size, cpu); |
3060 | if (ret < 0) { | 3085 | if (ret < 0) { |
3061 | int r = 0; | 3086 | int r = resize_buffer_duplicate_size(&global_trace, |
3062 | 3087 | &global_trace, cpu); | |
3063 | if (cpu == RING_BUFFER_ALL_CPUS) { | ||
3064 | int i; | ||
3065 | for_each_tracing_cpu(i) { | ||
3066 | r = ring_buffer_resize(global_trace.buffer, | ||
3067 | global_trace.data[i]->entries, | ||
3068 | i); | ||
3069 | if (r < 0) | ||
3070 | break; | ||
3071 | } | ||
3072 | } else { | ||
3073 | r = ring_buffer_resize(global_trace.buffer, | ||
3074 | global_trace.data[cpu]->entries, | ||
3075 | cpu); | ||
3076 | } | ||
3077 | |||
3078 | if (r < 0) { | 3088 | if (r < 0) { |
3079 | /* | 3089 | /* |
3080 | * AARGH! We are left with different | 3090 | * AARGH! We are left with different |
@@ -3212,17 +3222,11 @@ static int tracing_set_tracer(const char *buf) | |||
3212 | 3222 | ||
3213 | topts = create_trace_option_files(t); | 3223 | topts = create_trace_option_files(t); |
3214 | if (t->use_max_tr) { | 3224 | if (t->use_max_tr) { |
3215 | int cpu; | ||
3216 | /* we need to make per cpu buffer sizes equivalent */ | 3225 | /* we need to make per cpu buffer sizes equivalent */ |
3217 | for_each_tracing_cpu(cpu) { | 3226 | ret = resize_buffer_duplicate_size(&max_tr, &global_trace, |
3218 | ret = ring_buffer_resize(max_tr.buffer, | 3227 | RING_BUFFER_ALL_CPUS); |
3219 | global_trace.data[cpu]->entries, | 3228 | if (ret < 0) |
3220 | cpu); | 3229 | goto out; |
3221 | if (ret < 0) | ||
3222 | goto out; | ||
3223 | max_tr.data[cpu]->entries = | ||
3224 | global_trace.data[cpu]->entries; | ||
3225 | } | ||
3226 | } | 3230 | } |
3227 | 3231 | ||
3228 | if (t->init) { | 3232 | if (t->init) { |