| From 27227c733852f71008e9bf165950bb2edaed3a90 Mon Sep 17 00:00:00 2001 |
| From: Pavel Tatashin <pasha.tatashin@oracle.com> |
| Date: Fri, 11 May 2018 16:01:50 -0700 |
| Subject: mm: sections are not offlined during memory hotremove |
| |
| From: Pavel Tatashin <pasha.tatashin@oracle.com> |
| |
| commit 27227c733852f71008e9bf165950bb2edaed3a90 upstream. |
| |
| Memory hotplug and hotremove operate with per-block granularity. If the |
| machine has a large amount of memory (more than 64G), the size of a |
| memory block can span multiple sections. By mistake, during hotremove |
| we set only the first section to offline state. |
| |
| The bug was discovered because kernel selftest started to fail: |
| https://lkml.kernel.org/r/20180423011247.GK5563@yexl-desktop |
| |
| After commit, "mm/memory_hotplug: optimize probe routine". But, the bug |
| is older than this commit. In this optimization we also added a check |
| for sections to be in a proper state during hotplug operation. |
| |
| Link: http://lkml.kernel.org/r/20180427145257.15222-1-pasha.tatashin@oracle.com |
| Fixes: 2d070eab2e82 ("mm: consider zone which is not fully populated to have holes") |
| Signed-off-by: Pavel Tatashin <pasha.tatashin@oracle.com> |
| Acked-by: Michal Hocko <mhocko@suse.com> |
| Reviewed-by: Andrew Morton <akpm@linux-foundation.org> |
| Cc: Vlastimil Babka <vbabka@suse.cz> |
| Cc: Steven Sistare <steven.sistare@oracle.com> |
| Cc: Daniel Jordan <daniel.m.jordan@oracle.com> |
| Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| mm/sparse.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/mm/sparse.c |
| +++ b/mm/sparse.c |
| @@ -666,7 +666,7 @@ void offline_mem_sections(unsigned long |
| unsigned long pfn; |
| |
| for (pfn = start_pfn; pfn < end_pfn; pfn += PAGES_PER_SECTION) { |
| - unsigned long section_nr = pfn_to_section_nr(start_pfn); |
| + unsigned long section_nr = pfn_to_section_nr(pfn); |
| struct mem_section *ms; |
| |
| /* |