tracing: Fix array size mismatch in format string

In event format strings, the array size is reported in two locations.
One in array subscript and then via the "size:" attribute. The values
reported there have a mismatch.

For e.g., in sched:sched_switch the prev_comm and next_comm character
arrays have subscript values as [32] where as the actual field size is
16.

name: sched_switch
ID: 301
format:
field:unsigned short common_type; offset:0; size:2; signed:0;
field:unsigned char common_flags; offset:2; size:1; signed:0;
field:unsigned char common_preempt_count; offset:3; size:1;signed:0;
field:int common_pid; offset:4; size:4; signed:1;

field:char prev_comm[32]; offset:8; size:16; signed:1;
field:pid_t prev_pid; offset:24; size:4; signed:1;
field:int prev_prio; offset:28; size:4; signed:1;
field:long prev_state; offset:32; size:8; signed:1;
field:char next_comm[32]; offset:40; size:16; signed:1;
field:pid_t next_pid; offset:56; size:4; signed:1;
field:int next_prio; offset:60; size:4; signed:1;

After bisection, the following commit was blamed:
92edca0 tracing: Use direct field, type and system names

This commit removes the duplication of strings for field->name and
field->type assuming that all the strings passed in
__trace_define_field() are immutable. This is not true for arrays, where
the type string is created in event_storage variable and field->type for
all array fields points to event_storage.

Use __stringify() to create a string constant for the type string.

Also, get rid of event_storage and event_storage_mutex that are not
needed anymore.

also, an added benefit is that this reduces the overhead of events a bit more:

text data bss dec hex filename
8424787 2036472 1302528 11763787 b3804b vmlinux
8420814 2036408 1302528 11759750 b37086 vmlinux.patched

Link: http://lkml.kernel.org/r/1392349908-29685-1-git-send-email-vnagarnaik@google.com

Cc: Laurent Chavey <chavey@google.com>
Cc: stable@vger.kernel.org # 3.10+
Signed-off-by: Vaibhav Nagarnaik <vnagarnaik@google.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>

authored by Vaibhav Nagarnaik and committed by Steven Rostedt 87291347 dcb99fd9

Changed files
+4 -20
include
linux
trace
kernel
-4
include/linux/ftrace_event.h
··· 495 495 FILTER_TRACE_FN, 496 496 }; 497 497 498 - #define EVENT_STORAGE_SIZE 128 499 - extern struct mutex event_storage_mutex; 500 - extern char event_storage[EVENT_STORAGE_SIZE]; 501 - 502 498 extern int trace_event_raw_init(struct ftrace_event_call *call); 503 499 extern int trace_define_field(struct ftrace_event_call *call, const char *type, 504 500 const char *name, int offset, int size,
+2 -5
include/trace/ftrace.h
··· 310 310 #undef __array 311 311 #define __array(type, item, len) \ 312 312 do { \ 313 - mutex_lock(&event_storage_mutex); \ 313 + char *type_str = #type"["__stringify(len)"]"; \ 314 314 BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \ 315 - snprintf(event_storage, sizeof(event_storage), \ 316 - "%s[%d]", #type, len); \ 317 - ret = trace_define_field(event_call, event_storage, #item, \ 315 + ret = trace_define_field(event_call, type_str, #item, \ 318 316 offsetof(typeof(field), item), \ 319 317 sizeof(field.item), \ 320 318 is_signed_type(type), FILTER_OTHER); \ 321 - mutex_unlock(&event_storage_mutex); \ 322 319 if (ret) \ 323 320 return ret; \ 324 321 } while (0);
-6
kernel/trace/trace_events.c
··· 27 27 28 28 DEFINE_MUTEX(event_mutex); 29 29 30 - DEFINE_MUTEX(event_storage_mutex); 31 - EXPORT_SYMBOL_GPL(event_storage_mutex); 32 - 33 - char event_storage[EVENT_STORAGE_SIZE]; 34 - EXPORT_SYMBOL_GPL(event_storage); 35 - 36 30 LIST_HEAD(ftrace_events); 37 31 static LIST_HEAD(ftrace_common_fields); 38 32
+2 -5
kernel/trace/trace_export.c
··· 95 95 #undef __array 96 96 #define __array(type, item, len) \ 97 97 do { \ 98 + char *type_str = #type"["__stringify(len)"]"; \ 98 99 BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \ 99 - mutex_lock(&event_storage_mutex); \ 100 - snprintf(event_storage, sizeof(event_storage), \ 101 - "%s[%d]", #type, len); \ 102 - ret = trace_define_field(event_call, event_storage, #item, \ 100 + ret = trace_define_field(event_call, type_str, #item, \ 103 101 offsetof(typeof(field), item), \ 104 102 sizeof(field.item), \ 105 103 is_signed_type(type), filter_type); \ 106 - mutex_unlock(&event_storage_mutex); \ 107 104 if (ret) \ 108 105 return ret; \ 109 106 } while (0);