|
@@ -247,6 +247,7 @@ static void devm_memremap_pages_release(struct device *dev, void *data)
|
|
align_start = res->start & ~(SECTION_SIZE - 1);
|
|
align_start = res->start & ~(SECTION_SIZE - 1);
|
|
align_size = ALIGN(resource_size(res), SECTION_SIZE);
|
|
align_size = ALIGN(resource_size(res), SECTION_SIZE);
|
|
arch_remove_memory(align_start, align_size);
|
|
arch_remove_memory(align_start, align_size);
|
|
|
|
+ untrack_pfn(NULL, PHYS_PFN(align_start), align_size);
|
|
pgmap_radix_release(res);
|
|
pgmap_radix_release(res);
|
|
dev_WARN_ONCE(dev, pgmap->altmap && pgmap->altmap->alloc,
|
|
dev_WARN_ONCE(dev, pgmap->altmap && pgmap->altmap->alloc,
|
|
"%s: failed to free all reserved pages\n", __func__);
|
|
"%s: failed to free all reserved pages\n", __func__);
|
|
@@ -282,6 +283,7 @@ void *devm_memremap_pages(struct device *dev, struct resource *res,
|
|
struct percpu_ref *ref, struct vmem_altmap *altmap)
|
|
struct percpu_ref *ref, struct vmem_altmap *altmap)
|
|
{
|
|
{
|
|
resource_size_t key, align_start, align_size, align_end;
|
|
resource_size_t key, align_start, align_size, align_end;
|
|
|
|
+ pgprot_t pgprot = PAGE_KERNEL;
|
|
struct dev_pagemap *pgmap;
|
|
struct dev_pagemap *pgmap;
|
|
struct page_map *page_map;
|
|
struct page_map *page_map;
|
|
int error, nid, is_ram;
|
|
int error, nid, is_ram;
|
|
@@ -351,6 +353,11 @@ void *devm_memremap_pages(struct device *dev, struct resource *res,
|
|
if (nid < 0)
|
|
if (nid < 0)
|
|
nid = numa_mem_id();
|
|
nid = numa_mem_id();
|
|
|
|
|
|
|
|
+ error = track_pfn_remap(NULL, &pgprot, PHYS_PFN(align_start), 0,
|
|
|
|
+ align_size);
|
|
|
|
+ if (error)
|
|
|
|
+ goto err_pfn_remap;
|
|
|
|
+
|
|
error = arch_add_memory(nid, align_start, align_size, true);
|
|
error = arch_add_memory(nid, align_start, align_size, true);
|
|
if (error)
|
|
if (error)
|
|
goto err_add_memory;
|
|
goto err_add_memory;
|
|
@@ -371,6 +378,8 @@ void *devm_memremap_pages(struct device *dev, struct resource *res,
|
|
return __va(res->start);
|
|
return __va(res->start);
|
|
|
|
|
|
err_add_memory:
|
|
err_add_memory:
|
|
|
|
+ untrack_pfn(NULL, PHYS_PFN(align_start), align_size);
|
|
|
|
+ err_pfn_remap:
|
|
err_radix:
|
|
err_radix:
|
|
pgmap_radix_release(res);
|
|
pgmap_radix_release(res);
|
|
devres_free(page_map);
|
|
devres_free(page_map);
|