pmem: Allocate physical memory from reserved fmem
If a heap is marked as reusuable (i.e. memory is to be gotten from
fmem) the base used from allocation should not come from
allocate_contiguous_memory but from fmem_get_info instead. Otherwise,
the memory allocated isn't actually coming from fmem.
Change-Id: If9737c93df3bd34e9cac9585a4dbbc8993562c5f
Signed-off-by: Laura Abbott <lauraa@codeaurora.org>
diff --git a/drivers/misc/pmem.c b/drivers/misc/pmem.c
index f0d523e..2f48d71 100644
--- a/drivers/misc/pmem.c
+++ b/drivers/misc/pmem.c
@@ -2785,7 +2785,8 @@
pmem[id].dev.name = pdata->name;
pmem[id].dev.minor = id;
pmem[id].dev.fops = &pmem_fops;
- pr_info("pmem: Initializing %s (user-space) as %s\n",
+ pmem[id].reusable = pdata->reusable;
+ pr_info("pmem: Initializing %s as %s\n",
pdata->name, pdata->cached ? "cached" : "non-cached");
if (misc_register(&pmem[id].dev)) {
@@ -2793,24 +2794,23 @@
goto err_cant_register_device;
}
- pmem[id].base = allocate_contiguous_memory_nomap(pmem[id].size,
- pmem[id].memory_type, PAGE_SIZE);
- if (!pmem[id].base) {
- pr_err("pmem: Cannot allocate from reserved memory for %s\n",
- pdata->name);
- goto err_misc_deregister;
+ if (!pmem[id].reusable) {
+ pmem[id].base = allocate_contiguous_memory_nomap(pmem[id].size,
+ pmem[id].memory_type, PAGE_SIZE);
+ if (!pmem[id].base) {
+ pr_err("pmem: Cannot allocate from reserved memory for %s\n",
+ pdata->name);
+ goto err_misc_deregister;
+ }
}
- pr_info("allocating %lu bytes at %p (%lx physical) for %s\n",
- pmem[id].size, pmem[id].vbase, pmem[id].base, pmem[id].name);
-
- pmem[id].reusable = pdata->reusable;
/* reusable pmem requires map on demand */
pmem[id].map_on_demand = pdata->map_on_demand || pdata->reusable;
if (pmem[id].map_on_demand) {
if (pmem[id].reusable) {
const struct fmem_data *fmem_info = fmem_get_info();
pmem[id].area = fmem_info->area;
+ pmem[id].base = fmem_info->phys;
} else {
pmem_vma = get_vm_area(pmem[id].size, VM_IOREMAP);
if (!pmem_vma) {
@@ -2844,12 +2844,17 @@
if (pdata->release_region)
pmem[id].mem_release = pdata->release_region;
+ pr_info("allocating %lu bytes at %lx physical for %s\n",
+ pmem[id].size, pmem[id].base, pmem[id].name);
+
return 0;
cleanup_vm:
- remove_vm_area(pmem_vma);
+ if (!pmem[id].reusable)
+ remove_vm_area(pmem_vma);
err_free:
- free_contiguous_memory_by_paddr(pmem[id].base);
+ if (!pmem[id].reusable)
+ free_contiguous_memory_by_paddr(pmem[id].base);
err_misc_deregister:
misc_deregister(&pmem[id].dev);
err_cant_register_device: