diff options
| author | Steven Rostedt <srostedt@redhat.com> | 2012-08-09 22:26:46 -0400 |
|---|---|---|
| committer | Steven Rostedt <rostedt@goodmis.org> | 2014-03-07 10:06:06 -0500 |
| commit | 35bb4399bd0ef16b8a57fccea0047d98b6b0e7fb (patch) | |
| tree | 16b340bd7b6d1e17e9d78d7d3ea88141cf2e3905 | |
| parent | 1d6bae966e90134bcfd7807b8f9488d55198de91 (diff) | |
tracing: Move event storage for array from macro to standalone function
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>
| -rw-r--r-- | include/linux/ftrace_event.h | 8 | ||||
| -rw-r--r-- | include/trace/ftrace.h | 12 | ||||
| -rw-r--r-- | kernel/trace/trace_events.c | 6 | ||||
| -rw-r--r-- | kernel/trace/trace_export.c | 12 | ||||
| -rw-r--r-- | kernel/trace/trace_output.c | 21 |
5 files changed, 33 insertions, 26 deletions
diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h index a91ab93d7250..ffe642eb84fa 100644 --- a/include/linux/ftrace_event.h +++ b/include/linux/ftrace_event.h | |||
| @@ -202,6 +202,10 @@ extern int ftrace_event_reg(struct ftrace_event_call *event, | |||
| 202 | int ftrace_output_event(struct trace_iterator *iter, struct ftrace_event_call *event, | 202 | int ftrace_output_event(struct trace_iterator *iter, struct ftrace_event_call *event, |
| 203 | char *fmt, ...); | 203 | char *fmt, ...); |
| 204 | 204 | ||
| 205 | int ftrace_event_define_field(struct ftrace_event_call *call, | ||
| 206 | char *type, int len, char *item, int offset, | ||
| 207 | int field_size, int sign, int filter); | ||
| 208 | |||
| 205 | enum { | 209 | enum { |
| 206 | TRACE_EVENT_FL_FILTERED_BIT, | 210 | TRACE_EVENT_FL_FILTERED_BIT, |
| 207 | TRACE_EVENT_FL_CAP_ANY_BIT, | 211 | TRACE_EVENT_FL_CAP_ANY_BIT, |
| @@ -500,10 +504,6 @@ enum { | |||
| 500 | FILTER_TRACE_FN, | 504 | FILTER_TRACE_FN, |
| 501 | }; | 505 | }; |
| 502 | 506 | ||
| 503 | #define EVENT_STORAGE_SIZE 128 | ||
| 504 | extern struct mutex event_storage_mutex; | ||
| 505 | extern char event_storage[EVENT_STORAGE_SIZE]; | ||
| 506 | |||
| 507 | extern int trace_event_raw_init(struct ftrace_event_call *call); | 507 | extern int trace_event_raw_init(struct ftrace_event_call *call); |
| 508 | extern int trace_define_field(struct ftrace_event_call *call, const char *type, | 508 | extern int trace_define_field(struct ftrace_event_call *call, const char *type, |
| 509 | const char *name, int offset, int size, | 509 | const char *name, int offset, int size, |
diff --git a/include/trace/ftrace.h b/include/trace/ftrace.h index 3873d6e4697f..54928faf2119 100644 --- a/include/trace/ftrace.h +++ b/include/trace/ftrace.h | |||
| @@ -302,15 +302,11 @@ static struct trace_event_functions ftrace_event_type_funcs_##call = { \ | |||
| 302 | #undef __array | 302 | #undef __array |
| 303 | #define __array(type, item, len) \ | 303 | #define __array(type, item, len) \ |
| 304 | do { \ | 304 | do { \ |
| 305 | mutex_lock(&event_storage_mutex); \ | ||
| 306 | BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \ | 305 | BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \ |
| 307 | snprintf(event_storage, sizeof(event_storage), \ | 306 | ret = ftrace_event_define_field(event_call, #type, len, \ |
| 308 | "%s[%d]", #type, len); \ | 307 | #item, offsetof(typeof(field), item), \ |
| 309 | ret = trace_define_field(event_call, event_storage, #item, \ | 308 | sizeof(field.item), \ |
| 310 | offsetof(typeof(field), item), \ | 309 | is_signed_type(type), FILTER_OTHER); \ |
| 311 | sizeof(field.item), \ | ||
| 312 | is_signed_type(type), FILTER_OTHER); \ | ||
| 313 | mutex_unlock(&event_storage_mutex); \ | ||
| 314 | if (ret) \ | 310 | if (ret) \ |
| 315 | return ret; \ | 311 | return ret; \ |
| 316 | } while (0); | 312 | } while (0); |
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index e71ffd4eccb5..22826c73a9da 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c | |||
| @@ -27,12 +27,6 @@ | |||
| 27 | 27 | ||
| 28 | DEFINE_MUTEX(event_mutex); | 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 | LIST_HEAD(ftrace_events); | 30 | LIST_HEAD(ftrace_events); |
| 37 | static LIST_HEAD(ftrace_common_fields); | 31 | static LIST_HEAD(ftrace_common_fields); |
| 38 | 32 | ||
diff --git a/kernel/trace/trace_export.c b/kernel/trace/trace_export.c index 7c3e3e72e2b6..39c746c5ae73 100644 --- a/kernel/trace/trace_export.c +++ b/kernel/trace/trace_export.c | |||
| @@ -96,14 +96,10 @@ static void __always_unused ____ftrace_check_##name(void) \ | |||
| 96 | #define __array(type, item, len) \ | 96 | #define __array(type, item, len) \ |
| 97 | do { \ | 97 | do { \ |
| 98 | BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \ | 98 | BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \ |
| 99 | mutex_lock(&event_storage_mutex); \ | 99 | ret = ftrace_event_define_field(event_call, #type, len, \ |
| 100 | snprintf(event_storage, sizeof(event_storage), \ | 100 | #item, offsetof(typeof(field), item), \ |
| 101 | "%s[%d]", #type, len); \ | 101 | sizeof(field.item), \ |
| 102 | ret = trace_define_field(event_call, event_storage, #item, \ | 102 | is_signed_type(type), filter_type); \ |
| 103 | offsetof(typeof(field), item), \ | ||
| 104 | sizeof(field.item), \ | ||
| 105 | is_signed_type(type), filter_type); \ | ||
| 106 | mutex_unlock(&event_storage_mutex); \ | ||
| 107 | if (ret) \ | 103 | if (ret) \ |
| 108 | return ret; \ | 104 | return ret; \ |
| 109 | } while (0); | 105 | } while (0); |
diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c index ca0e79e2abaa..ee8d74840b88 100644 --- a/kernel/trace/trace_output.c +++ b/kernel/trace/trace_output.c | |||
| @@ -20,6 +20,10 @@ static struct hlist_head event_hash[EVENT_HASHSIZE] __read_mostly; | |||
| 20 | 20 | ||
| 21 | static int next_event_type = __TRACE_LAST_TYPE + 1; | 21 | static int next_event_type = __TRACE_LAST_TYPE + 1; |
| 22 | 22 | ||
| 23 | #define EVENT_STORAGE_SIZE 128 | ||
| 24 | static DEFINE_MUTEX(event_storage_mutex); | ||
| 25 | static char event_storage[EVENT_STORAGE_SIZE]; | ||
| 26 | |||
| 23 | int trace_print_seq(struct seq_file *m, struct trace_seq *s) | 27 | int trace_print_seq(struct seq_file *m, struct trace_seq *s) |
| 24 | { | 28 | { |
| 25 | int len = s->len >= PAGE_SIZE ? PAGE_SIZE - 1 : s->len; | 29 | 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, ...) | |||
| 470 | } | 474 | } |
| 471 | EXPORT_SYMBOL_GPL(ftrace_output_call); | 475 | EXPORT_SYMBOL_GPL(ftrace_output_call); |
| 472 | 476 | ||
| 477 | int ftrace_event_define_field(struct ftrace_event_call *call, | ||
| 478 | char *type, int len, char *item, int offset, | ||
| 479 | int field_size, int sign, int filter) | ||
| 480 | { | ||
| 481 | int ret; | ||
| 482 | |||
| 483 | mutex_lock(&event_storage_mutex); | ||
| 484 | snprintf(event_storage, sizeof(event_storage), | ||
| 485 | "%s[%d]", type, len); | ||
| 486 | ret = trace_define_field(call, event_storage, item, offset, | ||
| 487 | field_size, sign, filter); | ||
| 488 | mutex_unlock(&event_storage_mutex); | ||
| 489 | |||
| 490 | return ret; | ||
| 491 | } | ||
| 492 | EXPORT_SYMBOL_GPL(ftrace_event_define_field); | ||
| 493 | |||
| 473 | #ifdef CONFIG_KRETPROBES | 494 | #ifdef CONFIG_KRETPROBES |
| 474 | static inline const char *kretprobed(const char *name) | 495 | static inline const char *kretprobed(const char *name) |
| 475 | { | 496 | { |
