Message ID | 20200307084229.28251-2-bhe@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | mm/hotplug: Only use subsection map for VMEMMAP | expand |
On Sat, 7 Mar 2020 16:42:23 +0800 Baoquan He <bhe@redhat.com> wrote: > In section_deactivate(), pfn_to_page() doesn't work any more after > ms->section_mem_map is resetting to NULL in SPARSEMEM|!VMEMMAP case. > It caused hot remove failure: > > kernel BUG at mm/page_alloc.c:4806! > invalid opcode: 0000 [#1] SMP PTI > CPU: 3 PID: 8 Comm: kworker/u16:0 Tainted: G W 5.5.0-next-20200205+ #340 > Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 0.0.0 02/06/2015 > Workqueue: kacpi_hotplug acpi_hotplug_work_fn > RIP: 0010:free_pages+0x85/0xa0 > Call Trace: > __remove_pages+0x99/0xc0 > arch_remove_memory+0x23/0x4d > try_remove_memory+0xc8/0x130 > ? walk_memory_blocks+0x72/0xa0 > __remove_memory+0xa/0x11 > acpi_memory_device_remove+0x72/0x100 > acpi_bus_trim+0x55/0x90 > acpi_device_hotplug+0x2eb/0x3d0 > acpi_hotplug_work_fn+0x1a/0x30 > process_one_work+0x1a7/0x370 > worker_thread+0x30/0x380 > ? flush_rcu_work+0x30/0x30 > kthread+0x112/0x130 > ? kthread_create_on_node+0x60/0x60 > ret_from_fork+0x35/0x40 > > Let's move the ->section_mem_map resetting after depopulate_section_memmap() > to fix it. Thanks. I think I'll cherrypick this fix and shall await more review/testing input on the rest of the series.
On 03/07/20 at 12:59pm, Andrew Morton wrote: > On Sat, 7 Mar 2020 16:42:23 +0800 Baoquan He <bhe@redhat.com> wrote: > > > In section_deactivate(), pfn_to_page() doesn't work any more after > > ms->section_mem_map is resetting to NULL in SPARSEMEM|!VMEMMAP case. > > It caused hot remove failure: > > > > kernel BUG at mm/page_alloc.c:4806! > > invalid opcode: 0000 [#1] SMP PTI > > CPU: 3 PID: 8 Comm: kworker/u16:0 Tainted: G W 5.5.0-next-20200205+ #340 > > Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 0.0.0 02/06/2015 > > Workqueue: kacpi_hotplug acpi_hotplug_work_fn > > RIP: 0010:free_pages+0x85/0xa0 > > Call Trace: > > __remove_pages+0x99/0xc0 > > arch_remove_memory+0x23/0x4d > > try_remove_memory+0xc8/0x130 > > ? walk_memory_blocks+0x72/0xa0 > > __remove_memory+0xa/0x11 > > acpi_memory_device_remove+0x72/0x100 > > acpi_bus_trim+0x55/0x90 > > acpi_device_hotplug+0x2eb/0x3d0 > > acpi_hotplug_work_fn+0x1a/0x30 > > process_one_work+0x1a7/0x370 > > worker_thread+0x30/0x380 > > ? flush_rcu_work+0x30/0x30 > > kthread+0x112/0x130 > > ? kthread_create_on_node+0x60/0x60 > > ret_from_fork+0x35/0x40 > > > > Let's move the ->section_mem_map resetting after depopulate_section_memmap() > > to fix it. > > Thanks. I think I'll cherrypick this fix and shall await more > review/testing input on the rest of the series. Sure, thanks.
On 07.03.20 09:42, Baoquan He wrote: > In section_deactivate(), pfn_to_page() doesn't work any more after > ms->section_mem_map is resetting to NULL in SPARSEMEM|!VMEMMAP case. > It caused hot remove failure: > > kernel BUG at mm/page_alloc.c:4806! > invalid opcode: 0000 [#1] SMP PTI > CPU: 3 PID: 8 Comm: kworker/u16:0 Tainted: G W 5.5.0-next-20200205+ #340 > Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 0.0.0 02/06/2015 > Workqueue: kacpi_hotplug acpi_hotplug_work_fn > RIP: 0010:free_pages+0x85/0xa0 > Call Trace: > __remove_pages+0x99/0xc0 > arch_remove_memory+0x23/0x4d > try_remove_memory+0xc8/0x130 > ? walk_memory_blocks+0x72/0xa0 > __remove_memory+0xa/0x11 > acpi_memory_device_remove+0x72/0x100 > acpi_bus_trim+0x55/0x90 > acpi_device_hotplug+0x2eb/0x3d0 > acpi_hotplug_work_fn+0x1a/0x30 > process_one_work+0x1a7/0x370 > worker_thread+0x30/0x380 > ? flush_rcu_work+0x30/0x30 > kthread+0x112/0x130 > ? kthread_create_on_node+0x60/0x60 > ret_from_fork+0x35/0x40 > > Let's move the ->section_mem_map resetting after depopulate_section_memmap() > to fix it. > > Fixes: ba72b4c8cf60 ("mm/sparsemem: support sub-section hotplug") > Signed-off-by: Baoquan He <bhe@redhat.com> > Cc: stable@vger.kernel.org > --- > mm/sparse.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/mm/sparse.c b/mm/sparse.c > index 42c18a38ffaa..1b50c15677d7 100644 > --- a/mm/sparse.c > +++ b/mm/sparse.c > @@ -734,6 +734,7 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, > struct mem_section *ms = __pfn_to_section(pfn); > bool section_is_early = early_section(ms); > struct page *memmap = NULL; > + bool empty = false; > unsigned long *subsection_map = ms->usage > ? &ms->usage->subsection_map[0] : NULL; > > @@ -764,7 +765,8 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, > * For 2/ and 3/ the SPARSEMEM_VMEMMAP={y,n} cases are unified > */ > bitmap_xor(subsection_map, map, subsection_map, SUBSECTIONS_PER_SECTION); > - if (bitmap_empty(subsection_map, SUBSECTIONS_PER_SECTION)) { > + empty = bitmap_empty(subsection_map, SUBSECTIONS_PER_SECTION); > + if (empty) { > unsigned long section_nr = pfn_to_section_nr(pfn); > > /* > @@ -779,13 +781,15 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, > ms->usage = NULL; > } > memmap = sparse_decode_mem_map(ms->section_mem_map, section_nr); > - ms->section_mem_map = (unsigned long)NULL; > } > > if (section_is_early && memmap) > free_map_bootmem(memmap); > else > depopulate_section_memmap(pfn, nr_pages, altmap); > + > + if (empty) > + ms->section_mem_map = (unsigned long)NULL; > } > > static struct page * __meminit section_activate(int nid, unsigned long pfn, > Reviewed-by: David Hildenbrand <david@redhat.com>
On 07.03.20 09:42, Baoquan He wrote: > In section_deactivate(), pfn_to_page() doesn't work any more after > ms->section_mem_map is resetting to NULL in SPARSEMEM|!VMEMMAP case. > It caused hot remove failure: > > kernel BUG at mm/page_alloc.c:4806! > invalid opcode: 0000 [#1] SMP PTI > CPU: 3 PID: 8 Comm: kworker/u16:0 Tainted: G W 5.5.0-next-20200205+ #340 > Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 0.0.0 02/06/2015 > Workqueue: kacpi_hotplug acpi_hotplug_work_fn > RIP: 0010:free_pages+0x85/0xa0 > Call Trace: > __remove_pages+0x99/0xc0 > arch_remove_memory+0x23/0x4d > try_remove_memory+0xc8/0x130 > ? walk_memory_blocks+0x72/0xa0 > __remove_memory+0xa/0x11 > acpi_memory_device_remove+0x72/0x100 > acpi_bus_trim+0x55/0x90 > acpi_device_hotplug+0x2eb/0x3d0 > acpi_hotplug_work_fn+0x1a/0x30 > process_one_work+0x1a7/0x370 > worker_thread+0x30/0x380 > ? flush_rcu_work+0x30/0x30 > kthread+0x112/0x130 > ? kthread_create_on_node+0x60/0x60 > ret_from_fork+0x35/0x40 > > Let's move the ->section_mem_map resetting after depopulate_section_memmap() > to fix it. > > Fixes: ba72b4c8cf60 ("mm/sparsemem: support sub-section hotplug") > Signed-off-by: Baoquan He <bhe@redhat.com> > Cc: stable@vger.kernel.org > --- > mm/sparse.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/mm/sparse.c b/mm/sparse.c > index 42c18a38ffaa..1b50c15677d7 100644 > --- a/mm/sparse.c > +++ b/mm/sparse.c > @@ -734,6 +734,7 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, > struct mem_section *ms = __pfn_to_section(pfn); > bool section_is_early = early_section(ms); > struct page *memmap = NULL; > + bool empty = false; Oh, one NIT: no need to initialize empty to false.
> > In section_deactivate(), pfn_to_page() doesn't work any more after > ms->section_mem_map is resetting to NULL in SPARSEMEM|!VMEMMAP case. > It caused hot remove failure: > > kernel BUG at mm/page_alloc.c:4806! > invalid opcode: 0000 [#1] SMP PTI > CPU: 3 PID: 8 Comm: kworker/u16:0 Tainted: G W 5.5.0-next-20200205+ #340 > Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 0.0.0 02/06/2015 > Workqueue: kacpi_hotplug acpi_hotplug_work_fn > RIP: 0010:free_pages+0x85/0xa0 > Call Trace: > __remove_pages+0x99/0xc0 > arch_remove_memory+0x23/0x4d > try_remove_memory+0xc8/0x130 > ? walk_memory_blocks+0x72/0xa0 > __remove_memory+0xa/0x11 > acpi_memory_device_remove+0x72/0x100 > acpi_bus_trim+0x55/0x90 > acpi_device_hotplug+0x2eb/0x3d0 > acpi_hotplug_work_fn+0x1a/0x30 > process_one_work+0x1a7/0x370 > worker_thread+0x30/0x380 > ? flush_rcu_work+0x30/0x30 > kthread+0x112/0x130 > ? kthread_create_on_node+0x60/0x60 > ret_from_fork+0x35/0x40 > > Let's move the ->section_mem_map resetting after depopulate_section_memmap() > to fix it. > > Fixes: ba72b4c8cf60 ("mm/sparsemem: support sub-section hotplug") > Signed-off-by: Baoquan He <bhe@redhat.com> > Cc: stable@vger.kernel.org > --- > mm/sparse.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/mm/sparse.c b/mm/sparse.c > index 42c18a38ffaa..1b50c15677d7 100644 > --- a/mm/sparse.c > +++ b/mm/sparse.c > @@ -734,6 +734,7 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, > struct mem_section *ms = __pfn_to_section(pfn); > bool section_is_early = early_section(ms); > struct page *memmap = NULL; > + bool empty = false; > unsigned long *subsection_map = ms->usage > ? &ms->usage->subsection_map[0] : NULL; > > @@ -764,7 +765,8 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, > * For 2/ and 3/ the SPARSEMEM_VMEMMAP={y,n} cases are unified > */ > bitmap_xor(subsection_map, map, subsection_map, SUBSECTIONS_PER_SECTION); > - if (bitmap_empty(subsection_map, SUBSECTIONS_PER_SECTION)) { > + empty = bitmap_empty(subsection_map, SUBSECTIONS_PER_SECTION); > + if (empty) { > unsigned long section_nr = pfn_to_section_nr(pfn); > > /* > @@ -779,13 +781,15 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, > ms->usage = NULL; > } > memmap = sparse_decode_mem_map(ms->section_mem_map, section_nr); > - ms->section_mem_map = (unsigned long)NULL; > } > > if (section_is_early && memmap) > free_map_bootmem(memmap); > else > depopulate_section_memmap(pfn, nr_pages, altmap); > + > + if (empty) > + ms->section_mem_map = (unsigned long)NULL; > } > > static struct page * __meminit section_activate(int nid, unsigned long pfn, > -- Reviewed-by: Pankaj Gupta <pankaj.gupta.linux@gmail.com> > 2.17.2 > >
On Sat 07-03-20 16:42:23, Baoquan He wrote: > In section_deactivate(), pfn_to_page() doesn't work any more after > ms->section_mem_map is resetting to NULL in SPARSEMEM|!VMEMMAP case. > It caused hot remove failure: > > kernel BUG at mm/page_alloc.c:4806! > invalid opcode: 0000 [#1] SMP PTI > CPU: 3 PID: 8 Comm: kworker/u16:0 Tainted: G W 5.5.0-next-20200205+ #340 > Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 0.0.0 02/06/2015 > Workqueue: kacpi_hotplug acpi_hotplug_work_fn > RIP: 0010:free_pages+0x85/0xa0 > Call Trace: > __remove_pages+0x99/0xc0 > arch_remove_memory+0x23/0x4d > try_remove_memory+0xc8/0x130 > ? walk_memory_blocks+0x72/0xa0 > __remove_memory+0xa/0x11 > acpi_memory_device_remove+0x72/0x100 > acpi_bus_trim+0x55/0x90 > acpi_device_hotplug+0x2eb/0x3d0 > acpi_hotplug_work_fn+0x1a/0x30 > process_one_work+0x1a7/0x370 > worker_thread+0x30/0x380 > ? flush_rcu_work+0x30/0x30 > kthread+0x112/0x130 > ? kthread_create_on_node+0x60/0x60 > ret_from_fork+0x35/0x40 > > Let's move the ->section_mem_map resetting after depopulate_section_memmap() > to fix it. > > Fixes: ba72b4c8cf60 ("mm/sparsemem: support sub-section hotplug") > Signed-off-by: Baoquan He <bhe@redhat.com> > Cc: stable@vger.kernel.org Acked-by: Michal Hocko <mhocko@suse.com> > --- > mm/sparse.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/mm/sparse.c b/mm/sparse.c > index 42c18a38ffaa..1b50c15677d7 100644 > --- a/mm/sparse.c > +++ b/mm/sparse.c > @@ -734,6 +734,7 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, > struct mem_section *ms = __pfn_to_section(pfn); > bool section_is_early = early_section(ms); > struct page *memmap = NULL; > + bool empty = false; > unsigned long *subsection_map = ms->usage > ? &ms->usage->subsection_map[0] : NULL; > > @@ -764,7 +765,8 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, > * For 2/ and 3/ the SPARSEMEM_VMEMMAP={y,n} cases are unified > */ > bitmap_xor(subsection_map, map, subsection_map, SUBSECTIONS_PER_SECTION); > - if (bitmap_empty(subsection_map, SUBSECTIONS_PER_SECTION)) { > + empty = bitmap_empty(subsection_map, SUBSECTIONS_PER_SECTION); > + if (empty) { > unsigned long section_nr = pfn_to_section_nr(pfn); > > /* > @@ -779,13 +781,15 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, > ms->usage = NULL; > } > memmap = sparse_decode_mem_map(ms->section_mem_map, section_nr); > - ms->section_mem_map = (unsigned long)NULL; > } > > if (section_is_early && memmap) > free_map_bootmem(memmap); > else > depopulate_section_memmap(pfn, nr_pages, altmap); > + > + if (empty) > + ms->section_mem_map = (unsigned long)NULL; > } > > static struct page * __meminit section_activate(int nid, unsigned long pfn, > -- > 2.17.2 >
On 03/09/20 at 09:58am, David Hildenbrand wrote: > On 07.03.20 09:42, Baoquan He wrote: > > In section_deactivate(), pfn_to_page() doesn't work any more after > > ms->section_mem_map is resetting to NULL in SPARSEMEM|!VMEMMAP case. > > It caused hot remove failure: > > > > kernel BUG at mm/page_alloc.c:4806! > > invalid opcode: 0000 [#1] SMP PTI > > CPU: 3 PID: 8 Comm: kworker/u16:0 Tainted: G W 5.5.0-next-20200205+ #340 > > Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 0.0.0 02/06/2015 > > Workqueue: kacpi_hotplug acpi_hotplug_work_fn > > RIP: 0010:free_pages+0x85/0xa0 > > Call Trace: > > __remove_pages+0x99/0xc0 > > arch_remove_memory+0x23/0x4d > > try_remove_memory+0xc8/0x130 > > ? walk_memory_blocks+0x72/0xa0 > > __remove_memory+0xa/0x11 > > acpi_memory_device_remove+0x72/0x100 > > acpi_bus_trim+0x55/0x90 > > acpi_device_hotplug+0x2eb/0x3d0 > > acpi_hotplug_work_fn+0x1a/0x30 > > process_one_work+0x1a7/0x370 > > worker_thread+0x30/0x380 > > ? flush_rcu_work+0x30/0x30 > > kthread+0x112/0x130 > > ? kthread_create_on_node+0x60/0x60 > > ret_from_fork+0x35/0x40 > > > > Let's move the ->section_mem_map resetting after depopulate_section_memmap() > > to fix it. > > > > Fixes: ba72b4c8cf60 ("mm/sparsemem: support sub-section hotplug") > > Signed-off-by: Baoquan He <bhe@redhat.com> > > Cc: stable@vger.kernel.org > > --- > > mm/sparse.c | 8 ++++++-- > > 1 file changed, 6 insertions(+), 2 deletions(-) > > > > diff --git a/mm/sparse.c b/mm/sparse.c > > index 42c18a38ffaa..1b50c15677d7 100644 > > --- a/mm/sparse.c > > +++ b/mm/sparse.c > > @@ -734,6 +734,7 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, > > struct mem_section *ms = __pfn_to_section(pfn); > > bool section_is_early = early_section(ms); > > struct page *memmap = NULL; > > + bool empty = false; > > Oh, one NIT: no need to initialize empty to false. Thanks for careful reviewing, David. Not very sure about this, do you have a doc or discussion thread about not initializing local variable? Maybe Andrew can help update it if this is not suggested.
On 09.03.20 14:18, Baoquan He wrote: > On 03/09/20 at 09:58am, David Hildenbrand wrote: >> On 07.03.20 09:42, Baoquan He wrote: >>> In section_deactivate(), pfn_to_page() doesn't work any more after >>> ms->section_mem_map is resetting to NULL in SPARSEMEM|!VMEMMAP case. >>> It caused hot remove failure: >>> >>> kernel BUG at mm/page_alloc.c:4806! >>> invalid opcode: 0000 [#1] SMP PTI >>> CPU: 3 PID: 8 Comm: kworker/u16:0 Tainted: G W 5.5.0-next-20200205+ #340 >>> Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 0.0.0 02/06/2015 >>> Workqueue: kacpi_hotplug acpi_hotplug_work_fn >>> RIP: 0010:free_pages+0x85/0xa0 >>> Call Trace: >>> __remove_pages+0x99/0xc0 >>> arch_remove_memory+0x23/0x4d >>> try_remove_memory+0xc8/0x130 >>> ? walk_memory_blocks+0x72/0xa0 >>> __remove_memory+0xa/0x11 >>> acpi_memory_device_remove+0x72/0x100 >>> acpi_bus_trim+0x55/0x90 >>> acpi_device_hotplug+0x2eb/0x3d0 >>> acpi_hotplug_work_fn+0x1a/0x30 >>> process_one_work+0x1a7/0x370 >>> worker_thread+0x30/0x380 >>> ? flush_rcu_work+0x30/0x30 >>> kthread+0x112/0x130 >>> ? kthread_create_on_node+0x60/0x60 >>> ret_from_fork+0x35/0x40 >>> >>> Let's move the ->section_mem_map resetting after depopulate_section_memmap() >>> to fix it. >>> >>> Fixes: ba72b4c8cf60 ("mm/sparsemem: support sub-section hotplug") >>> Signed-off-by: Baoquan He <bhe@redhat.com> >>> Cc: stable@vger.kernel.org >>> --- >>> mm/sparse.c | 8 ++++++-- >>> 1 file changed, 6 insertions(+), 2 deletions(-) >>> >>> diff --git a/mm/sparse.c b/mm/sparse.c >>> index 42c18a38ffaa..1b50c15677d7 100644 >>> --- a/mm/sparse.c >>> +++ b/mm/sparse.c >>> @@ -734,6 +734,7 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, >>> struct mem_section *ms = __pfn_to_section(pfn); >>> bool section_is_early = early_section(ms); >>> struct page *memmap = NULL; >>> + bool empty = false; >> >> Oh, one NIT: no need to initialize empty to false. > > Thanks for careful reviewing, David. > > Not very sure about this, do you have a doc or discussion thread about > not initializing local variable? Maybe Andrew can help update it if this > is not suggested. The general rule is to no initialize what will always be initialized later. Compare with most other code in-tree - e.g., sparse_init_nid. Makes the code usually easier to follow.
diff --git a/mm/sparse.c b/mm/sparse.c index 42c18a38ffaa..1b50c15677d7 100644 --- a/mm/sparse.c +++ b/mm/sparse.c @@ -734,6 +734,7 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, struct mem_section *ms = __pfn_to_section(pfn); bool section_is_early = early_section(ms); struct page *memmap = NULL; + bool empty = false; unsigned long *subsection_map = ms->usage ? &ms->usage->subsection_map[0] : NULL; @@ -764,7 +765,8 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, * For 2/ and 3/ the SPARSEMEM_VMEMMAP={y,n} cases are unified */ bitmap_xor(subsection_map, map, subsection_map, SUBSECTIONS_PER_SECTION); - if (bitmap_empty(subsection_map, SUBSECTIONS_PER_SECTION)) { + empty = bitmap_empty(subsection_map, SUBSECTIONS_PER_SECTION); + if (empty) { unsigned long section_nr = pfn_to_section_nr(pfn); /* @@ -779,13 +781,15 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, ms->usage = NULL; } memmap = sparse_decode_mem_map(ms->section_mem_map, section_nr); - ms->section_mem_map = (unsigned long)NULL; } if (section_is_early && memmap) free_map_bootmem(memmap); else depopulate_section_memmap(pfn, nr_pages, altmap); + + if (empty) + ms->section_mem_map = (unsigned long)NULL; } static struct page * __meminit section_activate(int nid, unsigned long pfn,
In section_deactivate(), pfn_to_page() doesn't work any more after ms->section_mem_map is resetting to NULL in SPARSEMEM|!VMEMMAP case. It caused hot remove failure: kernel BUG at mm/page_alloc.c:4806! invalid opcode: 0000 [#1] SMP PTI CPU: 3 PID: 8 Comm: kworker/u16:0 Tainted: G W 5.5.0-next-20200205+ #340 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 0.0.0 02/06/2015 Workqueue: kacpi_hotplug acpi_hotplug_work_fn RIP: 0010:free_pages+0x85/0xa0 Call Trace: __remove_pages+0x99/0xc0 arch_remove_memory+0x23/0x4d try_remove_memory+0xc8/0x130 ? walk_memory_blocks+0x72/0xa0 __remove_memory+0xa/0x11 acpi_memory_device_remove+0x72/0x100 acpi_bus_trim+0x55/0x90 acpi_device_hotplug+0x2eb/0x3d0 acpi_hotplug_work_fn+0x1a/0x30 process_one_work+0x1a7/0x370 worker_thread+0x30/0x380 ? flush_rcu_work+0x30/0x30 kthread+0x112/0x130 ? kthread_create_on_node+0x60/0x60 ret_from_fork+0x35/0x40 Let's move the ->section_mem_map resetting after depopulate_section_memmap() to fix it. Fixes: ba72b4c8cf60 ("mm/sparsemem: support sub-section hotplug") Signed-off-by: Baoquan He <bhe@redhat.com> Cc: stable@vger.kernel.org --- mm/sparse.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)