mm/page_alloc: simplify __offline_isolated_pages()
offline_pages() is the only user. __offline_isolated_pages() never gets called with ranges that contain memory holes and we no longer care about the return value. Drop the return value handling and all pfn_valid() checks. Update the documentation. Signed-off-by: David Hildenbrand <david@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Reviewed-by: Oscar Salvador <osalvador@suse.de> Acked-by: Michal Hocko <mhocko@suse.com> Cc: Wei Yang <richard.weiyang@linux.alibaba.com> Cc: Baoquan He <bhe@redhat.com> Cc: Pankaj Gupta <pankaj.gupta.linux@gmail.com> Cc: Charan Teja Reddy <charante@codeaurora.org> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Fenghua Yu <fenghua.yu@intel.com> Cc: Logan Gunthorpe <logang@deltatee.com> Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org> Cc: Mel Gorman <mgorman@suse.de> Cc: Mel Gorman <mgorman@techsingularity.net> Cc: Michel Lespinasse <walken@google.com> Cc: Mike Rapoport <rppt@kernel.org> Cc: Tony Luck <tony.luck@intel.com> Link: https://lkml.kernel.org/r/20200819175957.28465-5-david@redhat.com Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
0a1a9a0008
Коммит
257bea7158
|
@ -103,8 +103,8 @@ extern int online_pages(unsigned long pfn, unsigned long nr_pages,
|
|||
int online_type, int nid);
|
||||
extern struct zone *test_pages_in_a_zone(unsigned long start_pfn,
|
||||
unsigned long end_pfn);
|
||||
extern unsigned long __offline_isolated_pages(unsigned long start_pfn,
|
||||
unsigned long end_pfn);
|
||||
extern void __offline_isolated_pages(unsigned long start_pfn,
|
||||
unsigned long end_pfn);
|
||||
|
||||
typedef void (*online_page_callback_t)(struct page *page, unsigned int order);
|
||||
|
||||
|
|
|
@ -8704,35 +8704,21 @@ void zone_pcp_reset(struct zone *zone)
|
|||
|
||||
#ifdef CONFIG_MEMORY_HOTREMOVE
|
||||
/*
|
||||
* All pages in the range must be in a single zone and isolated
|
||||
* before calling this.
|
||||
* All pages in the range must be in a single zone, must not contain holes,
|
||||
* must span full sections, and must be isolated before calling this function.
|
||||
*/
|
||||
unsigned long
|
||||
__offline_isolated_pages(unsigned long start_pfn, unsigned long end_pfn)
|
||||
void __offline_isolated_pages(unsigned long start_pfn, unsigned long end_pfn)
|
||||
{
|
||||
unsigned long pfn = start_pfn;
|
||||
struct page *page;
|
||||
struct zone *zone;
|
||||
unsigned int order;
|
||||
unsigned long pfn;
|
||||
unsigned long flags;
|
||||
unsigned long offlined_pages = 0;
|
||||
|
||||
/* find the first valid pfn */
|
||||
for (pfn = start_pfn; pfn < end_pfn; pfn++)
|
||||
if (pfn_valid(pfn))
|
||||
break;
|
||||
if (pfn == end_pfn)
|
||||
return offlined_pages;
|
||||
|
||||
offline_mem_sections(pfn, end_pfn);
|
||||
zone = page_zone(pfn_to_page(pfn));
|
||||
spin_lock_irqsave(&zone->lock, flags);
|
||||
pfn = start_pfn;
|
||||
while (pfn < end_pfn) {
|
||||
if (!pfn_valid(pfn)) {
|
||||
pfn++;
|
||||
continue;
|
||||
}
|
||||
page = pfn_to_page(pfn);
|
||||
/*
|
||||
* The HWPoisoned page may be not in buddy system, and
|
||||
|
@ -8740,7 +8726,6 @@ __offline_isolated_pages(unsigned long start_pfn, unsigned long end_pfn)
|
|||
*/
|
||||
if (unlikely(!PageBuddy(page) && PageHWPoison(page))) {
|
||||
pfn++;
|
||||
offlined_pages++;
|
||||
continue;
|
||||
}
|
||||
/*
|
||||
|
@ -8751,20 +8736,16 @@ __offline_isolated_pages(unsigned long start_pfn, unsigned long end_pfn)
|
|||
BUG_ON(page_count(page));
|
||||
BUG_ON(PageBuddy(page));
|
||||
pfn++;
|
||||
offlined_pages++;
|
||||
continue;
|
||||
}
|
||||
|
||||
BUG_ON(page_count(page));
|
||||
BUG_ON(!PageBuddy(page));
|
||||
order = page_order(page);
|
||||
offlined_pages += 1 << order;
|
||||
del_page_from_free_list(page, zone, order);
|
||||
pfn += (1 << order);
|
||||
}
|
||||
spin_unlock_irqrestore(&zone->lock, flags);
|
||||
|
||||
return offlined_pages;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче