mm/memory_hotplug: allow memmap on memory hotplug request to fallback
authorAneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
Tue, 8 Aug 2023 09:14:57 +0000 (14:44 +0530)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 21 Aug 2023 20:37:48 +0000 (13:37 -0700)
If not supported, fallback to not using memap on memmory. This avoids
the need for callers to do the fallback.

Link: https://lkml.kernel.org/r/20230808091501.287660-3-aneesh.kumar@linux.ibm.com
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
Acked-by: Michal Hocko <mhocko@suse.com>
Acked-by: David Hildenbrand <david@redhat.com>
Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Nicholas Piggin <npiggin@gmail.com>
Cc: Oscar Salvador <osalvador@suse.de>
Cc: Vishal Verma <vishal.l.verma@intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
drivers/acpi/acpi_memhotplug.c
include/linux/memory_hotplug.h
mm/memory_hotplug.c

index 24f662d8bd39a68ce27b9b5e9493f945ebc06b34..d0c1a71007d0a3054608bec8fddc8e86bdffb78b 100644 (file)
@@ -211,8 +211,7 @@ static int acpi_memory_enable_device(struct acpi_memory_device *mem_device)
                if (!info->length)
                        continue;
 
-               if (mhp_supports_memmap_on_memory(info->length))
-                       mhp_flags |= MHP_MEMMAP_ON_MEMORY;
+               mhp_flags |= MHP_MEMMAP_ON_MEMORY;
                result = __add_memory(mgid, info->start_addr, info->length,
                                      mhp_flags);
 
index 013c69753c9173b1aead87e40f363a773c1115a7..7d207658349416b0304722dfedf642f506d4c356 100644 (file)
@@ -97,6 +97,8 @@ typedef int __bitwise mhp_t;
  * To do so, we will use the beginning of the hot-added range to build
  * the page tables for the memmap array that describes the entire range.
  * Only selected architectures support it with SPARSE_VMEMMAP.
+ * This is only a hint, the core kernel can decide to not do this based on
+ * different alignment checks.
  */
 #define MHP_MEMMAP_ON_MEMORY   ((__force mhp_t)BIT(1))
 /*
@@ -354,7 +356,6 @@ extern struct zone *zone_for_pfn_range(int online_type, int nid,
 extern int arch_create_linear_mapping(int nid, u64 start, u64 size,
                                      struct mhp_params *params);
 void arch_remove_linear_mapping(u64 start, u64 size);
-extern bool mhp_supports_memmap_on_memory(unsigned long size);
 #endif /* CONFIG_MEMORY_HOTPLUG */
 
 #endif /* __LINUX_MEMORY_HOTPLUG_H */
index 7cfd13c91568a217c13164a956f0807524c7c36e..eca32ccd45ccdfee6ef4ceb275456f3aa114f398 100644 (file)
@@ -1247,7 +1247,7 @@ static int online_memory_block(struct memory_block *mem, void *arg)
        return device_online(&mem->dev);
 }
 
-bool mhp_supports_memmap_on_memory(unsigned long size)
+static bool mhp_supports_memmap_on_memory(unsigned long size)
 {
        unsigned long nr_vmemmap_pages = size / PAGE_SIZE;
        unsigned long vmemmap_size = nr_vmemmap_pages * sizeof(struct page);
@@ -1339,13 +1339,12 @@ int __ref add_memory_resource(int nid, struct resource *res, mhp_t mhp_flags)
         * Self hosted memmap array
         */
        if (mhp_flags & MHP_MEMMAP_ON_MEMORY) {
-               if (!mhp_supports_memmap_on_memory(size)) {
-                       ret = -EINVAL;
-                       goto error;
+               if (mhp_supports_memmap_on_memory(size)) {
+                       mhp_altmap.free = PHYS_PFN(size);
+                       mhp_altmap.base_pfn = PHYS_PFN(start);
+                       params.altmap = &mhp_altmap;
                }
-               mhp_altmap.free = PHYS_PFN(size);
-               mhp_altmap.base_pfn = PHYS_PFN(start);
-               params.altmap = &mhp_altmap;
+               /* fallback to not using altmap  */
        }
 
        /* call arch's memory hotadd */