summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/arm64/mm/mmu.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c
index b30bdffa3066..fc7a1c1e5d0f 100644
--- a/arch/arm64/mm/mmu.c
+++ b/arch/arm64/mm/mmu.c
@@ -656,10 +656,16 @@ static phys_addr_t pgd_pgtable_alloc(void)
*/
void hotplug_paging(phys_addr_t start, phys_addr_t size)
{
-
struct page *pg;
- phys_addr_t pgd_phys = pgd_pgtable_alloc();
- pgd_t *pgd = pgd_set_fixmap(pgd_phys);
+ phys_addr_t pgd_phys;
+ pgd_t *pgd;
+ int cpu;
+
+ for_each_possible_cpu(cpu)
+ if (current->cpu != cpu)
+ sched_isolate_cpu(cpu);
+ pgd_phys = pgd_pgtable_alloc();
+ pgd = pgd_set_fixmap(pgd_phys);
memcpy(pgd, swapper_pg_dir, PAGE_SIZE);
@@ -675,6 +681,9 @@ void hotplug_paging(phys_addr_t start, phys_addr_t size)
pg = phys_to_page(pgd_phys);
pgtable_page_dtor(pg);
__free_pages(pg, 0);
+ for_each_possible_cpu(cpu)
+ if (current->cpu != cpu)
+ sched_unisolate_cpu_unlocked(cpu);
}
#ifdef CONFIG_MEMORY_HOTREMOVE