Re: [PATCH v4 3/13] memory-hotplug : check whether memory is present or not
From: Wen Congyang <hidden>
Date: 2012-07-18 10:20:57
Also in:
linux-acpi, linux-mm, linuxppc-dev
At 07/18/2012 06:07 PM, Yasuaki Ishimatsu Wrote:
quoted hunk ↗ jump to hunk
If system supports memory hot-remove, online_pages() may online removed pages. So online_pages() need to check whether onlining pages are present or not. CC: David Rientjes <rientjes@google.com> CC: Jiang Liu <redacted> CC: Len Brown <redacted> CC: Benjamin Herrenschmidt <benh@kernel.crashing.org> CC: Paul Mackerras <redacted> CC: Christoph Lameter <redacted> Cc: Minchan Kim <redacted> CC: Andrew Morton <akpm@linux-foundation.org> CC: KOSAKI Motohiro <redacted> CC: Wen Congyang <redacted> Signed-off-by: Yasuaki Ishimatsu <redacted> --- include/linux/mmzone.h | 21 +++++++++++++++++++++ mm/memory_hotplug.c | 13 +++++++++++++ 2 files changed, 34 insertions(+) Index: linux-3.5-rc6/include/linux/mmzone.h ===================================================================--- linux-3.5-rc6.orig/include/linux/mmzone.h 2012-07-08 09:23:56.000000000 +0900 +++ linux-3.5-rc6/include/linux/mmzone.h 2012-07-17 16:10:21.588186145 +0900@@ -1168,6 +1168,27 @@ void sparse_init(void); #define sparse_index_init(_sec, _nid) do {} while (0) #endif /* CONFIG_SPARSEMEM */ +#ifdef CONFIG_SPARSEMEM +static inline int pfns_present(unsigned long pfn, unsigned long nr_pages) +{ + int i; + for (i = 0; i < nr_pages; i++) { + if (pfn_present(pfn + 1)) + continue; + else { + unlock_memory_hotplug();
Why do you unlock memory hotplug here? The caller will do it. Thanks Wen Congyang
quoted hunk ↗ jump to hunk
+ return -EINVAL; + } + } + return 0; +} +#else +static inline int pfns_present(unsigned long pfn, unsigned long nr_pages) +{ + return 0; +} +#endif /* CONFIG_SPARSEMEM*/ + #ifdef CONFIG_NODES_SPAN_OTHER_NODES bool early_pfn_in_nid(unsigned long pfn, int nid); #else Index: linux-3.5-rc6/mm/memory_hotplug.c ===================================================================--- linux-3.5-rc6.orig/mm/memory_hotplug.c 2012-07-17 14:26:40.000000000 +0900 +++ linux-3.5-rc6/mm/memory_hotplug.c 2012-07-17 16:09:50.070580170 +0900@@ -467,6 +467,19 @@ int __ref online_pages(unsigned long pfn struct memory_notify arg; lock_memory_hotplug(); + /* + * If system supports memory hot-remove, the memory may have been + * removed. So we check whether the memory has been removed or not. + * + * Note: When CONFIG_SPARSEMEM is defined, pfns_present() become + * effective. If CONFIG_SPARSEMEM is not defined, pfns_present() + * always returns 0. + */ + ret = pfns_present(pfn, nr_pages); + if (ret) { + unlock_memory_hotplug(); + return ret; + } arg.start_pfn = pfn; arg.nr_pages = nr_pages; arg.status_change_nid = -1;