#if !defined(_TRACE_OOM_H) || defined(TRACE_HEADER_MULTI_READ)
 #define _TRACE_OOM_H
 #include <linux/tracepoint.h>
+#include <trace/events/mmflags.h>
 
 TRACE_EVENT(oom_score_adj_update,
 
                __entry->pid, __entry->comm, __entry->oom_score_adj)
 );
 
+TRACE_EVENT(reclaim_retry_zone,
+
+       TP_PROTO(struct zoneref *zoneref,
+               int order,
+               unsigned long reclaimable,
+               unsigned long available,
+               unsigned long min_wmark,
+               int no_progress_loops,
+               bool wmark_check),
+
+       TP_ARGS(zoneref, order, reclaimable, available, min_wmark, no_progress_loops, wmark_check),
+
+       TP_STRUCT__entry(
+               __field(        int, node)
+               __field(        int, zone_idx)
+               __field(        int,    order)
+               __field(        unsigned long,  reclaimable)
+               __field(        unsigned long,  available)
+               __field(        unsigned long,  min_wmark)
+               __field(        int,    no_progress_loops)
+               __field(        bool,   wmark_check)
+       ),
+
+       TP_fast_assign(
+               __entry->node = zone_to_nid(zoneref->zone);
+               __entry->zone_idx = zoneref->zone_idx;
+               __entry->order = order;
+               __entry->reclaimable = reclaimable;
+               __entry->available = available;
+               __entry->min_wmark = min_wmark;
+               __entry->no_progress_loops = no_progress_loops;
+               __entry->wmark_check = wmark_check;
+       ),
+
+       TP_printk("node=%d zone=%-8s order=%d reclaimable=%lu available=%lu min_wmark=%lu no_progress_loops=%d wmark_check=%d",
+                       __entry->node, __print_symbolic(__entry->zone_idx, ZONE_TYPE),
+                       __entry->order,
+                       __entry->reclaimable, __entry->available, __entry->min_wmark,
+                       __entry->no_progress_loops,
+                       __entry->wmark_check)
+);
 #endif
 
 /* This part must be outside protection */
 
 #include <linux/kmemleak.h>
 #include <linux/compaction.h>
 #include <trace/events/kmem.h>
+#include <trace/events/oom.h>
 #include <linux/prefetch.h>
 #include <linux/mm_inline.h>
 #include <linux/migrate.h>
                                        ac->nodemask) {
                unsigned long available;
                unsigned long reclaimable;
+               unsigned long min_wmark = min_wmark_pages(zone);
+               bool wmark;
 
                available = reclaimable = zone_reclaimable_pages(zone);
                available -= DIV_ROUND_UP((*no_progress_loops) * available,
                 * Would the allocation succeed if we reclaimed the whole
                 * available?
                 */
-               if (__zone_watermark_ok(zone, order, min_wmark_pages(zone),
-                               ac_classzone_idx(ac), alloc_flags, available)) {
+               wmark = __zone_watermark_ok(zone, order, min_wmark,
+                               ac_classzone_idx(ac), alloc_flags, available);
+               trace_reclaim_retry_zone(z, order, reclaimable,
+                               available, min_wmark, *no_progress_loops, wmark);
+               if (wmark) {
                        /*
                         * If we didn't make any progress and have a lot of
                         * dirty + writeback pages then we should wait for