mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-04-08 13:18:06 +07:00
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>
This commit is contained in:
parent
1d6bae966e
commit
35bb4399bd
@ -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,
|
int ftrace_output_event(struct trace_iterator *iter, struct ftrace_event_call *event,
|
||||||
char *fmt, ...);
|
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 {
|
enum {
|
||||||
TRACE_EVENT_FL_FILTERED_BIT,
|
TRACE_EVENT_FL_FILTERED_BIT,
|
||||||
TRACE_EVENT_FL_CAP_ANY_BIT,
|
TRACE_EVENT_FL_CAP_ANY_BIT,
|
||||||
@ -500,10 +504,6 @@ enum {
|
|||||||
FILTER_TRACE_FN,
|
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_event_raw_init(struct ftrace_event_call *call);
|
||||||
extern int trace_define_field(struct ftrace_event_call *call, const char *type,
|
extern int trace_define_field(struct ftrace_event_call *call, const char *type,
|
||||||
const char *name, int offset, int size,
|
const char *name, int offset, int size,
|
||||||
|
@ -302,15 +302,11 @@ static struct trace_event_functions ftrace_event_type_funcs_##call = { \
|
|||||||
#undef __array
|
#undef __array
|
||||||
#define __array(type, item, len) \
|
#define __array(type, item, len) \
|
||||||
do { \
|
do { \
|
||||||
mutex_lock(&event_storage_mutex); \
|
|
||||||
BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \
|
BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \
|
||||||
snprintf(event_storage, sizeof(event_storage), \
|
ret = ftrace_event_define_field(event_call, #type, len, \
|
||||||
"%s[%d]", #type, len); \
|
#item, offsetof(typeof(field), item), \
|
||||||
ret = trace_define_field(event_call, event_storage, #item, \
|
sizeof(field.item), \
|
||||||
offsetof(typeof(field), item), \
|
is_signed_type(type), FILTER_OTHER); \
|
||||||
sizeof(field.item), \
|
|
||||||
is_signed_type(type), FILTER_OTHER); \
|
|
||||||
mutex_unlock(&event_storage_mutex); \
|
|
||||||
if (ret) \
|
if (ret) \
|
||||||
return ret; \
|
return ret; \
|
||||||
} while (0);
|
} while (0);
|
||||||
|
@ -27,12 +27,6 @@
|
|||||||
|
|
||||||
DEFINE_MUTEX(event_mutex);
|
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);
|
LIST_HEAD(ftrace_events);
|
||||||
static LIST_HEAD(ftrace_common_fields);
|
static LIST_HEAD(ftrace_common_fields);
|
||||||
|
|
||||||
|
@ -96,14 +96,10 @@ static void __always_unused ____ftrace_check_##name(void) \
|
|||||||
#define __array(type, item, len) \
|
#define __array(type, item, len) \
|
||||||
do { \
|
do { \
|
||||||
BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \
|
BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \
|
||||||
mutex_lock(&event_storage_mutex); \
|
ret = ftrace_event_define_field(event_call, #type, len, \
|
||||||
snprintf(event_storage, sizeof(event_storage), \
|
#item, offsetof(typeof(field), item), \
|
||||||
"%s[%d]", #type, len); \
|
sizeof(field.item), \
|
||||||
ret = trace_define_field(event_call, event_storage, #item, \
|
is_signed_type(type), filter_type); \
|
||||||
offsetof(typeof(field), item), \
|
|
||||||
sizeof(field.item), \
|
|
||||||
is_signed_type(type), filter_type); \
|
|
||||||
mutex_unlock(&event_storage_mutex); \
|
|
||||||
if (ret) \
|
if (ret) \
|
||||||
return ret; \
|
return ret; \
|
||||||
} while (0);
|
} while (0);
|
||||||
|
@ -20,6 +20,10 @@ static struct hlist_head event_hash[EVENT_HASHSIZE] __read_mostly;
|
|||||||
|
|
||||||
static int next_event_type = __TRACE_LAST_TYPE + 1;
|
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 trace_print_seq(struct seq_file *m, struct trace_seq *s)
|
||||||
{
|
{
|
||||||
int len = s->len >= PAGE_SIZE ? PAGE_SIZE - 1 : s->len;
|
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);
|
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
|
#ifdef CONFIG_KRETPROBES
|
||||||
static inline const char *kretprobed(const char *name)
|
static inline const char *kretprobed(const char *name)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user