forked from Minki/linux
0405ab80aa
The raw_init function pointer in the event is used to initialize various kinds of events. The type of initialization needed is usually classed to the kind of event it is. Two events with the same class will always have the same initialization function, so it makes sense to move this to the class structure. Perhaps even making a special system structure would work since the initialization is the same for all events within a system. But since there's no system structure (yet), this will just move it to the class. text data bss dec hex filename 4913961 1088356 861512 6863829 68bbd5 vmlinux.orig 4900375 1053380 861512 6815267 67fe23 vmlinux.fields 4900382 1048964 861512 6810858 67ecea vmlinux.init The text grew very slightly, but this is a constant growth that happened with the changing of the C files that call the init code. The bigger savings is the data which will be saved the more events share a class. Acked-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Acked-by: Masami Hiramatsu <mhiramat@redhat.com> Acked-by: Frederic Weisbecker <fweisbec@gmail.com> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
174 lines
4.3 KiB
C
174 lines
4.3 KiB
C
/*
|
|
* trace_export.c - export basic ftrace utilities to user space
|
|
*
|
|
* Copyright (C) 2009 Steven Rostedt <srostedt@redhat.com>
|
|
*/
|
|
#include <linux/stringify.h>
|
|
#include <linux/kallsyms.h>
|
|
#include <linux/seq_file.h>
|
|
#include <linux/debugfs.h>
|
|
#include <linux/uaccess.h>
|
|
#include <linux/ftrace.h>
|
|
#include <linux/module.h>
|
|
#include <linux/init.h>
|
|
#include <linux/fs.h>
|
|
|
|
#include "trace_output.h"
|
|
|
|
#undef TRACE_SYSTEM
|
|
#define TRACE_SYSTEM ftrace
|
|
|
|
/* not needed for this file */
|
|
#undef __field_struct
|
|
#define __field_struct(type, item)
|
|
|
|
#undef __field
|
|
#define __field(type, item) type item;
|
|
|
|
#undef __field_desc
|
|
#define __field_desc(type, container, item) type item;
|
|
|
|
#undef __array
|
|
#define __array(type, item, size) type item[size];
|
|
|
|
#undef __array_desc
|
|
#define __array_desc(type, container, item, size) type item[size];
|
|
|
|
#undef __dynamic_array
|
|
#define __dynamic_array(type, item) type item[];
|
|
|
|
#undef F_STRUCT
|
|
#define F_STRUCT(args...) args
|
|
|
|
#undef F_printk
|
|
#define F_printk(fmt, args...) fmt, args
|
|
|
|
#undef FTRACE_ENTRY
|
|
#define FTRACE_ENTRY(name, struct_name, id, tstruct, print) \
|
|
struct ____ftrace_##name { \
|
|
tstruct \
|
|
}; \
|
|
static void __always_unused ____ftrace_check_##name(void) \
|
|
{ \
|
|
struct ____ftrace_##name *__entry = NULL; \
|
|
\
|
|
/* force compile-time check on F_printk() */ \
|
|
printk(print); \
|
|
}
|
|
|
|
#undef FTRACE_ENTRY_DUP
|
|
#define FTRACE_ENTRY_DUP(name, struct_name, id, tstruct, print) \
|
|
FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print))
|
|
|
|
#include "trace_entries.h"
|
|
|
|
#undef __field
|
|
#define __field(type, item) \
|
|
ret = trace_define_field(event_call, #type, #item, \
|
|
offsetof(typeof(field), item), \
|
|
sizeof(field.item), \
|
|
is_signed_type(type), FILTER_OTHER); \
|
|
if (ret) \
|
|
return ret;
|
|
|
|
#undef __field_desc
|
|
#define __field_desc(type, container, item) \
|
|
ret = trace_define_field(event_call, #type, #item, \
|
|
offsetof(typeof(field), \
|
|
container.item), \
|
|
sizeof(field.container.item), \
|
|
is_signed_type(type), FILTER_OTHER); \
|
|
if (ret) \
|
|
return ret;
|
|
|
|
#undef __array
|
|
#define __array(type, item, len) \
|
|
BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \
|
|
ret = trace_define_field(event_call, #type "[" #len "]", #item, \
|
|
offsetof(typeof(field), item), \
|
|
sizeof(field.item), \
|
|
is_signed_type(type), FILTER_OTHER); \
|
|
if (ret) \
|
|
return ret;
|
|
|
|
#undef __array_desc
|
|
#define __array_desc(type, container, item, len) \
|
|
BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \
|
|
ret = trace_define_field(event_call, #type "[" #len "]", #item, \
|
|
offsetof(typeof(field), \
|
|
container.item), \
|
|
sizeof(field.container.item), \
|
|
is_signed_type(type), FILTER_OTHER); \
|
|
if (ret) \
|
|
return ret;
|
|
|
|
#undef __dynamic_array
|
|
#define __dynamic_array(type, item) \
|
|
ret = trace_define_field(event_call, #type, #item, \
|
|
offsetof(typeof(field), item), \
|
|
0, is_signed_type(type), FILTER_OTHER);\
|
|
if (ret) \
|
|
return ret;
|
|
|
|
#undef FTRACE_ENTRY
|
|
#define FTRACE_ENTRY(name, struct_name, id, tstruct, print) \
|
|
int \
|
|
ftrace_define_fields_##name(struct ftrace_event_call *event_call) \
|
|
{ \
|
|
struct struct_name field; \
|
|
int ret; \
|
|
\
|
|
tstruct; \
|
|
\
|
|
return ret; \
|
|
}
|
|
|
|
#include "trace_entries.h"
|
|
|
|
static int ftrace_raw_init_event(struct ftrace_event_call *call)
|
|
{
|
|
INIT_LIST_HEAD(&call->class->fields);
|
|
return 0;
|
|
}
|
|
|
|
#undef __entry
|
|
#define __entry REC
|
|
|
|
#undef __field
|
|
#define __field(type, item)
|
|
|
|
#undef __field_desc
|
|
#define __field_desc(type, container, item)
|
|
|
|
#undef __array
|
|
#define __array(type, item, len)
|
|
|
|
#undef __array_desc
|
|
#define __array_desc(type, container, item, len)
|
|
|
|
#undef __dynamic_array
|
|
#define __dynamic_array(type, item)
|
|
|
|
#undef F_printk
|
|
#define F_printk(fmt, args...) #fmt ", " __stringify(args)
|
|
|
|
#undef FTRACE_ENTRY
|
|
#define FTRACE_ENTRY(call, struct_name, type, tstruct, print) \
|
|
\
|
|
struct ftrace_event_class event_class_ftrace_##call = { \
|
|
.system = __stringify(TRACE_SYSTEM), \
|
|
.define_fields = ftrace_define_fields_##call, \
|
|
.raw_init = ftrace_raw_init_event, \
|
|
}; \
|
|
\
|
|
struct ftrace_event_call __used \
|
|
__attribute__((__aligned__(4))) \
|
|
__attribute__((section("_ftrace_events"))) event_##call = { \
|
|
.name = #call, \
|
|
.id = type, \
|
|
.class = &event_class_ftrace_##call, \
|
|
.print_fmt = print, \
|
|
}; \
|
|
|
|
#include "trace_entries.h"
|