On 09/11/2012 10:24 AM, Yasuaki Ishimatsu wrote:
Hi Wen, 2012/09/11 11:15, Wen Congyang wrote:Hi, ishimatsu At 09/05/2012 05:25 PM, wency@xxxxxxxxxxxxxx Wrote:From: Yasuaki Ishimatsu <isimatu.yasuaki@xxxxxxxxxxxxxx>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.Because we use memory_block_change_state() to hotremoving memory, I thinkthis patch can be removed. What do you think?Pleae teach me detals a little more. If we use memory_block_change_state(),does the conflict never occur? Why?
since memory hot-add or hot-remove is based on memblock, if check in memory_block_change_state()
can guarantee conflict never occur?
Thansk, Yasuaki IshimatsuThanks Wen CongyangCC: David Rientjes <rientjes@xxxxxxxxxx> CC: Jiang Liu <liuj97@xxxxxxxxx> CC: Len Brown <len.brown@xxxxxxxxx> CC: Benjamin Herrenschmidt <benh@xxxxxxxxxxxxxxxxxxx> CC: Paul Mackerras <paulus@xxxxxxxxx> CC: Christoph Lameter <cl@xxxxxxxxx> Cc: Minchan Kim <minchan.kim@xxxxxxxxx> CC: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> CC: KOSAKI Motohiro <kosaki.motohiro@xxxxxxxxxxxxxx> CC: Wen Congyang <wency@xxxxxxxxxxxxxx> Signed-off-by: Yasuaki Ishimatsu <isimatu.yasuaki@xxxxxxxxxxxxxx> --- include/linux/mmzone.h | 19 +++++++++++++++++++ mm/memory_hotplug.c | 13 +++++++++++++ 2 files changed, 32 insertions(+), 0 deletions(-) diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 2daa54f..ac3ae30 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -1180,6 +1180,25 @@ 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 + i)) + continue; + else + 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 diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 49f7747..299747d 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c@@ -467,6 +467,19 @@ int __ref online_pages(unsigned long pfn, unsigned long nr_pages)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;-- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>
-- To unsubscribe from this list: send the line "unsubscribe linux-ia64" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html