mm/memory_hotplug: drop valid_start/valid_end from test_pages_in_a_zone()
The callers are only interested in the actual zone, they don't care about boundaries. Return the zone instead to simplify. Link: http://lkml.kernel.org/r/20200110183308.11849-1-david@redhat.com Signed-off-by: David Hildenbrand <david@redhat.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: "Rafael J. Wysocki" <rafael@kernel.org> Cc: Michal Hocko <mhocko@suse.com> Cc: Oscar Salvador <osalvador@suse.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
52fb87c81f
Коммит
9291799884
|
@ -376,7 +376,6 @@ static ssize_t valid_zones_show(struct device *dev,
|
|||
struct memory_block *mem = to_memory_block(dev);
|
||||
unsigned long start_pfn = section_nr_to_pfn(mem->start_section_nr);
|
||||
unsigned long nr_pages = PAGES_PER_SECTION * sections_per_block;
|
||||
unsigned long valid_start_pfn, valid_end_pfn;
|
||||
struct zone *default_zone;
|
||||
int nid;
|
||||
|
||||
|
@ -389,11 +388,11 @@ static ssize_t valid_zones_show(struct device *dev,
|
|||
* The block contains more than one zone can not be offlined.
|
||||
* This can happen e.g. for ZONE_DMA and ZONE_DMA32
|
||||
*/
|
||||
if (!test_pages_in_a_zone(start_pfn, start_pfn + nr_pages,
|
||||
&valid_start_pfn, &valid_end_pfn))
|
||||
default_zone = test_pages_in_a_zone(start_pfn,
|
||||
start_pfn + nr_pages);
|
||||
if (!default_zone)
|
||||
return sprintf(buf, "none\n");
|
||||
start_pfn = valid_start_pfn;
|
||||
strcat(buf, page_zone(pfn_to_page(start_pfn))->name);
|
||||
strcat(buf, default_zone->name);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
|
|
@ -96,8 +96,8 @@ extern int add_one_highpage(struct page *page, int pfn, int bad_ppro);
|
|||
/* VM interface that may be used by firmware interface */
|
||||
extern int online_pages(unsigned long pfn, unsigned long nr_pages,
|
||||
int online_type, int nid);
|
||||
extern int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn,
|
||||
unsigned long *valid_start, unsigned long *valid_end);
|
||||
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);
|
||||
|
||||
|
|
|
@ -1172,14 +1172,13 @@ bool is_mem_section_removable(unsigned long start_pfn, unsigned long nr_pages)
|
|||
}
|
||||
|
||||
/*
|
||||
* Confirm all pages in a range [start, end) belong to the same zone.
|
||||
* When true, return its valid [start, end).
|
||||
* Confirm all pages in a range [start, end) belong to the same zone (skipping
|
||||
* memory holes). When true, return the zone.
|
||||
*/
|
||||
int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn,
|
||||
unsigned long *valid_start, unsigned long *valid_end)
|
||||
struct zone *test_pages_in_a_zone(unsigned long start_pfn,
|
||||
unsigned long end_pfn)
|
||||
{
|
||||
unsigned long pfn, sec_end_pfn;
|
||||
unsigned long start, end;
|
||||
struct zone *zone = NULL;
|
||||
struct page *page;
|
||||
int i;
|
||||
|
@ -1200,24 +1199,15 @@ int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn,
|
|||
continue;
|
||||
/* Check if we got outside of the zone */
|
||||
if (zone && !zone_spans_pfn(zone, pfn + i))
|
||||
return 0;
|
||||
return NULL;
|
||||
page = pfn_to_page(pfn + i);
|
||||
if (zone && page_zone(page) != zone)
|
||||
return 0;
|
||||
if (!zone)
|
||||
start = pfn + i;
|
||||
return NULL;
|
||||
zone = page_zone(page);
|
||||
end = pfn + MAX_ORDER_NR_PAGES;
|
||||
}
|
||||
}
|
||||
|
||||
if (zone) {
|
||||
*valid_start = start;
|
||||
*valid_end = min(end, end_pfn);
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
return zone;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1462,7 +1452,6 @@ static int __ref __offline_pages(unsigned long start_pfn,
|
|||
unsigned long offlined_pages = 0;
|
||||
int ret, node, nr_isolate_pageblock;
|
||||
unsigned long flags;
|
||||
unsigned long valid_start, valid_end;
|
||||
struct zone *zone;
|
||||
struct memory_notify arg;
|
||||
char *reason;
|
||||
|
@ -1487,14 +1476,12 @@ static int __ref __offline_pages(unsigned long start_pfn,
|
|||
|
||||
/* This makes hotplug much easier...and readable.
|
||||
we assume this for now. .*/
|
||||
if (!test_pages_in_a_zone(start_pfn, end_pfn, &valid_start,
|
||||
&valid_end)) {
|
||||
zone = test_pages_in_a_zone(start_pfn, end_pfn);
|
||||
if (!zone) {
|
||||
ret = -EINVAL;
|
||||
reason = "multizone range";
|
||||
goto failed_removal;
|
||||
}
|
||||
|
||||
zone = page_zone(pfn_to_page(valid_start));
|
||||
node = zone_to_nid(zone);
|
||||
|
||||
/* set above range as isolated */
|
||||
|
|
Загрузка…
Ссылка в новой задаче