Messages in this thread Patch in this message |  | | From | Michal Hocko <> | Subject | [PATCH 3/3] mm: __first_valid_page skip over offline pages | Date | Sat, 15 Apr 2017 14:17:34 +0200 |
| |
From: Michal Hocko <mhocko@suse.com>
__first_valid_page skips over invalid pfns in the range but it might still stumble over offline pages. At least start_isolate_page_range will mark those set_migratetype_isolate. This doesn't represent any immediate AFAICS because alloc_contig_range will fail to isolate those pages but it relies on not fully initialized page which will become a problem later when we stop associating offline pages to zones. So this is more a preparatory patch than a fix.
Signed-off-by: Michal Hocko <mhocko@suse.com> --- mm/page_isolation.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-)
diff --git a/mm/page_isolation.c b/mm/page_isolation.c index 5092e4ef00c8..2b958f33a1eb 100644 --- a/mm/page_isolation.c +++ b/mm/page_isolation.c @@ -138,12 +138,18 @@ static inline struct page * __first_valid_page(unsigned long pfn, unsigned long nr_pages) { int i; - for (i = 0; i < nr_pages; i++) - if (pfn_valid_within(pfn + i)) - break; - if (unlikely(i == nr_pages)) - return NULL; - return pfn_to_page(pfn + i); + + for (i = 0; i < nr_pages; i++) { + struct page *page; + + if (!pfn_valid_within(pfn + i)) + continue; + page = pfn_to_page(pfn + i); + if (PageReserved(page)) + continue; + return page; + } + return NULL; } /* @@ -184,8 +190,12 @@ int start_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn, undo: for (pfn = start_pfn; pfn < undo_pfn; - pfn += pageblock_nr_pages) - unset_migratetype_isolate(pfn_to_page(pfn), migratetype); + pfn += pageblock_nr_pages) { + struct page *page = pfn_to_page(pfn); + if (PageReserved(page)) + continue; + unset_migratetype_isolate(page, migratetype); + } return -EBUSY; } -- 2.11.0
|  |