mm: compaction: move fatal signal check out of compact_checklock_irqsave
Mel Gorman [Mon, 8 Oct 2012 23:32:30 +0000 (16:32 -0700)]
Commit c67fe3752abe ("mm: compaction: Abort async compaction if locks
are contended or taking too long") addressed a lock contention problem
in compaction by introducing compact_checklock_irqsave() that effecively
aborting async compaction in the event of compaction.

To preserve existing behaviour it also moved a fatal_signal_pending()
check into compact_checklock_irqsave() but that is very misleading.  It
"hides" the check within a locking function but has nothing to do with
locking as such.  It just happens to work in a desirable fashion.

This patch moves the fatal_signal_pending() check to
isolate_migratepages_range() where it belongs.  Arguably the same check
should also happen when isolating pages for freeing but it's overkill.

Signed-off-by: Mel Gorman <>
Cc: Rik van Riel <>
Cc: KAMEZAWA Hiroyuki <>
Cc: Shaohua Li <>
Cc: Minchan Kim <>
Cc: Andrea Arcangeli <>
Signed-off-by: Andrew Morton <>
Signed-off-by: Linus Torvalds <>


index 0649cc1..78075a2 100644 (file)
@@ -75,8 +75,6 @@ static bool compact_checklock_irqsave(spinlock_t *lock, unsigned long *flags,
-               if (fatal_signal_pending(current))
-                       return false;
        if (!locked)
@@ -363,7 +361,7 @@ isolate_migratepages_range(struct zone *zone, struct compact_control *cc,
                /* Check if it is ok to still hold the lock */
                locked = compact_checklock_irqsave(&zone->lru_lock, &flags,
                                                                locked, cc);
-               if (!locked)
+               if (!locked || fatal_signal_pending(current))