Commit 87291347c49dc40aa339f587b209618201c2e527

Authored by Vaibhav Nagarnaik
Committed by Steven Rostedt
1 parent dcb99fd9b0

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>

Showing 4 changed files with 4 additions and 20 deletions Side-by-side Diff

include/linux/ftrace_event.h
... ... @@ -495,10 +495,6 @@
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,
include/trace/ftrace.h
... ... @@ -310,15 +310,12 @@
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);
kernel/trace/trace_events.c
... ... @@ -27,12 +27,6 @@
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  
kernel/trace/trace_export.c
... ... @@ -95,15 +95,12 @@
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);