Loading mm/memory_hotplug.c +17 −13 Original line number Diff line number Diff line Loading @@ -1423,10 +1423,10 @@ int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn, } /* * Scan pfn range [start,end) to find movable/migratable pages (LRU pages * and hugepages). We scan pfn because it's much easier than scanning over * linked list. This function returns the pfn of the first found movable * page if it's found, otherwise 0. * Scan pfn range [start,end) to find movable/migratable pages (LRU pages, * non-lru movable pages and hugepages). We scan pfn because it's much * easier than scanning over linked list. This function returns the pfn * of the first found movable page if it's found, otherwise 0. */ static unsigned long scan_movable_pages(unsigned long start, unsigned long end) { Loading @@ -1437,6 +1437,8 @@ static unsigned long scan_movable_pages(unsigned long start, unsigned long end) page = pfn_to_page(pfn); if (PageLRU(page)) return pfn; if (__PageMovable(page)) return pfn; if (PageHuge(page)) { if (page_huge_active(page)) return pfn; Loading Loading @@ -1480,22 +1482,24 @@ do_migrate_range(unsigned long start_pfn, unsigned long end_pfn) if (!get_page_unless_zero(page)) continue; /* * We can skip free pages. And we can only deal with pages on * LRU. * We can skip free pages. And we can deal with pages on * LRU and non-lru movable pages. */ if (PageLRU(page)) ret = isolate_lru_page(page); else ret = isolate_movable_page(page, ISOLATE_UNEVICTABLE); if (!ret) { /* Success */ put_page(page); list_add_tail(&page->lru, &source); move_pages--; if (!__PageMovable(page)) inc_zone_page_state(page, NR_ISOLATED_ANON + page_is_file_cache(page)); } else { #ifdef CONFIG_DEBUG_VM printk(KERN_ALERT "removing pfn %lx from LRU failed\n", pfn); dump_page(page, "failed to remove from LRU"); pr_alert("failed to isolate pfn %lx\n", pfn); dump_page(page, "isolation failed"); #endif put_page(page); /* Because we don't have big zone->lock. we should Loading mm/page_alloc.c +6 −2 Original line number Diff line number Diff line Loading @@ -6652,8 +6652,9 @@ void set_pfnblock_flags_mask(struct page *page, unsigned long flags, * If @count is not zero, it is okay to include less @count unmovable pages * * PageLRU check without isolation or lru_lock could race so that * MIGRATE_MOVABLE block might include unmovable pages. It means you can't * expect this function should be exact. * MIGRATE_MOVABLE block might include unmovable pages. And __PageMovable * check without lock_page also may miss some movable non-lru pages at * race condition. So you can't expect this function should be exact. */ bool has_unmovable_pages(struct zone *zone, struct page *page, int count, bool skip_hwpoisoned_pages) Loading Loading @@ -6709,6 +6710,9 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count, if (skip_hwpoisoned_pages && PageHWPoison(page)) continue; if (__PageMovable(page)) continue; if (!PageLRU(page)) found++; /* Loading Loading
mm/memory_hotplug.c +17 −13 Original line number Diff line number Diff line Loading @@ -1423,10 +1423,10 @@ int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn, } /* * Scan pfn range [start,end) to find movable/migratable pages (LRU pages * and hugepages). We scan pfn because it's much easier than scanning over * linked list. This function returns the pfn of the first found movable * page if it's found, otherwise 0. * Scan pfn range [start,end) to find movable/migratable pages (LRU pages, * non-lru movable pages and hugepages). We scan pfn because it's much * easier than scanning over linked list. This function returns the pfn * of the first found movable page if it's found, otherwise 0. */ static unsigned long scan_movable_pages(unsigned long start, unsigned long end) { Loading @@ -1437,6 +1437,8 @@ static unsigned long scan_movable_pages(unsigned long start, unsigned long end) page = pfn_to_page(pfn); if (PageLRU(page)) return pfn; if (__PageMovable(page)) return pfn; if (PageHuge(page)) { if (page_huge_active(page)) return pfn; Loading Loading @@ -1480,22 +1482,24 @@ do_migrate_range(unsigned long start_pfn, unsigned long end_pfn) if (!get_page_unless_zero(page)) continue; /* * We can skip free pages. And we can only deal with pages on * LRU. * We can skip free pages. And we can deal with pages on * LRU and non-lru movable pages. */ if (PageLRU(page)) ret = isolate_lru_page(page); else ret = isolate_movable_page(page, ISOLATE_UNEVICTABLE); if (!ret) { /* Success */ put_page(page); list_add_tail(&page->lru, &source); move_pages--; if (!__PageMovable(page)) inc_zone_page_state(page, NR_ISOLATED_ANON + page_is_file_cache(page)); } else { #ifdef CONFIG_DEBUG_VM printk(KERN_ALERT "removing pfn %lx from LRU failed\n", pfn); dump_page(page, "failed to remove from LRU"); pr_alert("failed to isolate pfn %lx\n", pfn); dump_page(page, "isolation failed"); #endif put_page(page); /* Because we don't have big zone->lock. we should Loading
mm/page_alloc.c +6 −2 Original line number Diff line number Diff line Loading @@ -6652,8 +6652,9 @@ void set_pfnblock_flags_mask(struct page *page, unsigned long flags, * If @count is not zero, it is okay to include less @count unmovable pages * * PageLRU check without isolation or lru_lock could race so that * MIGRATE_MOVABLE block might include unmovable pages. It means you can't * expect this function should be exact. * MIGRATE_MOVABLE block might include unmovable pages. And __PageMovable * check without lock_page also may miss some movable non-lru pages at * race condition. So you can't expect this function should be exact. */ bool has_unmovable_pages(struct zone *zone, struct page *page, int count, bool skip_hwpoisoned_pages) Loading Loading @@ -6709,6 +6710,9 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count, if (skip_hwpoisoned_pages && PageHWPoison(page)) continue; if (__PageMovable(page)) continue; if (!PageLRU(page)) found++; /* Loading