From: Dave Hansen <dave.han...@linux.intel.com>
In the process of onlining memory, we use walk_system_ram_range() to find the actual RAM areas inside of the area being onlined. However, it currently only finds memory resources which are "top-level" iomem_resources. Children are not currently searched which causes it to skip System RAM in areas like this (in the format of /proc/iomem): a0000000-bfffffff : Persistent Memory (legacy) a0000000-afffffff : System RAM Changing the true->false here allows children to be searched as well. We need this because we add a new "System RAM" resource underneath the "persistent memory" resource when we use persistent memory in a volatile mode. Signed-off-by: Dave Hansen <dave.han...@linux.intel.com> Cc: Dan Williams <dan.j.willi...@intel.com> Cc: Dave Jiang <dave.ji...@intel.com> Cc: Ross Zwisler <zwis...@kernel.org> Cc: Vishal Verma <vishal.l.ve...@intel.com> Cc: Tom Lendacky <thomas.lenda...@amd.com> Cc: Andrew Morton <a...@linux-foundation.org> Cc: Michal Hocko <mho...@suse.com> Cc: linux-nvd...@lists.01.org Cc: linux-kernel@vger.kernel.org Cc: linux...@kvack.org Cc: Huang Ying <ying.hu...@intel.com> Cc: Fengguang Wu <fengguang...@intel.com> Cc: Borislav Petkov <b...@suse.de> Cc: Bjorn Helgaas <bhelg...@google.com> Cc: Yaowei Bai <baiyao...@cmss.chinamobile.com> Cc: Takashi Iwai <ti...@suse.de> Cc: Jerome Glisse <jgli...@redhat.com> --- b/kernel/resource.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff -puN kernel/resource.c~mm-walk_system_ram_range-search-child-resources kernel/resource.c --- a/kernel/resource.c~mm-walk_system_ram_range-search-child-resources 2019-01-24 15:13:15.482199536 -0800 +++ b/kernel/resource.c 2019-01-24 15:13:15.486199536 -0800 @@ -445,6 +445,9 @@ int walk_mem_res(u64 start, u64 end, voi * This function calls the @func callback against all memory ranges of type * System RAM which are marked as IORESOURCE_SYSTEM_RAM and IORESOUCE_BUSY. * It is to be used only for System RAM. + * + * This will find System RAM ranges that are children of top-level resources + * in addition to top-level System RAM resources. */ int walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages, void *arg, int (*func)(unsigned long, unsigned long, void *)) @@ -460,7 +463,7 @@ int walk_system_ram_range(unsigned long flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; while (start < end && !find_next_iomem_res(start, end, flags, IORES_DESC_NONE, - true, &res)) { + false, &res)) { pfn = (res.start + PAGE_SIZE - 1) >> PAGE_SHIFT; end_pfn = (res.end + 1) >> PAGE_SHIFT; if (end_pfn > pfn) _