|
@@ -1375,23 +1375,30 @@ int is_mem_section_removable(unsigned long start_pfn, unsigned long nr_pages)
|
|
|
*/
|
|
|
int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn)
|
|
|
{
|
|
|
- unsigned long pfn;
|
|
|
+ unsigned long pfn, sec_end_pfn;
|
|
|
struct zone *zone = NULL;
|
|
|
struct page *page;
|
|
|
int i;
|
|
|
- for (pfn = start_pfn;
|
|
|
+ for (pfn = start_pfn, sec_end_pfn = SECTION_ALIGN_UP(start_pfn);
|
|
|
pfn < end_pfn;
|
|
|
- pfn += MAX_ORDER_NR_PAGES) {
|
|
|
- i = 0;
|
|
|
- /* This is just a CONFIG_HOLES_IN_ZONE check.*/
|
|
|
- while ((i < MAX_ORDER_NR_PAGES) && !pfn_valid_within(pfn + i))
|
|
|
- i++;
|
|
|
- if (i == MAX_ORDER_NR_PAGES)
|
|
|
+ pfn = sec_end_pfn + 1, sec_end_pfn += PAGES_PER_SECTION) {
|
|
|
+ /* Make sure the memory section is present first */
|
|
|
+ if (!present_section_nr(pfn_to_section_nr(pfn)))
|
|
|
continue;
|
|
|
- page = pfn_to_page(pfn + i);
|
|
|
- if (zone && page_zone(page) != zone)
|
|
|
- return 0;
|
|
|
- zone = page_zone(page);
|
|
|
+ for (; pfn < sec_end_pfn && pfn < end_pfn;
|
|
|
+ pfn += MAX_ORDER_NR_PAGES) {
|
|
|
+ i = 0;
|
|
|
+ /* This is just a CONFIG_HOLES_IN_ZONE check.*/
|
|
|
+ while ((i < MAX_ORDER_NR_PAGES) &&
|
|
|
+ !pfn_valid_within(pfn + i))
|
|
|
+ i++;
|
|
|
+ if (i == MAX_ORDER_NR_PAGES)
|
|
|
+ continue;
|
|
|
+ page = pfn_to_page(pfn + i);
|
|
|
+ if (zone && page_zone(page) != zone)
|
|
|
+ return 0;
|
|
|
+ zone = page_zone(page);
|
|
|
+ }
|
|
|
}
|
|
|
return 1;
|
|
|
}
|