Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 35bb4399 authored by Steven Rostedt's avatar Steven Rostedt Committed by Steven Rostedt
Browse files

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: default avatarSteven Rostedt <rostedt@goodmis.org>
parent 1d6bae96
Loading
Loading
Loading
Loading
+4 −4
Original line number Original line Diff line number Diff line
@@ -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,
+4 −8
Original line number Original line Diff line number Diff line
@@ -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, \
				 offsetof(typeof(field), item),		\
				sizeof(field.item),			\
				sizeof(field.item),			\
			 	is_signed_type(type), FILTER_OTHER); \
			 	is_signed_type(type), FILTER_OTHER); \
		mutex_unlock(&event_storage_mutex);			\
		if (ret)						\
		if (ret)						\
			return ret;					\
			return ret;					\
	} while (0);
	} while (0);
+0 −6
Original line number Original line Diff line number Diff line
@@ -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);


+4 −8
Original line number Original line Diff line number Diff line
@@ -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);				\
		ret = trace_define_field(event_call, event_storage, #item, \
				 offsetof(typeof(field), item),		\
				sizeof(field.item),			\
				sizeof(field.item),			\
			 	is_signed_type(type), filter_type);	\
			 	is_signed_type(type), filter_type);	\
		mutex_unlock(&event_storage_mutex);			\
		if (ret)						\
		if (ret)						\
			return ret;					\
			return ret;					\
	} while (0);
	} while (0);
+21 −0
Original line number Original line Diff line number Diff line
@@ -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)
{
{