powerpc/mm: Limit resize_hpt_for_hotplug() call to hash guests only
authorBharata B Rao <bharata@linux.ibm.com>
Mon, 27 Jul 2020 09:57:04 +0000 (15:27 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 29 Jul 2020 11:02:12 +0000 (21:02 +1000)
During memory hotplug and unplug, resize_hpt_for_hotplug() gets called
for both hash and radix guests but it should be called only for hash
guests. Though the call does nothing in the radix guest case, it is
cleaner to push this call into hash specific memory hotplug routines.

Reported-by: Nathan Lynch <nathanl@linux.ibm.com>
Signed-off-by: Bharata B Rao <bharata@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20200727095704.1432916-1-bharata@linux.ibm.com
arch/powerpc/include/asm/sparsemem.h
arch/powerpc/mm/book3s64/hash_utils.c
arch/powerpc/mm/mem.c

index c89b32443cff30ca3a902692b4bcdd172ca43229..1e6fa371cc387901f084ab64d7167e15fd61ec08 100644 (file)
@@ -17,12 +17,6 @@ extern int create_section_mapping(unsigned long start, unsigned long end,
                                  int nid, pgprot_t prot);
 extern int remove_section_mapping(unsigned long start, unsigned long end);
 
-#ifdef CONFIG_PPC_BOOK3S_64
-extern int resize_hpt_for_hotplug(unsigned long new_mem_size);
-#else
-static inline int resize_hpt_for_hotplug(unsigned long new_mem_size) { return 0; }
-#endif
-
 #ifdef CONFIG_NUMA
 extern int hot_add_scn_to_nid(unsigned long scn_addr);
 #else
index 9fdabea0499073a5372230730662fb52e6286cf7..30a4a91d99877fecb5f535b71a7be3058410266d 100644 (file)
@@ -785,7 +785,7 @@ static unsigned long __init htab_get_table_size(void)
 }
 
 #ifdef CONFIG_MEMORY_HOTPLUG
-int resize_hpt_for_hotplug(unsigned long new_mem_size)
+static int resize_hpt_for_hotplug(unsigned long new_mem_size)
 {
        unsigned target_hpt_shift;
 
@@ -819,6 +819,8 @@ int hash__create_section_mapping(unsigned long start, unsigned long end,
                return -1;
        }
 
+       resize_hpt_for_hotplug(memblock_phys_mem_size());
+
        rc = htab_bolt_mapping(start, end, __pa(start),
                               pgprot_val(prot), mmu_linear_psize,
                               mmu_kernel_ssize);
@@ -836,6 +838,10 @@ int hash__remove_section_mapping(unsigned long start, unsigned long end)
        int rc = htab_remove_mapping(start, end, mmu_linear_psize,
                                     mmu_kernel_ssize);
        WARN_ON(rc < 0);
+
+       if (resize_hpt_for_hotplug(memblock_phys_mem_size()) == -ENOSPC)
+               pr_warn("Hash collision while resizing HPT\n");
+
        return rc;
 }
 #endif /* CONFIG_MEMORY_HOTPLUG */
index c2c11eb8dcfcae97892e9302017a76ff840158c8..9dafc636588f058ab4917f99c8b2a22304ddb620 100644 (file)
@@ -127,8 +127,6 @@ int __ref arch_add_memory(int nid, u64 start, u64 size,
        unsigned long nr_pages = size >> PAGE_SHIFT;
        int rc;
 
-       resize_hpt_for_hotplug(memblock_phys_mem_size());
-
        start = (unsigned long)__va(start);
        rc = create_section_mapping(start, start + size, nid,
                                    params->pgprot);
@@ -161,9 +159,6 @@ void __ref arch_remove_memory(int nid, u64 start, u64 size,
         * hit that section of memory
         */
        vm_unmap_aliases();
-
-       if (resize_hpt_for_hotplug(memblock_phys_mem_size()) == -ENOSPC)
-               pr_warn("Hash collision while resizing HPT\n");
 }
 #endif