|
@@ -150,7 +150,7 @@ void devm_memunmap(struct device *dev, void *addr)
|
|
|
}
|
|
|
EXPORT_SYMBOL(devm_memunmap);
|
|
|
|
|
|
-pfn_t phys_to_pfn_t(dma_addr_t addr, unsigned long flags)
|
|
|
+pfn_t phys_to_pfn_t(phys_addr_t addr, unsigned long flags)
|
|
|
{
|
|
|
return __pfn_to_pfn_t(addr >> PAGE_SHIFT, flags);
|
|
|
}
|
|
@@ -183,7 +183,11 @@ EXPORT_SYMBOL(put_zone_device_page);
|
|
|
|
|
|
static void pgmap_radix_release(struct resource *res)
|
|
|
{
|
|
|
- resource_size_t key;
|
|
|
+ resource_size_t key, align_start, align_size, align_end;
|
|
|
+
|
|
|
+ align_start = res->start & ~(SECTION_SIZE - 1);
|
|
|
+ align_size = ALIGN(resource_size(res), SECTION_SIZE);
|
|
|
+ align_end = align_start + align_size - 1;
|
|
|
|
|
|
mutex_lock(&pgmap_lock);
|
|
|
for (key = res->start; key <= res->end; key += SECTION_SIZE)
|
|
@@ -226,12 +230,11 @@ static void devm_memremap_pages_release(struct device *dev, void *data)
|
|
|
percpu_ref_put(pgmap->ref);
|
|
|
}
|
|
|
|
|
|
- pgmap_radix_release(res);
|
|
|
-
|
|
|
/* pages are dead and unused, undo the arch mapping */
|
|
|
align_start = res->start & ~(SECTION_SIZE - 1);
|
|
|
align_size = ALIGN(resource_size(res), SECTION_SIZE);
|
|
|
arch_remove_memory(align_start, align_size);
|
|
|
+ pgmap_radix_release(res);
|
|
|
dev_WARN_ONCE(dev, pgmap->altmap && pgmap->altmap->alloc,
|
|
|
"%s: failed to free all reserved pages\n", __func__);
|
|
|
}
|
|
@@ -267,7 +270,7 @@ void *devm_memremap_pages(struct device *dev, struct resource *res,
|
|
|
{
|
|
|
int is_ram = region_intersects(res->start, resource_size(res),
|
|
|
"System RAM");
|
|
|
- resource_size_t key, align_start, align_size;
|
|
|
+ resource_size_t key, align_start, align_size, align_end;
|
|
|
struct dev_pagemap *pgmap;
|
|
|
struct page_map *page_map;
|
|
|
unsigned long pfn;
|
|
@@ -309,7 +312,10 @@ void *devm_memremap_pages(struct device *dev, struct resource *res,
|
|
|
|
|
|
mutex_lock(&pgmap_lock);
|
|
|
error = 0;
|
|
|
- for (key = res->start; key <= res->end; key += SECTION_SIZE) {
|
|
|
+ align_start = res->start & ~(SECTION_SIZE - 1);
|
|
|
+ align_size = ALIGN(resource_size(res), SECTION_SIZE);
|
|
|
+ align_end = align_start + align_size - 1;
|
|
|
+ for (key = align_start; key <= align_end; key += SECTION_SIZE) {
|
|
|
struct dev_pagemap *dup;
|
|
|
|
|
|
rcu_read_lock();
|
|
@@ -336,8 +342,6 @@ void *devm_memremap_pages(struct device *dev, struct resource *res,
|
|
|
if (nid < 0)
|
|
|
nid = numa_mem_id();
|
|
|
|
|
|
- align_start = res->start & ~(SECTION_SIZE - 1);
|
|
|
- align_size = ALIGN(resource_size(res), SECTION_SIZE);
|
|
|
error = arch_add_memory(nid, align_start, align_size, true);
|
|
|
if (error)
|
|
|
goto err_add_memory;
|