#include <linux/tracepoint.h>
 
 #define MIGRATE_MODE                                           \
-       {MIGRATE_ASYNC,         "MIGRATE_ASYNC"},               \
-       {MIGRATE_SYNC_LIGHT,    "MIGRATE_SYNC_LIGHT"},          \
-       {MIGRATE_SYNC,          "MIGRATE_SYNC"}         
+       EM( MIGRATE_ASYNC,      "MIGRATE_ASYNC")                \
+       EM( MIGRATE_SYNC_LIGHT, "MIGRATE_SYNC_LIGHT")           \
+       EMe(MIGRATE_SYNC,       "MIGRATE_SYNC")
+
 
 #define MIGRATE_REASON                                         \
-       {MR_COMPACTION,         "compaction"},                  \
-       {MR_MEMORY_FAILURE,     "memory_failure"},              \
-       {MR_MEMORY_HOTPLUG,     "memory_hotplug"},              \
-       {MR_SYSCALL,            "syscall_or_cpuset"},           \
-       {MR_MEMPOLICY_MBIND,    "mempolicy_mbind"},             \
-       {MR_NUMA_MISPLACED,     "numa_misplaced"},              \
-       {MR_CMA,                "cma"}
+       EM( MR_COMPACTION,      "compaction")                   \
+       EM( MR_MEMORY_FAILURE,  "memory_failure")               \
+       EM( MR_MEMORY_HOTPLUG,  "memory_hotplug")               \
+       EM( MR_SYSCALL,         "syscall_or_cpuset")            \
+       EM( MR_MEMPOLICY_MBIND, "mempolicy_mbind")              \
+       EM( MR_NUMA_MISPLACED,  "numa_misplaced")               \
+       EMe(MR_CMA,             "cma")
+
+/*
+ * First define the enums in the above macros to be exported to userspace
+ * via TRACE_DEFINE_ENUM().
+ */
+#undef EM
+#undef EMe
+#define EM(a, b)       TRACE_DEFINE_ENUM(a);
+#define EMe(a, b)      TRACE_DEFINE_ENUM(a);
+
+MIGRATE_MODE
+MIGRATE_REASON
+
+/*
+ * Now redefine the EM() and EMe() macros to map the enums to the strings
+ * that will be printed in the output.
+ */
+#undef EM
+#undef EMe
+#define EM(a, b)       {a, b},
+#define EMe(a, b)      {a, b}
 
 TRACE_EVENT(mm_migrate_pages,