extern unsigned long compaction_suitable(struct zone *zone, int order,
                                        int alloc_flags, int classzone_idx);
 
-/* Do not skip compaction more than 64 times */
-#define COMPACT_MAX_DEFER_SHIFT 6
-
-/*
- * Compaction is deferred when compaction fails to result in a page
- * allocation success. 1 << compact_defer_limit compactions are skipped up
- * to a limit of 1 << COMPACT_MAX_DEFER_SHIFT
- */
-static inline void defer_compaction(struct zone *zone, int order)
-{
-       zone->compact_considered = 0;
-       zone->compact_defer_shift++;
-
-       if (order < zone->compact_order_failed)
-               zone->compact_order_failed = order;
-
-       if (zone->compact_defer_shift > COMPACT_MAX_DEFER_SHIFT)
-               zone->compact_defer_shift = COMPACT_MAX_DEFER_SHIFT;
-}
-
-/* Returns true if compaction should be skipped this time */
-static inline bool compaction_deferred(struct zone *zone, int order)
-{
-       unsigned long defer_limit = 1UL << zone->compact_defer_shift;
-
-       if (order < zone->compact_order_failed)
-               return false;
-
-       /* Avoid possible overflow */
-       if (++zone->compact_considered > defer_limit)
-               zone->compact_considered = defer_limit;
-
-       return zone->compact_considered < defer_limit;
-}
-
-/*
- * Update defer tracking counters after successful compaction of given order,
- * which means an allocation either succeeded (alloc_success == true) or is
- * expected to succeed.
- */
-static inline void compaction_defer_reset(struct zone *zone, int order,
-               bool alloc_success)
-{
-       if (alloc_success) {
-               zone->compact_considered = 0;
-               zone->compact_defer_shift = 0;
-       }
-       if (order >= zone->compact_order_failed)
-               zone->compact_order_failed = order + 1;
-}
-
-/* Returns true if restarting compaction after many failures */
-static inline bool compaction_restarting(struct zone *zone, int order)
-{
-       if (order < zone->compact_order_failed)
-               return false;
-
-       return zone->compact_defer_shift == COMPACT_MAX_DEFER_SHIFT &&
-               zone->compact_considered >= 1UL << zone->compact_defer_shift;
-}
+extern void defer_compaction(struct zone *zone, int order);
+extern bool compaction_deferred(struct zone *zone, int order);
+extern void compaction_defer_reset(struct zone *zone, int order,
+                               bool alloc_success);
+extern bool compaction_restarting(struct zone *zone, int order);
 
 #else
 static inline unsigned long try_to_compact_pages(gfp_t gfp_mask,
 
        TP_ARGS(zone, order, ret)
 );
 
+#ifdef CONFIG_COMPACTION
+DECLARE_EVENT_CLASS(mm_compaction_defer_template,
+
+       TP_PROTO(struct zone *zone, int order),
+
+       TP_ARGS(zone, order),
+
+       TP_STRUCT__entry(
+               __field(int, nid)
+               __field(char *, name)
+               __field(int, order)
+               __field(unsigned int, considered)
+               __field(unsigned int, defer_shift)
+               __field(int, order_failed)
+       ),
+
+       TP_fast_assign(
+               __entry->nid = zone_to_nid(zone);
+               __entry->name = (char *)zone->name;
+               __entry->order = order;
+               __entry->considered = zone->compact_considered;
+               __entry->defer_shift = zone->compact_defer_shift;
+               __entry->order_failed = zone->compact_order_failed;
+       ),
+
+       TP_printk("node=%d zone=%-8s order=%d order_failed=%d consider=%u limit=%lu",
+               __entry->nid,
+               __entry->name,
+               __entry->order,
+               __entry->order_failed,
+               __entry->considered,
+               1UL << __entry->defer_shift)
+);
+
+DEFINE_EVENT(mm_compaction_defer_template, mm_compaction_deferred,
+
+       TP_PROTO(struct zone *zone, int order),
+
+       TP_ARGS(zone, order)
+);
+
+DEFINE_EVENT(mm_compaction_defer_template, mm_compaction_defer_compaction,
+
+       TP_PROTO(struct zone *zone, int order),
+
+       TP_ARGS(zone, order)
+);
+
+DEFINE_EVENT(mm_compaction_defer_template, mm_compaction_defer_reset,
+
+       TP_PROTO(struct zone *zone, int order),
+
+       TP_ARGS(zone, order)
+);
+#endif
+
 #endif /* _TRACE_COMPACTION_H */
 
 /* This part must be outside protection */
 
 }
 
 #ifdef CONFIG_COMPACTION
+
+/* Do not skip compaction more than 64 times */
+#define COMPACT_MAX_DEFER_SHIFT 6
+
+/*
+ * Compaction is deferred when compaction fails to result in a page
+ * allocation success. 1 << compact_defer_limit compactions are skipped up
+ * to a limit of 1 << COMPACT_MAX_DEFER_SHIFT
+ */
+void defer_compaction(struct zone *zone, int order)
+{
+       zone->compact_considered = 0;
+       zone->compact_defer_shift++;
+
+       if (order < zone->compact_order_failed)
+               zone->compact_order_failed = order;
+
+       if (zone->compact_defer_shift > COMPACT_MAX_DEFER_SHIFT)
+               zone->compact_defer_shift = COMPACT_MAX_DEFER_SHIFT;
+
+       trace_mm_compaction_defer_compaction(zone, order);
+}
+
+/* Returns true if compaction should be skipped this time */
+bool compaction_deferred(struct zone *zone, int order)
+{
+       unsigned long defer_limit = 1UL << zone->compact_defer_shift;
+
+       if (order < zone->compact_order_failed)
+               return false;
+
+       /* Avoid possible overflow */
+       if (++zone->compact_considered > defer_limit)
+               zone->compact_considered = defer_limit;
+
+       if (zone->compact_considered >= defer_limit)
+               return false;
+
+       trace_mm_compaction_deferred(zone, order);
+
+       return true;
+}
+
+/*
+ * Update defer tracking counters after successful compaction of given order,
+ * which means an allocation either succeeded (alloc_success == true) or is
+ * expected to succeed.
+ */
+void compaction_defer_reset(struct zone *zone, int order,
+               bool alloc_success)
+{
+       if (alloc_success) {
+               zone->compact_considered = 0;
+               zone->compact_defer_shift = 0;
+       }
+       if (order >= zone->compact_order_failed)
+               zone->compact_order_failed = order + 1;
+
+       trace_mm_compaction_defer_reset(zone, order);
+}
+
+/* Returns true if restarting compaction after many failures */
+bool compaction_restarting(struct zone *zone, int order)
+{
+       if (order < zone->compact_order_failed)
+               return false;
+
+       return zone->compact_defer_shift == COMPACT_MAX_DEFER_SHIFT &&
+               zone->compact_considered >= 1UL << zone->compact_defer_shift;
+}
+
 /* Returns true if the pageblock should be scanned for pages to isolate. */
 static inline bool isolation_suitable(struct compact_control *cc,
                                        struct page *page)