Message ID | 50126D44.7070608@cn.fujitsu.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, Jul 27, 2012 at 3:28 AM, Wen Congyang <wency@cn.fujitsu.com> wrote: > +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)) Typo? I think you meant "pfn + i" > + continue; > + else > + return -EINVAL; > + } > + return 0; > +} -Tony -- 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 07/28/2012 04:17 AM, Tony Luck Wrote: > On Fri, Jul 27, 2012 at 3:28 AM, Wen Congyang <wency@cn.fujitsu.com> wrote: >> +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)) > > Typo? I think you meant "pfn + i" Typo error. Thanks for pointing it out. Wen Congyang > >> + continue; >> + else >> + return -EINVAL; >> + } >> + return 0; >> +} > > -Tony > -- 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 458988b..822f705 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -1168,6 +1168,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 + 1)) + 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 5af0a9f..d510be0 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;