TP_ARGS(dd, index, type, pa, order),
        TP_STRUCT__entry(/* entry */
                DD_DEV_ENTRY(dd)
-               __field(unsigned long, pa);
-               __field(u32, index);
-               __field(u32, type);
-               __field(u16, order);
+               __field(unsigned long, pa)
+               __field(u32, index)
+               __field(u32, type)
+               __field(u16, order)
        ),
        TP_fast_assign(/* assign */
                DD_DEV_ASSIGN(dd);
 
            TP_PROTO(struct hfi1_devdata *dd, u16 ctxt, u8 subctxt, u16 *i),
            TP_ARGS(dd, ctxt, subctxt, i),
            TP_STRUCT__entry(
-                   DD_DEV_ENTRY(dd);
+                   DD_DEV_ENTRY(dd)
                    __field(u16, ctxt)
                    __field(u8, subctxt)
                    __field(u8, ver_opcode)
 
        TP_STRUCT__entry(
                __string(name, name)
                __field(u64, ppa)
-               __field(int, state);
+               __field(int, state)
        ),
 
        TP_fast_assign(
        TP_STRUCT__entry(
                __string(name, name)
                __field(u64, ppa)
-               __field(int, state);
+               __field(int, state)
        ),
 
        TP_fast_assign(
        TP_STRUCT__entry(
                __string(name, name)
                __field(int, line)
-               __field(int, state);
+               __field(int, state)
        ),
 
        TP_fast_assign(
 
        TP_STRUCT__entry(
                __string(name, name)
-               __field(int, state);
+               __field(int, state)
        ),
 
        TP_fast_assign(
 
                __field(u8, cs_busy)
                __field(u8, cs_complete)
                __field(int, timeout)
-               __field(int, ret);
+               __field(int, ret)
        ),
        TP_fast_assign(
                __entry->cr_req = cr->bits.req_code;
 
        TP_STRUCT__entry(
                __string(device, dev_name(ar->dev))
                __string(driver, dev_driver_string(ar->dev))
-               __field(u8, hw_type);
+               __field(u8, hw_type)
                __field(size_t, buf_len)
                __dynamic_array(u8, buf, buf_len)
        ),
        TP_STRUCT__entry(
                __string(device, dev_name(ar->dev))
                __string(driver, dev_driver_string(ar->dev))
-               __field(u8, hw_type);
+               __field(u8, hw_type)
                __field(u16, buf_len)
                __dynamic_array(u8, pktlog, buf_len)
        ),
        TP_STRUCT__entry(
                __string(device, dev_name(ar->dev))
                __string(driver, dev_driver_string(ar->dev))
-               __field(u8, hw_type);
+               __field(u8, hw_type)
                __field(u16, len)
                __dynamic_array(u8, rxdesc, len)
        ),
 
                __field(int, level)
                __field(xfs_agnumber_t, agno)
                __field(xfs_agblock_t, bno)
-               __field(int, ptr);
+               __field(int, ptr)
                __field(int, error)
                __field(void *, ret_ip)
        ),
                __field(int, level)
                __field(xfs_agnumber_t, agno)
                __field(xfs_agblock_t, bno)
-               __field(int, ptr);
+               __field(int, ptr)
                __field(void *, ret_ip)
        ),
        TP_fast_assign(
                __field(int, level)
                __field(xfs_agnumber_t, agno)
                __field(xfs_agblock_t, bno)
-               __field(int, ptr);
+               __field(int, ptr)
                __field(void *, ret_ip)
        ),
        TP_fast_assign(
 
        TP_STRUCT__entry(
                __field(dev_t, dev)
                __field(xfs_ino_t, ino)
-               __field(void *, leaf);
-               __field(int, pos);
+               __field(void *, leaf)
+               __field(int, pos)
                __field(xfs_fileoff_t, startoff)
                __field(xfs_fsblock_t, startblock)
                __field(xfs_filblks_t, blockcount)
 
 
 struct trace_event_call;
 
+#define TRACE_FUNCTION_TYPE ((const char *)~0UL)
+
+struct trace_event_fields {
+       const char *type;
+       union {
+               struct {
+                       const char *name;
+                       const int  size;
+                       const int  align;
+                       const int  is_signed;
+                       const int  filter_type;
+               };
+               int (*define_fields)(struct trace_event_call *);
+       };
+};
+
 struct trace_event_class {
        const char              *system;
        void                    *probe;
 #endif
        int                     (*reg)(struct trace_event_call *event,
                                       enum trace_reg type, void *data);
-       int                     (*define_fields)(struct trace_event_call *);
+       struct trace_event_fields *fields_array;
        struct list_head        *(*get_fields)(struct trace_event_call *);
        struct list_head        fields;
        int                     (*raw_init)(struct trace_event_call *);
 
                TP_ARGS(file, old),
 
                TP_STRUCT__entry(
-                       __field(struct file *, file);
+                       __field(struct file *, file)
                        __field(unsigned long, i_ino)
                        __field(dev_t, s_dev)
                        __field(errseq_t, old)
 
        TP_ARGS(rdma, page),
 
        TP_STRUCT__entry(
-               __field(const void *, page);
+               __field(const void *, page)
                __string(device, rdma->sc_cm_id->device->name)
                __string(addr, rdma->sc_xprt.xpt_remotebuf)
        ),
 
 #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
 
 #undef __field_ext
-#define __field_ext(type, item, filter_type)                           \
-       ret = trace_define_field(event_call, #type, #item,              \
-                                offsetof(typeof(field), item),         \
-                                sizeof(field.item),                    \
-                                is_signed_type(type), filter_type);    \
-       if (ret)                                                        \
-               return ret;
+#define __field_ext(_type, _item, _filter_type) {                      \
+       .type = #_type, .name = #_item,                                 \
+       .size = sizeof(_type), .align = __alignof__(_type),             \
+       .is_signed = is_signed_type(_type), .filter_type = _filter_type },
 
 #undef __field_struct_ext
-#define __field_struct_ext(type, item, filter_type)                    \
-       ret = trace_define_field(event_call, #type, #item,              \
-                                offsetof(typeof(field), item),         \
-                                sizeof(field.item),                    \
-                                0, filter_type);                       \
-       if (ret)                                                        \
-               return ret;
+#define __field_struct_ext(_type, _item, _filter_type) {               \
+       .type = #_type, .name = #_item,                                 \
+       .size = sizeof(_type), .align = __alignof__(_type),             \
+       0, .filter_type = _filter_type },
 
 #undef __field
 #define __field(type, item)    __field_ext(type, item, FILTER_OTHER)
 #define __field_struct(type, item) __field_struct_ext(type, item, FILTER_OTHER)
 
 #undef __array
-#define __array(type, item, len)                                       \
-       do {                                                            \
-               char *type_str = #type"["__stringify(len)"]";           \
-               BUILD_BUG_ON(len > MAX_FILTER_STR_VAL);                 \
-               BUILD_BUG_ON(len <= 0);                                 \
-               ret = trace_define_field(event_call, type_str, #item,   \
-                                offsetof(typeof(field), item),         \
-                                sizeof(field.item),                    \
-                                is_signed_type(type), FILTER_OTHER);   \
-               if (ret)                                                \
-                       return ret;                                     \
-       } while (0);
+#define __array(_type, _item, _len) {                                  \
+       .type = #_type"["__stringify(_len)"]", .name = #_item,          \
+       .size = sizeof(_type[_len]), .align = __alignof__(_type),       \
+       .is_signed = is_signed_type(_type), .filter_type = FILTER_OTHER },
 
 #undef __dynamic_array
-#define __dynamic_array(type, item, len)                                      \
-       ret = trace_define_field(event_call, "__data_loc " #type "[]", #item,  \
-                                offsetof(typeof(field), __data_loc_##item),   \
-                                sizeof(field.__data_loc_##item),              \
-                                is_signed_type(type), FILTER_OTHER);
+#define __dynamic_array(_type, _item, _len) {                          \
+       .type = "__data_loc " #_type "[]", .name = #_item,              \
+       .size = 4, .align = 4,                                          \
+       .is_signed = is_signed_type(_type), .filter_type = FILTER_OTHER },
 
 #undef __string
 #define __string(item, src) __dynamic_array(char, item, -1)
 
 #undef DECLARE_EVENT_CLASS
 #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, func, print)   \
-static int notrace __init                                              \
-trace_event_define_fields_##call(struct trace_event_call *event_call)  \
-{                                                                      \
-       struct trace_event_raw_##call field;                            \
-       int ret;                                                        \
-                                                                       \
-       tstruct;                                                        \
-                                                                       \
-       return ret;                                                     \
-}
+static struct trace_event_fields trace_event_fields_##call[] = {       \
+       tstruct                                                         \
+       {} };
 
 #undef DEFINE_EVENT
 #define DEFINE_EVENT(template, name, proto, args)
  *
  * static struct trace_event_class __used event_class_<template> = {
  *     .system                 = "<system>",
- *     .define_fields          = trace_event_define_fields_<call>,
+ *     .fields_array           = trace_event_fields_<call>,
  *     .fields                 = LIST_HEAD_INIT(event_class_##call.fields),
  *     .raw_init               = trace_event_raw_init,
  *     .probe                  = trace_event_raw_event_##call,
 static char print_fmt_##call[] = print;                                        \
 static struct trace_event_class __used __refdata event_class_##call = { \
        .system                 = TRACE_SYSTEM_STRING,                  \
-       .define_fields          = trace_event_define_fields_##call,     \
+       .fields_array           = trace_event_fields_##call,            \
        .fields                 = LIST_HEAD_INIT(event_class_##call.fields),\
        .raw_init               = trace_event_raw_init,                 \
        .probe                  = trace_event_raw_event_##call,         \
 
 #undef __field
 #define __field(type, item)            type    item;
 
+#undef __field_fn
+#define __field_fn(type, item)         type    item;
+
 #undef __field_struct
 #define __field_struct(type, item)     __field(type, item)
 
 #define F_STRUCT(args...)              args
 
 #undef FTRACE_ENTRY
-#define FTRACE_ENTRY(name, struct_name, id, tstruct, print, filter)    \
+#define FTRACE_ENTRY(name, struct_name, id, tstruct, print)            \
        struct struct_name {                                            \
                struct trace_entry      ent;                            \
                tstruct                                                 \
        }
 
 #undef FTRACE_ENTRY_DUP
-#define FTRACE_ENTRY_DUP(name, name_struct, id, tstruct, printk, filter)
+#define FTRACE_ENTRY_DUP(name, name_struct, id, tstruct, printk)
 
 #undef FTRACE_ENTRY_REG
-#define FTRACE_ENTRY_REG(name, struct_name, id, tstruct, print,        \
-                        filter, regfn) \
-       FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print), \
-                    filter)
+#define FTRACE_ENTRY_REG(name, struct_name, id, tstruct, print,        regfn)  \
+       FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print))
 
 #undef FTRACE_ENTRY_PACKED
-#define FTRACE_ENTRY_PACKED(name, struct_name, id, tstruct, print,     \
-                           filter)                                     \
-       FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print), \
-                    filter) __packed
+#define FTRACE_ENTRY_PACKED(name, struct_name, id, tstruct, print)     \
+       FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print)) __packed
 
 #include "trace_entries.h"
 
 #define internal_trace_puts(str) __trace_puts(_THIS_IP_, str, strlen(str))
 
 #undef FTRACE_ENTRY
-#define FTRACE_ENTRY(call, struct_name, id, tstruct, print, filter)    \
+#define FTRACE_ENTRY(call, struct_name, id, tstruct, print)    \
        extern struct trace_event_call                                  \
        __aligned(4) event_##call;
 #undef FTRACE_ENTRY_DUP
-#define FTRACE_ENTRY_DUP(call, struct_name, id, tstruct, print, filter)        \
-       FTRACE_ENTRY(call, struct_name, id, PARAMS(tstruct), PARAMS(print), \
-                    filter)
+#define FTRACE_ENTRY_DUP(call, struct_name, id, tstruct, print)        \
+       FTRACE_ENTRY(call, struct_name, id, PARAMS(tstruct), PARAMS(print))
 #undef FTRACE_ENTRY_PACKED
-#define FTRACE_ENTRY_PACKED(call, struct_name, id, tstruct, print, filter) \
-       FTRACE_ENTRY(call, struct_name, id, PARAMS(tstruct), PARAMS(print), \
-                    filter)
+#define FTRACE_ENTRY_PACKED(call, struct_name, id, tstruct, print) \
+       FTRACE_ENTRY(call, struct_name, id, PARAMS(tstruct), PARAMS(print))
 
 #include "trace_entries.h"
 
 
        TRACE_FN,
 
        F_STRUCT(
-               __field(        unsigned long,  ip              )
-               __field(        unsigned long,  parent_ip       )
+               __field_fn(     unsigned long,  ip              )
+               __field_fn(     unsigned long,  parent_ip       )
        ),
 
        F_printk(" %ps <-- %ps",
                 (void *)__entry->ip, (void *)__entry->parent_ip),
 
-       FILTER_TRACE_FN,
-
        perf_ftrace_event_register
 );
 
                __field_desc(   int,            graph_ent,      depth           )
        ),
 
-       F_printk("--> %ps (%d)", (void *)__entry->func, __entry->depth),
-
-       FILTER_OTHER
+       F_printk("--> %ps (%d)", (void *)__entry->func, __entry->depth)
 );
 
 /* Function return entry */
        F_STRUCT(
                __field_struct( struct ftrace_graph_ret,        ret     )
                __field_desc(   unsigned long,  ret,            func    )
+               __field_desc(   unsigned long,  ret,            overrun )
                __field_desc(   unsigned long long, ret,        calltime)
                __field_desc(   unsigned long long, ret,        rettime )
-               __field_desc(   unsigned long,  ret,            overrun )
                __field_desc(   int,            ret,            depth   )
        ),
 
        F_printk("<-- %ps (%d) (start: %llx  end: %llx) over: %d",
                 (void *)__entry->func, __entry->depth,
                 __entry->calltime, __entry->rettime,
-                __entry->depth),
-
-       FILTER_OTHER
+                __entry->depth)
 );
 
 /*
        F_printk("%u:%u:%u  ==> %u:%u:%u [%03u]",
                 __entry->prev_pid, __entry->prev_prio, __entry->prev_state,
                 __entry->next_pid, __entry->next_prio, __entry->next_state,
-                __entry->next_cpu),
-
-       FILTER_OTHER
+                __entry->next_cpu)
 );
 
 /*
        F_printk("%u:%u:%u  ==+ %u:%u:%u [%03u]",
                 __entry->prev_pid, __entry->prev_prio, __entry->prev_state,
                 __entry->next_pid, __entry->next_prio, __entry->next_state,
-                __entry->next_cpu),
-
-       FILTER_OTHER
+                __entry->next_cpu)
 );
 
 /*
                 (void *)__entry->caller[0], (void *)__entry->caller[1],
                 (void *)__entry->caller[2], (void *)__entry->caller[3],
                 (void *)__entry->caller[4], (void *)__entry->caller[5],
-                (void *)__entry->caller[6], (void *)__entry->caller[7]),
-
-       FILTER_OTHER
+                (void *)__entry->caller[6], (void *)__entry->caller[7])
 );
 
 FTRACE_ENTRY(user_stack, userstack_entry,
                 (void *)__entry->caller[0], (void *)__entry->caller[1],
                 (void *)__entry->caller[2], (void *)__entry->caller[3],
                 (void *)__entry->caller[4], (void *)__entry->caller[5],
-                (void *)__entry->caller[6], (void *)__entry->caller[7]),
-
-       FILTER_OTHER
+                (void *)__entry->caller[6], (void *)__entry->caller[7])
 );
 
 /*
        ),
 
        F_printk("%ps: %s",
-                (void *)__entry->ip, __entry->fmt),
-
-       FILTER_OTHER
+                (void *)__entry->ip, __entry->fmt)
 );
 
 FTRACE_ENTRY_REG(print, print_entry,
        F_printk("%ps: %s",
                 (void *)__entry->ip, __entry->buf),
 
-       FILTER_OTHER,
-
        ftrace_event_register
 );
 
        ),
 
        F_printk("id:%04x %08x",
-                __entry->id, (int)__entry->buf[0]),
-
-       FILTER_OTHER
+                __entry->id, (int)__entry->buf[0])
 );
 
 FTRACE_ENTRY(bputs, bputs_entry,
        ),
 
        F_printk("%ps: %s",
-                (void *)__entry->ip, __entry->str),
-
-       FILTER_OTHER
+                (void *)__entry->ip, __entry->str)
 );
 
 FTRACE_ENTRY(mmiotrace_rw, trace_mmiotrace_rw,
                __field_desc(   resource_size_t, rw,    phys    )
                __field_desc(   unsigned long,  rw,     value   )
                __field_desc(   unsigned long,  rw,     pc      )
-               __field_desc(   int,            rw,     map_id  )
+               __field_desc(   int,            rw,     map_id  )
                __field_desc(   unsigned char,  rw,     opcode  )
                __field_desc(   unsigned char,  rw,     width   )
        ),
 
        F_printk("%lx %lx %lx %d %x %x",
                 (unsigned long)__entry->phys, __entry->value, __entry->pc,
-                __entry->map_id, __entry->opcode, __entry->width),
-
-       FILTER_OTHER
+                __entry->map_id, __entry->opcode, __entry->width)
 );
 
 FTRACE_ENTRY(mmiotrace_map, trace_mmiotrace_map,
                __field_desc(   resource_size_t, map,   phys    )
                __field_desc(   unsigned long,  map,    virt    )
                __field_desc(   unsigned long,  map,    len     )
-               __field_desc(   int,            map,    map_id  )
+               __field_desc(   int,            map,    map_id  )
                __field_desc(   unsigned char,  map,    opcode  )
        ),
 
        F_printk("%lx %lx %lx %d %x",
                 (unsigned long)__entry->phys, __entry->virt, __entry->len,
-                __entry->map_id, __entry->opcode),
-
-       FILTER_OTHER
+                __entry->map_id, __entry->opcode)
 );
 
 
        F_printk("%u:%s:%s (%u)%s",
                 __entry->line,
                 __entry->func, __entry->file, __entry->correct,
-                __entry->constant ? " CONSTANT" : ""),
-
-       FILTER_OTHER
+                __entry->constant ? " CONSTANT" : "")
 );
 
 
                 __entry->duration,
                 __entry->outer_duration,
                 __entry->nmi_total_ts,
-                __entry->nmi_count),
-
-       FILTER_OTHER
+                __entry->nmi_count)
 );
 
 #include <linux/delay.h>
 
 #include <trace/events/sched.h>
+#include <trace/syscall.h>
 
 #include <asm/setup.h>
 
         */
        head = trace_get_fields(call);
        if (list_empty(head)) {
-               ret = call->class->define_fields(call);
+               struct trace_event_fields *field = call->class->fields_array;
+               unsigned int offset = sizeof(struct trace_entry);
+
+               for (; field->type; field++) {
+                       if (field->type == TRACE_FUNCTION_TYPE) {
+                               ret = field->define_fields(call);
+                               break;
+                       }
+
+                       offset = ALIGN(offset, field->align);
+                       ret = trace_define_field(call, field->type, field->name,
+                                                offset, field->size,
+                                                field->is_signed, field->filter_type);
+                       if (ret)
+                               break;
+
+                       offset += field->size;
+               }
                if (ret < 0) {
                        pr_warn("Could not initialize trace point events/%s\n",
                                name);
 
        return NULL;
 }
 
+static struct trace_event_fields synth_event_fields_array[] = {
+       { .type = TRACE_FUNCTION_TYPE,
+         .define_fields = synth_event_define_fields },
+       {}
+};
+
 static int register_synth_event(struct synth_event *event)
 {
        struct trace_event_call *call = &event->call;
 
        INIT_LIST_HEAD(&call->class->fields);
        call->event.funcs = &synth_event_funcs;
-       call->class->define_fields = synth_event_define_fields;
+       call->class->fields_array = synth_event_fields_array;
 
        ret = register_trace_event(&call->event);
        if (!ret) {
 
  * function and thus become accesible via perf.
  */
 #undef FTRACE_ENTRY_REG
-#define FTRACE_ENTRY_REG(name, struct_name, id, tstruct, print, \
-                        filter, regfn) \
-       FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print), \
-                    filter)
+#define FTRACE_ENTRY_REG(name, struct_name, id, tstruct, print, regfn) \
+       FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print))
 
 /* not needed for this file */
 #undef __field_struct
 #undef __field
 #define __field(type, item)                            type item;
 
+#undef __field_fn
+#define __field_fn(type, item)                         type item;
+
 #undef __field_desc
 #define __field_desc(type, container, item)            type item;
 
 #define F_printk(fmt, args...) fmt, args
 
 #undef FTRACE_ENTRY
-#define FTRACE_ENTRY(name, struct_name, id, tstruct, print, filter)    \
+#define FTRACE_ENTRY(name, struct_name, id, tstruct, print)            \
 struct ____ftrace_##name {                                             \
        tstruct                                                         \
 };                                                                     \
 }
 
 #undef FTRACE_ENTRY_DUP
-#define FTRACE_ENTRY_DUP(name, struct_name, id, tstruct, print, filter)        \
-       FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print), \
-                    filter)
+#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_ext
+#define __field_ext(_type, _item, _filter_type) {                      \
+       .type = #_type, .name = #_item,                                 \
+       .size = sizeof(_type), .align = __alignof__(_type),             \
+       is_signed_type(_type), .filter_type = _filter_type },
+
 #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_type);    \
-       if (ret)                                                        \
-               return ret;
+#define __field(_type, _item) __field_ext(_type, _item, FILTER_OTHER)
+
+#undef __field_fn
+#define __field_fn(_type, _item) __field_ext(_type, _item, FILTER_TRACE_FN)
 
 #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_type);    \
-       if (ret)                                                        \
-               return ret;
+#define __field_desc(_type, _container, _item) __field_ext(_type, _item, FILTER_OTHER)
 
 #undef __array
-#define __array(type, item, len)                                       \
-       do {                                                            \
-               char *type_str = #type"["__stringify(len)"]";           \
-               BUILD_BUG_ON(len > MAX_FILTER_STR_VAL);                 \
-               ret = trace_define_field(event_call, type_str, #item,   \
-                                offsetof(typeof(field), item),         \
-                                sizeof(field.item),                    \
-                                is_signed_type(type), filter_type);    \
-               if (ret)                                                \
-                       return ret;                                     \
-       } while (0);
+#define __array(_type, _item, _len) {                                  \
+       .type = #_type"["__stringify(_len)"]", .name = #_item,          \
+       .size = sizeof(_type[_len]), .align = __alignof__(_type),       \
+       is_signed_type(_type), .filter_type = FILTER_OTHER },
 
 #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_type);    \
-       if (ret)                                                        \
-               return ret;
+#define __array_desc(_type, _container, _item, _len) __array(_type, _item, _len)
 
 #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_type);\
-       if (ret)                                                        \
-               return ret;
+#define __dynamic_array(_type, _item) {                                        \
+       .type = #_type "[]", .name = #_item,                            \
+       .size = 0, .align = __alignof__(_type),                         \
+       is_signed_type(_type), .filter_type = FILTER_OTHER },
 
 #undef FTRACE_ENTRY
-#define FTRACE_ENTRY(name, struct_name, id, tstruct, print, filter)    \
-static int __init                                                      \
-ftrace_define_fields_##name(struct trace_event_call *event_call)       \
-{                                                                      \
-       struct struct_name field;                                       \
-       int ret;                                                        \
-       int filter_type = filter;                                       \
-                                                                       \
-       tstruct;                                                        \
-                                                                       \
-       return ret;                                                     \
-}
+#define FTRACE_ENTRY(name, struct_name, id, tstruct, print)            \
+static struct trace_event_fields ftrace_event_fields_##name[] = {      \
+       tstruct                                                         \
+       {} };
 
 #include "trace_entries.h"
 
 #undef __field
 #define __field(type, item)
 
+#undef __field_fn
+#define __field_fn(type, item)
+
 #undef __field_desc
 #define __field_desc(type, container, item)
 
 #define F_printk(fmt, args...) __stringify(fmt) ", "  __stringify(args)
 
 #undef FTRACE_ENTRY_REG
-#define FTRACE_ENTRY_REG(call, struct_name, etype, tstruct, print, filter,\
-                        regfn)                                         \
-                                                                       \
+#define FTRACE_ENTRY_REG(call, struct_name, etype, tstruct, print, regfn) \
 struct trace_event_class __refdata event_class_ftrace_##call = {       \
        .system                 = __stringify(TRACE_SYSTEM),            \
-       .define_fields          = ftrace_define_fields_##call,          \
+       .fields_array           = ftrace_event_fields_##call,           \
        .fields                 = LIST_HEAD_INIT(event_class_ftrace_##call.fields),\
        .reg                    = regfn,                                \
 };                                                                     \
 __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call;
 
 #undef FTRACE_ENTRY
-#define FTRACE_ENTRY(call, struct_name, etype, tstruct, print, filter) \
+#define FTRACE_ENTRY(call, struct_name, etype, tstruct, print)         \
        FTRACE_ENTRY_REG(call, struct_name, etype,                      \
-                        PARAMS(tstruct), PARAMS(print), filter, NULL)
+                        PARAMS(tstruct), PARAMS(print), NULL)
 
 bool ftrace_event_is_function(struct trace_event_call *call)
 {
 
        .trace          = print_kprobe_event
 };
 
+static struct trace_event_fields kretprobe_fields_array[] = {
+       { .type = TRACE_FUNCTION_TYPE,
+         .define_fields = kretprobe_event_define_fields },
+       {}
+};
+
+static struct trace_event_fields kprobe_fields_array[] = {
+       { .type = TRACE_FUNCTION_TYPE,
+         .define_fields = kprobe_event_define_fields },
+       {}
+};
+
 static inline void init_trace_event_call(struct trace_kprobe *tk)
 {
        struct trace_event_call *call = trace_probe_event_call(&tk->tp);
 
        if (trace_kprobe_is_return(tk)) {
                call->event.funcs = &kretprobe_funcs;
-               call->class->define_fields = kretprobe_event_define_fields;
+               call->class->fields_array = kretprobe_fields_array;
        } else {
                call->event.funcs = &kprobe_funcs;
-               call->class->define_fields = kprobe_event_define_fields;
+               call->class->fields_array = kprobe_fields_array;
        }
 
        call->flags = TRACE_EVENT_FL_KPROBE;
 
 
 extern char *__bad_type_size(void);
 
-#define SYSCALL_FIELD(type, field, name)                               \
-       sizeof(type) != sizeof(trace.field) ?                           \
-               __bad_type_size() :                                     \
-               #type, #name, offsetof(typeof(trace), field),           \
-               sizeof(trace.field), is_signed_type(type)
+#define SYSCALL_FIELD(_type, _name) {                                  \
+       .type = #_type, .name = #_name,                                 \
+       .size = sizeof(_type), .align = __alignof__(_type),             \
+       .is_signed = is_signed_type(_type), .filter_type = FILTER_OTHER }
 
 static int __init
 __set_enter_print_fmt(struct syscall_metadata *entry, char *buf, int len)
 {
        struct syscall_trace_enter trace;
        struct syscall_metadata *meta = call->data;
-       int ret;
-       int i;
        int offset = offsetof(typeof(trace), args);
-
-       ret = trace_define_field(call, SYSCALL_FIELD(int, nr, __syscall_nr),
-                                FILTER_OTHER);
-       if (ret)
-               return ret;
+       int ret, i;
 
        for (i = 0; i < meta->nb_args; i++) {
                ret = trace_define_field(call, meta->types[i],
                                         meta->args[i], offset,
                                         sizeof(unsigned long), 0,
                                         FILTER_OTHER);
+               if (ret)
+                       break;
                offset += sizeof(unsigned long);
        }
 
        return ret;
 }
 
-static int __init syscall_exit_define_fields(struct trace_event_call *call)
-{
-       struct syscall_trace_exit trace;
-       int ret;
-
-       ret = trace_define_field(call, SYSCALL_FIELD(int, nr, __syscall_nr),
-                                FILTER_OTHER);
-       if (ret)
-               return ret;
-
-       ret = trace_define_field(call, SYSCALL_FIELD(long, ret, ret),
-                                FILTER_OTHER);
-
-       return ret;
-}
-
 static void ftrace_syscall_enter(void *data, struct pt_regs *regs, long id)
 {
        struct trace_array *tr = data;
        return id;
 }
 
+static struct trace_event_fields __refdata syscall_enter_fields_array[] = {
+       SYSCALL_FIELD(int, __syscall_nr),
+       { .type = TRACE_FUNCTION_TYPE,
+         .define_fields = syscall_enter_define_fields },
+       {}
+};
+
 struct trace_event_functions enter_syscall_print_funcs = {
        .trace          = print_syscall_enter,
 };
 struct trace_event_class __refdata event_class_syscall_enter = {
        .system         = "syscalls",
        .reg            = syscall_enter_register,
-       .define_fields  = syscall_enter_define_fields,
+       .fields_array   = syscall_enter_fields_array,
        .get_fields     = syscall_get_enter_fields,
        .raw_init       = init_syscall_trace,
 };
 struct trace_event_class __refdata event_class_syscall_exit = {
        .system         = "syscalls",
        .reg            = syscall_exit_register,
-       .define_fields  = syscall_exit_define_fields,
+       .fields_array   = (struct trace_event_fields[]){
+               SYSCALL_FIELD(int, __syscall_nr),
+               SYSCALL_FIELD(long, ret),
+               {}
+       },
        .fields         = LIST_HEAD_INIT(event_class_syscall_exit.fields),
        .raw_init       = init_syscall_trace,
 };
 
        .trace          = print_uprobe_event
 };
 
+static struct trace_event_fields uprobe_fields_array[] = {
+       { .type = TRACE_FUNCTION_TYPE,
+         .define_fields = uprobe_event_define_fields },
+       {}
+};
+
 static inline void init_trace_event_call(struct trace_uprobe *tu)
 {
        struct trace_event_call *call = trace_probe_event_call(&tu->tp);
-
        call->event.funcs = &uprobe_funcs;
-       call->class->define_fields = uprobe_event_define_fields;
+       call->class->fields_array = uprobe_fields_array;
 
        call->flags = TRACE_EVENT_FL_UPROBE | TRACE_EVENT_FL_CAP_ANY;
        call->class->reg = trace_uprobe_register;
 
                __field(u32, basic_rates)
                __array(int, mcast_rate, NUM_NL80211_BANDS)
                __field(u16, ht_operation_mode)
-               __field(s32, cqm_rssi_thold);
-               __field(s32, cqm_rssi_hyst);
-               __field(u32, channel_width);
-               __field(u32, channel_cfreq1);
+               __field(s32, cqm_rssi_thold)
+               __field(s32, cqm_rssi_hyst)
+               __field(u32, channel_width)
+               __field(u32, channel_cfreq1)
                __dynamic_array(u32, arp_addr_list,
                                info->arp_addr_cnt > IEEE80211_BSS_ARP_ADDR_LIST_LEN ?
                                        IEEE80211_BSS_ARP_ADDR_LIST_LEN :
-                                       info->arp_addr_cnt);
-               __field(int, arp_addr_cnt);
-               __field(bool, qos);
-               __field(bool, idle);
-               __field(bool, ps);
-               __dynamic_array(u8, ssid, info->ssid_len);
-               __field(bool, hidden_ssid);
+                                       info->arp_addr_cnt)
+               __field(int, arp_addr_cnt)
+               __field(bool, qos)
+               __field(bool, idle)
+               __field(bool, ps)
+               __dynamic_array(u8, ssid, info->ssid_len)
+               __field(bool, hidden_ssid)
                __field(int, txpower)
                __field(u8, p2p_oppps_ctwindow)
        ),
                VIF_ENTRY
                __field(u8, dtimper)
                __field(u16, bcnint)
-               __dynamic_array(u8, ssid, info->ssid_len);
-               __field(bool, hidden_ssid);
+               __dynamic_array(u8, ssid, info->ssid_len)
+               __field(bool, hidden_ssid)
        ),
 
        TP_fast_assign(
                VIF_ENTRY
                __field(u8, dtimper)
                __field(u16, bcnint)
-               __dynamic_array(u8, ssid, info->ssid_len);
+               __dynamic_array(u8, ssid, info->ssid_len)
        ),
 
        TP_fast_assign(
 
                WIPHY_ENTRY
                WDEV_ENTRY
                __field(u8, master_pref)
-               __field(u8, bands);
+               __field(u8, bands)
        ),
        TP_fast_assign(
                WIPHY_ASSIGN;
                WIPHY_ENTRY
                WDEV_ENTRY
                __field(u8, master_pref)
-               __field(u8, bands);
-               __field(u32, changes);
+               __field(u8, bands)
+               __field(u32, changes)
        ),
        TP_fast_assign(
                WIPHY_ASSIGN;