At 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 think >> this 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? I misunderstand sth, please ignore it. Wen Congyang > > Thansk, > Yasuaki Ishimatsu > >> Thanks >> Wen Congyang >> >>> >>> CC: 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 from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html