|
@@ -796,8 +796,10 @@ static inline void clear_hwpoisoned_pages(struct page *memmap, int nr_pages)
|
|
|
void sparse_remove_one_section(struct zone *zone, struct mem_section *ms)
|
|
|
{
|
|
|
struct page *memmap = NULL;
|
|
|
- unsigned long *usemap = NULL;
|
|
|
+ unsigned long *usemap = NULL, flags;
|
|
|
+ struct pglist_data *pgdat = zone->zone_pgdat;
|
|
|
|
|
|
+ pgdat_resize_lock(pgdat, &flags);
|
|
|
if (ms->section_mem_map) {
|
|
|
usemap = ms->pageblock_flags;
|
|
|
memmap = sparse_decode_mem_map(ms->section_mem_map,
|
|
@@ -805,6 +807,7 @@ void sparse_remove_one_section(struct zone *zone, struct mem_section *ms)
|
|
|
ms->section_mem_map = 0;
|
|
|
ms->pageblock_flags = NULL;
|
|
|
}
|
|
|
+ pgdat_resize_unlock(pgdat, &flags);
|
|
|
|
|
|
clear_hwpoisoned_pages(memmap, PAGES_PER_SECTION);
|
|
|
free_section_usemap(memmap, usemap);
|