Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e46197bd authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "mm/compaction.c: correct zone boundary handling when resetting pageblock skip hints"

parents c685e5dd 6829f2df
Loading
Loading
Loading
Loading
+17 −10
Original line number Diff line number Diff line
@@ -242,6 +242,7 @@ __reset_isolation_pfn(struct zone *zone, unsigned long pfn, bool check_source,
							bool check_target)
{
	struct page *page = pfn_to_online_page(pfn);
	struct page *block_page;
	struct page *end_page;
	unsigned long block_pfn;

@@ -267,20 +268,26 @@ __reset_isolation_pfn(struct zone *zone, unsigned long pfn, bool check_source,
	    get_pageblock_migratetype(page) != MIGRATE_MOVABLE)
		return false;

	/* Ensure the start of the pageblock or zone is online and valid */
	block_pfn = pageblock_start_pfn(pfn);
	block_page = pfn_to_online_page(max(block_pfn, zone->zone_start_pfn));
	if (block_page) {
		page = block_page;
		pfn = block_pfn;
	}

	/* Ensure the end of the pageblock or zone is online and valid */
	block_pfn += pageblock_nr_pages;
	block_pfn = min(block_pfn, zone_end_pfn(zone) - 1);
	end_page = pfn_to_online_page(block_pfn);
	if (!end_page)
		return false;

	/*
	 * Only clear the hint if a sample indicates there is either a
	 * free page or an LRU page in the block. One or other condition
	 * is necessary for the block to be a migration source/target.
	 */
	block_pfn = pageblock_start_pfn(pfn);
	pfn = max(block_pfn, zone->zone_start_pfn);
	page = pfn_to_page(pfn);
	if (zone != page_zone(page))
		return false;
	pfn = block_pfn + pageblock_nr_pages;
	pfn = min(pfn, zone_end_pfn(zone));
	end_page = pfn_to_page(pfn);

	do {
		if (pfn_valid_within(pfn)) {
			if (check_source && PageLRU(page)) {
@@ -309,7 +316,7 @@ __reset_isolation_pfn(struct zone *zone, unsigned long pfn, bool check_source,
static void __reset_isolation_suitable(struct zone *zone)
{
	unsigned long migrate_pfn = zone->zone_start_pfn;
	unsigned long free_pfn = zone_end_pfn(zone);
	unsigned long free_pfn = zone_end_pfn(zone) - 1;
	unsigned long reset_migrate = free_pfn;
	unsigned long reset_free = migrate_pfn;
	bool source_set = false;