Merge tag 'sunxi-fixes-for-5.12-2' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / mm / memremap.c
index 16b2fb4..7aa7d6e 100644 (file)
@@ -80,6 +80,21 @@ static unsigned long pfn_first(struct dev_pagemap *pgmap, int range_id)
        return pfn + vmem_altmap_offset(pgmap_altmap(pgmap));
 }
 
+bool pgmap_pfn_valid(struct dev_pagemap *pgmap, unsigned long pfn)
+{
+       int i;
+
+       for (i = 0; i < pgmap->nr_range; i++) {
+               struct range *range = &pgmap->ranges[i];
+
+               if (pfn >= PHYS_PFN(range->start) &&
+                   pfn <= PHYS_PFN(range->end))
+                       return pfn >= pfn_first(pgmap, i);
+       }
+
+       return false;
+}
+
 static unsigned long pfn_end(struct dev_pagemap *pgmap, int range_id)
 {
        const struct range *range = &pgmap->ranges[range_id];
@@ -185,6 +200,7 @@ static void dev_pagemap_percpu_release(struct percpu_ref *ref)
 static int pagemap_range(struct dev_pagemap *pgmap, struct mhp_params *params,
                int range_id, int nid)
 {
+       const bool is_private = pgmap->type == MEMORY_DEVICE_PRIVATE;
        struct range *range = &pgmap->ranges[range_id];
        struct dev_pagemap *conflict_pgmap;
        int error, is_ram;
@@ -230,6 +246,11 @@ static int pagemap_range(struct dev_pagemap *pgmap, struct mhp_params *params,
        if (error)
                goto err_pfn_remap;
 
+       if (!mhp_range_allowed(range->start, range_len(range), !is_private)) {
+               error = -EINVAL;
+               goto err_pfn_remap;
+       }
+
        mem_hotplug_begin();
 
        /*
@@ -243,7 +264,7 @@ static int pagemap_range(struct dev_pagemap *pgmap, struct mhp_params *params,
         * the CPU, we do want the linear mapping and thus use
         * arch_add_memory().
         */
-       if (pgmap->type == MEMORY_DEVICE_PRIVATE) {
+       if (is_private) {
                error = add_pages(nid, PHYS_PFN(range->start),
                                PHYS_PFN(range_len(range)), params);
        } else {