Message ID | 20181105150401.97287-2-zaslonko@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | memory_hotplug: fix the panic when memory end is not | expand |
Hi, [This is an automated email] This commit has been processed because it contains a -stable tag. The stable tag indicates that it's relevant for the following trees: all The bot has tested the following trees: v5.1.9, v4.19.50, v4.14.125, v4.9.181, v4.4.181. v5.1.9: Failed to apply! Possible dependencies: Unable to calculate v4.19.50: Failed to apply! Possible dependencies: Unable to calculate v4.14.125: Failed to apply! Possible dependencies: 4da2ce250f98 ("mm: distinguish CMA and MOVABLE isolation in has_unmovable_pages()") da024512a1fa ("mm: pass the vmem_altmap to arch_remove_memory and __remove_pages") fb52bbaee598 ("mm: move is_pageblock_removable_nolock() to mm/memory_hotplug.c") v4.9.181: Failed to apply! Possible dependencies: 133ff0eac95b ("mm/hmm: heterogeneous memory management (HMM for short)") 3859a271a003 ("randstruct: Mark various structs for randomization") 4ef589dc9b10 ("mm/hmm/devmem: device memory hotplug using ZONE_DEVICE") 5613fda9a503 ("sched/cputime: Convert task/group cputime to nsecs") 60f3e00d25b4 ("sysv,ipc: cacheline align kern_ipc_perm") 8c8b73c4811f ("sched/cputime, powerpc: Prepare accounting structure for cputime flush on tick") a19ff1a2cc92 ("sched/cputime, powerpc/vtime: Accumulate cputime and account only on tick/task switch") b18b6a9cef7f ("timers: Omit POSIX timer stuff from task_struct when disabled") b584c2544041 ("powerpc/vmemmap: Add altmap support") baa73d9e478f ("posix-timers: Make them configurable") c3edc4010e9d ("sched/headers: Move task_struct::signal and task_struct::sighand types and accessors into <linux/sched/signal.h>") d3df0a423397 ("mm/hmm: add new helper to hotplug CDM memory region") d69dece5f5b6 ("LSM: Add /sys/kernel/security/lsm") d7d9b612f1b0 ("powerpc/vmemmap: Reshuffle vmemmap_free()") da024512a1fa ("mm: pass the vmem_altmap to arch_remove_memory and __remove_pages") fb52bbaee598 ("mm: move is_pageblock_removable_nolock() to mm/memory_hotplug.c") v4.4.181: Failed to apply! Possible dependencies: 11a6f6abd74a ("powerpc/mm: Move radix/hash common data structures to book3s64 headers") 15b1624b7807 ("powerpc: Use defines for __init_tlb_power[78]") 18569c1f134e ("powerpc/64: Don't try to use radix MMU under a hypervisor") 1a01dc87e09b ("powerpc/mm: Add mmu_early_init_devtree()") 26b6a3d9bb48 ("powerpc/mm: move pte headers to book3s directory") 2bfd65e45e87 ("powerpc/mm/radix: Add radix callbacks for early init routines") 3dfcb315d81e ("powerpc/mm: make a separate copy for book3s") 5c3c7ede2bdc ("powerpc/mm: Split hash page table sizing heuristic into a helper") 756d08d1ba16 ("powerpc/mm: Abstract early MMU init in preparation for radix") b275bfb26963 ("powerpc/mm/radix: Add a kernel command line to disable radix") b584c2544041 ("powerpc/vmemmap: Add altmap support") c3ab300ea555 ("powerpc: Add POWER9 cputable entry") c610ec60ed63 ("powerpc/mm: Move disable_radix handling into mmu_early_init_devtree()") da024512a1fa ("mm: pass the vmem_altmap to arch_remove_memory and __remove_pages") f64e8084c94b ("powerpc/mm: Move hash related mmu-*.h headers to book3s/") fb52bbaee598 ("mm: move is_pageblock_removable_nolock() to mm/memory_hotplug.c") How should we proceed with this patch? -- Thanks, Sasha
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 38d94b703e9d..8402e70f74c2 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -1229,9 +1229,8 @@ static struct page *next_active_pageblock(struct page *page) return page + pageblock_nr_pages; } -static bool is_pageblock_removable_nolock(struct page *page) +static bool is_pageblock_removable_nolock(struct page *page, struct zone **zone) { - struct zone *zone; unsigned long pfn; /* @@ -1241,15 +1240,14 @@ static bool is_pageblock_removable_nolock(struct page *page) * We have to take care about the node as well. If the node is offline * its NODE_DATA will be NULL - see page_zone. */ - if (!node_online(page_to_nid(page))) - return false; - - zone = page_zone(page); pfn = page_to_pfn(page); - if (!zone_spans_pfn(zone, pfn)) + if (*zone && !zone_spans_pfn(*zone, pfn)) return false; + if (!node_online(page_to_nid(page))) + return false; + *zone = page_zone(page); - return !has_unmovable_pages(zone, page, 0, MIGRATE_MOVABLE, true); + return !has_unmovable_pages(*zone, page, 0, MIGRATE_MOVABLE, true); } /* Checks if this range of memory is likely to be hot-removable. */ @@ -1257,10 +1255,11 @@ bool is_mem_section_removable(unsigned long start_pfn, unsigned long nr_pages) { struct page *page = pfn_to_page(start_pfn); struct page *end_page = page + nr_pages; + struct zone *zone = NULL; /* Check the starting page of each pageblock within the range */ for (; page < end_page; page = next_active_pageblock(page)) { - if (!is_pageblock_removable_nolock(page)) + if (!is_pageblock_removable_nolock(page, &zone)) return false; cond_resched(); } @@ -1296,6 +1295,9 @@ int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn, i++; if (i == MAX_ORDER_NR_PAGES || pfn + i >= end_pfn) continue; + /* Check if we got outside of the zone */ + if (zone && !zone_spans_pfn(zone, pfn + i)) + return 0; page = pfn_to_page(pfn + i); if (zone && page_zone(page) != zone) return 0;