|
@@ -277,9 +277,27 @@ static unsigned long isolate_migratepages(struct zone *zone,
|
|
|
}
|
|
|
|
|
|
/* Time to isolate some pages for migration */
|
|
|
+ cond_resched();
|
|
|
spin_lock_irq(&zone->lru_lock);
|
|
|
for (; low_pfn < end_pfn; low_pfn++) {
|
|
|
struct page *page;
|
|
|
+ bool locked = true;
|
|
|
+
|
|
|
+ /* give a chance to irqs before checking need_resched() */
|
|
|
+ if (!((low_pfn+1) % SWAP_CLUSTER_MAX)) {
|
|
|
+ spin_unlock_irq(&zone->lru_lock);
|
|
|
+ locked = false;
|
|
|
+ }
|
|
|
+ if (need_resched() || spin_is_contended(&zone->lru_lock)) {
|
|
|
+ if (locked)
|
|
|
+ spin_unlock_irq(&zone->lru_lock);
|
|
|
+ cond_resched();
|
|
|
+ spin_lock_irq(&zone->lru_lock);
|
|
|
+ if (fatal_signal_pending(current))
|
|
|
+ break;
|
|
|
+ } else if (!locked)
|
|
|
+ spin_lock_irq(&zone->lru_lock);
|
|
|
+
|
|
|
if (!pfn_valid_within(low_pfn))
|
|
|
continue;
|
|
|
nr_scanned++;
|