From: Dave Hansen dave.hansen@linux.intel.com
mainline inclusion from mainline-v5.1-rc1 commit 2b539aefe9e48e3908cff02699aa63a8b9bd268e category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/I47H3V CVE: NA
--------------------------------
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.hansen@linux.intel.com Cc: Keith Busch keith.busch@intel.com Cc: Dan Williams dan.j.williams@intel.com Cc: Dave Jiang dave.jiang@intel.com Cc: Ross Zwisler zwisler@kernel.org Cc: Vishal Verma vishal.l.verma@intel.com Cc: Tom Lendacky thomas.lendacky@amd.com Cc: Andrew Morton akpm@linux-foundation.org Cc: Michal Hocko mhocko@suse.com Cc: linux-nvdimm@lists.01.org Cc: linux-kernel@vger.kernel.org Cc: linux-mm@kvack.org Cc: Huang Ying ying.huang@intel.com Cc: Fengguang Wu fengguang.wu@intel.com Cc: Borislav Petkov bp@suse.de Cc: Bjorn Helgaas bhelgaas@google.com Cc: Yaowei Bai baiyaowei@cmss.chinamobile.com Cc: Takashi Iwai tiwai@suse.de Cc: Jerome Glisse jglisse@redhat.com Signed-off-by: Dan Williams dan.j.williams@intel.com Signed-off-by: Jackie Liu liuyun01@kylinos.cn Signed-off-by: Zheng Zengkai zhengzengkai@huawei.com Reviewed-by: Xie XiuQi xiexiuqi@huawei.com Signed-off-by: Yang Yingliang yangyingliang@huawei.com --- kernel/resource.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/kernel/resource.c b/kernel/resource.c index 2cf0edd8223f2..55a3c60106827 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -448,6 +448,9 @@ int walk_mem_res(u64 start, u64 end, void *arg, * 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 *)) @@ -463,7 +466,7 @@ int walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages, 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)