|
@@ -144,9 +144,20 @@ static void isolate_freepages(struct zone *zone,
|
|
int nr_freepages = cc->nr_freepages;
|
|
int nr_freepages = cc->nr_freepages;
|
|
struct list_head *freelist = &cc->freepages;
|
|
struct list_head *freelist = &cc->freepages;
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Initialise the free scanner. The starting point is where we last
|
|
|
|
+ * scanned from (or the end of the zone if starting). The low point
|
|
|
|
+ * is the end of the pageblock the migration scanner is using.
|
|
|
|
+ */
|
|
pfn = cc->free_pfn;
|
|
pfn = cc->free_pfn;
|
|
low_pfn = cc->migrate_pfn + pageblock_nr_pages;
|
|
low_pfn = cc->migrate_pfn + pageblock_nr_pages;
|
|
- high_pfn = low_pfn;
|
|
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Take care that if the migration scanner is at the end of the zone
|
|
|
|
+ * that the free scanner does not accidentally move to the next zone
|
|
|
|
+ * in the next isolation cycle.
|
|
|
|
+ */
|
|
|
|
+ high_pfn = min(low_pfn, pfn);
|
|
|
|
|
|
/*
|
|
/*
|
|
* Isolate free pages until enough are available to migrate the
|
|
* Isolate free pages until enough are available to migrate the
|