Message ID | 1346837155-534-6-git-send-email-wency@cn.fujitsu.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi, ishimatsu At 09/05/2012 05:25 PM, wency@cn.fujitsu.com Wrote: > From: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com> > > 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? Thanks Wen Congyang > > CC: David Rientjes <rientjes@google.com> > CC: Jiang Liu <liuj97@gmail.com> > CC: Len Brown <len.brown@intel.com> > CC: Benjamin Herrenschmidt <benh@kernel.crashing.org> > CC: Paul Mackerras <paulus@samba.org> > CC: Christoph Lameter <cl@linux.com> > Cc: Minchan Kim <minchan.kim@gmail.com> > CC: Andrew Morton <akpm@linux-foundation.org> > CC: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> > CC: Wen Congyang <wency@cn.fujitsu.com> > Signed-off-by: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com> > --- > 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@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Wen, 2012/09/11 11:15, Wen Congyang wrote: > Hi, ishimatsu > > At 09/05/2012 05:25 PM, wency@cn.fujitsu.com Wrote: >> From: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com> >> >> 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? Thansk, Yasuaki Ishimatsu > Thanks > Wen Congyang > >> >> CC: David Rientjes <rientjes@google.com> >> CC: Jiang Liu <liuj97@gmail.com> >> CC: Len Brown <len.brown@intel.com> >> CC: Benjamin Herrenschmidt <benh@kernel.crashing.org> >> CC: Paul Mackerras <paulus@samba.org> >> CC: Christoph Lameter <cl@linux.com> >> Cc: Minchan Kim <minchan.kim@gmail.com> >> CC: Andrew Morton <akpm@linux-foundation.org> >> CC: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> >> CC: Wen Congyang <wency@cn.fujitsu.com> >> Signed-off-by: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com> >> --- >> 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@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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@cn.fujitsu.com Wrote: >>> From: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com> >>> >>> 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@google.com> >>> CC: Jiang Liu <liuj97@gmail.com> >>> CC: Len Brown <len.brown@intel.com> >>> CC: Benjamin Herrenschmidt <benh@kernel.crashing.org> >>> CC: Paul Mackerras <paulus@samba.org> >>> CC: Christoph Lameter <cl@linux.com> >>> Cc: Minchan Kim <minchan.kim@gmail.com> >>> CC: Andrew Morton <akpm@linux-foundation.org> >>> CC: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> >>> CC: Wen Congyang <wency@cn.fujitsu.com> >>> Signed-off-by: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com> >>> --- >>> 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@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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@cn.fujitsu.com Wrote: >>> From: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com> >>> >>> 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? 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 Ishimatsu > >> Thanks >> Wen Congyang >> >>> >>> CC: David Rientjes <rientjes@google.com> >>> CC: Jiang Liu <liuj97@gmail.com> >>> CC: Len Brown <len.brown@intel.com> >>> CC: Benjamin Herrenschmidt <benh@kernel.crashing.org> >>> CC: Paul Mackerras <paulus@samba.org> >>> CC: Christoph Lameter <cl@linux.com> >>> Cc: Minchan Kim <minchan.kim@gmail.com> >>> CC: Andrew Morton <akpm@linux-foundation.org> >>> CC: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> >>> CC: Wen Congyang <wency@cn.fujitsu.com> >>> Signed-off-by: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com> >>> --- >>> 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@kvack.org. For more info on Linux MM, > see: http://www.linux-mm.org/ . > Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> > -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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;