mm, compaction: distinguish contended status in tracepoints
authorVlastimil Babka <vbabka@suse.cz>
Fri, 6 Nov 2015 02:48:02 +0000 (18:48 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 6 Nov 2015 03:34:48 +0000 (19:34 -0800)
Compaction returns prematurely with COMPACT_PARTIAL when contended or has
fatal signal pending.  This is ok for the callers, but might be misleading
in the traces, as the usual reason to return COMPACT_PARTIAL is that we
think the allocation should succeed.  After this patch we distinguish the
premature ending condition in the mm_compaction_finished and
mm_compaction_end tracepoints.

The contended status covers the following reasons:
- lock contention or need_resched() detected in async compaction
- fatal signal pending
- too many pages isolated in the zone (only for async compaction)
Further distinguishing the exact reason seems unnecessary for now.

Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Cc: Mel Gorman <mgorman@suse.de>
Cc: David Rientjes <rientjes@google.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Ingo Molnar <mingo@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
include/linux/compaction.h
include/trace/events/compaction.h
mm/compaction.c

index f14ba989092f2ec61dc0d67a5fcf95e21dc3952a..4cd4ddf64cc7f9dfeffcd71492b24b6f57e1e4a3 100644 (file)
@@ -15,6 +15,7 @@
 /* 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 */
index a43000d766884baffa970b95826f0daea4e2944b..c92d1e1cbad9171cdce14eaa7fc0a9400783388a 100644 (file)
@@ -16,7 +16,8 @@
        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
index a5849c442a57aa6a5e5565cce3e0e1b508dc445d..de3e1e71cd9f265d9df971e98ed931fbdc8611a8 100644 (file)
@@ -1202,7 +1202,7 @@ static int __compact_finished(struct zone *zone, struct compact_control *cc,
        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)) {
@@ -1393,7 +1393,7 @@ static int compact_zone(struct zone *zone, struct compact_control *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;
@@ -1424,7 +1424,7 @@ static int compact_zone(struct zone *zone, struct compact_control *cc)
                         * and we want compact_finished() to detect it
                         */
                        if (err == -ENOMEM && !compact_scanners_met(cc)) {
-                               ret = COMPACT_PARTIAL;
+                               ret = COMPACT_CONTENDED;
                                goto out;
                        }
                }
@@ -1477,6 +1477,9 @@ 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;
 }