tracing: Move event storage for array from macro to standalone function
authorSteven Rostedt <srostedt@redhat.com>
Fri, 10 Aug 2012 02:26:46 +0000 (22:26 -0400)
committerSteven Rostedt <rostedt@goodmis.org>
Fri, 7 Mar 2014 15:06:06 +0000 (10:06 -0500)
The code that shows array fields for events is defined for all events.
This can add up quite a bit when you have over 500 events.

By making helper functions in the core kernel to do the work
instead, we can shrink the size of the kernel down a bit.

With a kernel configured with 502 events, the change in size was:

   text    data     bss     dec     hex filename
12990946        1913568 9785344 24689858        178bcc2 /tmp/vmlinux
12987390        1913504 9785344 24686238        178ae9e /tmp/vmlinux.patched

That's a total of 3556 bytes, which comes down to 7 bytes per event.
Although it's not much, this code is just called at initialization of
the events.

Link: http://lkml.kernel.org/r/20120810034708.084036335@goodmis.org
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
include/linux/ftrace_event.h
include/trace/ftrace.h
kernel/trace/trace_events.c
kernel/trace/trace_export.c
kernel/trace/trace_output.c

index a91ab93d725014f7c63d0aea010b9f2140b35b14..ffe642eb84fa33b8c3b24d8da5e262be63cb5535 100644 (file)
@@ -202,6 +202,10 @@ extern int ftrace_event_reg(struct ftrace_event_call *event,
 int ftrace_output_event(struct trace_iterator *iter, struct ftrace_event_call *event,
                        char *fmt, ...);
 
+int ftrace_event_define_field(struct ftrace_event_call *call,
+                             char *type, int len, char *item, int offset,
+                             int field_size, int sign, int filter);
+
 enum {
        TRACE_EVENT_FL_FILTERED_BIT,
        TRACE_EVENT_FL_CAP_ANY_BIT,
@@ -500,10 +504,6 @@ enum {
        FILTER_TRACE_FN,
 };
 
-#define EVENT_STORAGE_SIZE 128
-extern struct mutex event_storage_mutex;
-extern char event_storage[EVENT_STORAGE_SIZE];
-
 extern int trace_event_raw_init(struct ftrace_event_call *call);
 extern int trace_define_field(struct ftrace_event_call *call, const char *type,
                              const char *name, int offset, int size,
index 3873d6e4697f29ce0b22611fe4a9d6071b0f08ec..54928faf21191f390f026c8a7f9abebe4091e8fe 100644 (file)
@@ -302,15 +302,11 @@ static struct trace_event_functions ftrace_event_type_funcs_##call = {    \
 #undef __array
 #define __array(type, item, len)                                       \
        do {                                                            \
-               mutex_lock(&event_storage_mutex);                       \
                BUILD_BUG_ON(len > MAX_FILTER_STR_VAL);                 \
-               snprintf(event_storage, sizeof(event_storage),          \
-                        "%s[%d]", #type, len);                         \
-               ret = trace_define_field(event_call, event_storage, #item, \
-                                offsetof(typeof(field), item),         \
-                                sizeof(field.item),                    \
-                                is_signed_type(type), FILTER_OTHER);   \
-               mutex_unlock(&event_storage_mutex);                     \
+               ret = ftrace_event_define_field(event_call, #type, len, \
+                               #item, offsetof(typeof(field), item),   \
+                               sizeof(field.item),                     \
+                               is_signed_type(type), FILTER_OTHER); \
                if (ret)                                                \
                        return ret;                                     \
        } while (0);
index e71ffd4eccb5b4d7a7b0234dd72e525b1c647550..22826c73a9da600992184fe8d5ca75e25f26346e 100644 (file)
 
 DEFINE_MUTEX(event_mutex);
 
-DEFINE_MUTEX(event_storage_mutex);
-EXPORT_SYMBOL_GPL(event_storage_mutex);
-
-char event_storage[EVENT_STORAGE_SIZE];
-EXPORT_SYMBOL_GPL(event_storage);
-
 LIST_HEAD(ftrace_events);
 static LIST_HEAD(ftrace_common_fields);
 
index 7c3e3e72e2b6bd2f0a6bd929ff67526497281b4a..39c746c5ae734bf3dbe0da69e98c0524fd6941b9 100644 (file)
@@ -96,14 +96,10 @@ static void __always_unused ____ftrace_check_##name(void)           \
 #define __array(type, item, len)                                       \
        do {                                                            \
                BUILD_BUG_ON(len > MAX_FILTER_STR_VAL);                 \
-               mutex_lock(&event_storage_mutex);                       \
-               snprintf(event_storage, sizeof(event_storage),          \
-                        "%s[%d]", #type, len);                         \
-               ret = trace_define_field(event_call, event_storage, #item, \
-                                offsetof(typeof(field), item),         \
-                                sizeof(field.item),                    \
-                                is_signed_type(type), filter_type);    \
-               mutex_unlock(&event_storage_mutex);                     \
+               ret = ftrace_event_define_field(event_call, #type, len, \
+                               #item, offsetof(typeof(field), item),   \
+                               sizeof(field.item),                     \
+                               is_signed_type(type), filter_type);     \
                if (ret)                                                \
                        return ret;                                     \
        } while (0);
index ca0e79e2abaa6a76fc4d9b83035bb7e829cb1402..ee8d74840b88316c5d41aba0ccd0d931ebf2644d 100644 (file)
@@ -20,6 +20,10 @@ static struct hlist_head event_hash[EVENT_HASHSIZE] __read_mostly;
 
 static int next_event_type = __TRACE_LAST_TYPE + 1;
 
+#define EVENT_STORAGE_SIZE 128
+static DEFINE_MUTEX(event_storage_mutex);
+static char event_storage[EVENT_STORAGE_SIZE];
+
 int trace_print_seq(struct seq_file *m, struct trace_seq *s)
 {
        int len = s->len >= PAGE_SIZE ? PAGE_SIZE - 1 : s->len;
@@ -470,6 +474,23 @@ int ftrace_output_call(struct trace_iterator *iter, char *name, char *fmt, ...)
 }
 EXPORT_SYMBOL_GPL(ftrace_output_call);
 
+int ftrace_event_define_field(struct ftrace_event_call *call,
+                             char *type, int len, char *item, int offset,
+                             int field_size, int sign, int filter)
+{
+       int ret;
+
+       mutex_lock(&event_storage_mutex);
+       snprintf(event_storage, sizeof(event_storage),
+                "%s[%d]", type, len);
+       ret = trace_define_field(call, event_storage, item, offset,
+                                field_size, sign, filter);
+       mutex_unlock(&event_storage_mutex);
+
+       return ret;
+}
+EXPORT_SYMBOL_GPL(ftrace_event_define_field);
+
 #ifdef CONFIG_KRETPROBES
 static inline const char *kretprobed(const char *name)
 {