diff options
author | Sam Nelson <sam.nelson@ti.com> | 2018-02-15 17:07:06 -0500 |
---|---|---|
committer | Sam Nelson <sam.nelson@ti.com> | 2018-02-15 17:07:06 -0500 |
commit | 855db2705db6487ff3d905c367dab682cb22c5c2 (patch) | |
tree | 9a1481319ea070528452ee92e1243c6aa32e5f23 | |
parent | b2f932fad4fbc63b047a7920863626ad2a93ebc8 (diff) | |
download | linuxutils-855db2705db6487ff3d905c367dab682cb22c5c2.tar.gz |
cmemk: Update handling of get_phys
Fixes one issue related to falling through for direct mapped memory.
Signed-off-by: Sam Nelson <sam.nelson@ti.com>
-rw-r--r-- | src/cmem/module/cmemk.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/src/cmem/module/cmemk.c b/src/cmem/module/cmemk.c index e1efbff..53444a7 100644 --- a/src/cmem/module/cmemk.c +++ b/src/cmem/module/cmemk.c @@ -631,26 +631,28 @@ static phys_addr_t get_phys(void *virtp) physp = virt_to_phys(virtp); __D("get_phys: virt_to_phys translated direct-mapped %#lx to %#llx\n", virt, (unsigned long long)physp); + return(physp); } + down_read(¤t->mm->mmap_sem); vma = find_vma(mm, virt); - up_read(¤t->mm->mmap_sem); /* this will catch, kernel-allocated, mmaped-to-usermode addresses */ if (vma && (vma->vm_flags & VM_IO) && (vma->vm_pgoff)) { - physp = ((unsigned long long)vma->vm_pgoff << PAGE_SHIFT) + + physp = (((unsigned long long)vma->vm_pgoff) << PAGE_SHIFT) + (virt - vma->vm_start); + up_read(¤t->mm->mmap_sem); __D("get_phys: find_vma translated user %#lx to %#llx\n", virt, (unsigned long long)physp); + return(physp); } /* otherwise, use get_user_pages() for general userland pages */ - else { + { int res, nr_pages = 1; struct page *pages; - down_read(¤t->mm->mmap_sem); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0)) res = get_user_pages_remote(current, current->mm, virt, nr_pages, FOLL_WRITE, &pages, NULL, NULL); @@ -1685,8 +1687,7 @@ alloc: __D("FREE%s: translated 0x%p user virtual to %#llx physical\n", cmd & CMEM_HEAP ? "HEAP" : "", virtp, (unsigned long long)physp); - } - else { + } else { virtp = 0L; /* silence the compiler warning */ if (copy_from_user(&physArg, llargp, sizeof(unsigned long long))) { |