|
@@ -461,6 +461,7 @@ static bool too_many_isolated(struct zone *zone)
|
|
|
* @cc: Compaction control structure.
|
|
|
* @low_pfn: The first PFN of the range.
|
|
|
* @end_pfn: The one-past-the-last PFN of the range.
|
|
|
+ * @unevictable: true if it allows to isolate unevictable pages
|
|
|
*
|
|
|
* Isolate all pages that can be migrated from the range specified by
|
|
|
* [low_pfn, end_pfn). Returns zero if there is a fatal signal
|
|
@@ -476,7 +477,7 @@ static bool too_many_isolated(struct zone *zone)
|
|
|
*/
|
|
|
unsigned long
|
|
|
isolate_migratepages_range(struct zone *zone, struct compact_control *cc,
|
|
|
- unsigned long low_pfn, unsigned long end_pfn)
|
|
|
+ unsigned long low_pfn, unsigned long end_pfn, bool unevictable)
|
|
|
{
|
|
|
unsigned long last_pageblock_nr = 0, pageblock_nr;
|
|
|
unsigned long nr_scanned = 0, nr_isolated = 0;
|
|
@@ -602,6 +603,9 @@ isolate_migratepages_range(struct zone *zone, struct compact_control *cc,
|
|
|
if (!cc->sync)
|
|
|
mode |= ISOLATE_ASYNC_MIGRATE;
|
|
|
|
|
|
+ if (unevictable)
|
|
|
+ mode |= ISOLATE_UNEVICTABLE;
|
|
|
+
|
|
|
lruvec = mem_cgroup_page_lruvec(page, zone);
|
|
|
|
|
|
/* Try isolate the page */
|
|
@@ -807,7 +811,7 @@ static isolate_migrate_t isolate_migratepages(struct zone *zone,
|
|
|
}
|
|
|
|
|
|
/* Perform the isolation */
|
|
|
- low_pfn = isolate_migratepages_range(zone, cc, low_pfn, end_pfn);
|
|
|
+ low_pfn = isolate_migratepages_range(zone, cc, low_pfn, end_pfn, false);
|
|
|
if (!low_pfn || cc->contended)
|
|
|
return ISOLATE_ABORT;
|
|
|
|