/* For more detailed tracepoint output */
 #define COMPACT_NO_SUITABLE_PAGE       5
 #define COMPACT_NOT_SUITABLE_ZONE      6
+#define COMPACT_CONTENDED              7
 /* When adding new states, please adjust include/trace/events/compaction.h */
 
 /* Used to signal whether compaction detected need_sched() or lock contention */
 
        EM( COMPACT_PARTIAL,            "partial")              \
        EM( COMPACT_COMPLETE,           "complete")             \
        EM( COMPACT_NO_SUITABLE_PAGE,   "no_suitable_page")     \
-       EMe(COMPACT_NOT_SUITABLE_ZONE,  "not_suitable_zone")
+       EM( COMPACT_NOT_SUITABLE_ZONE,  "not_suitable_zone")    \
+       EMe(COMPACT_CONTENDED,          "contended")
 
 #ifdef CONFIG_ZONE_DMA
 #define IFDEF_ZONE_DMA(X) X
 
        unsigned long watermark;
 
        if (cc->contended || fatal_signal_pending(current))
-               return COMPACT_PARTIAL;
+               return COMPACT_CONTENDED;
 
        /* Compaction run completes if the migrate and free scanner meet */
        if (compact_scanners_met(cc)) {
 
                switch (isolate_migratepages(zone, cc)) {
                case ISOLATE_ABORT:
-                       ret = COMPACT_PARTIAL;
+                       ret = COMPACT_CONTENDED;
                        putback_movable_pages(&cc->migratepages);
                        cc->nr_migratepages = 0;
                        goto out;
                         * and we want compact_finished() to detect it
                         */
                        if (err == -ENOMEM && !compact_scanners_met(cc)) {
-                               ret = COMPACT_PARTIAL;
+                               ret = COMPACT_CONTENDED;
                                goto out;
                        }
                }
        trace_mm_compaction_end(start_pfn, cc->migrate_pfn,
                                cc->free_pfn, end_pfn, sync, ret);
 
+       if (ret == COMPACT_CONTENDED)
+               ret = COMPACT_PARTIAL;
+
        return ret;
 }