From 6a2af737e9c15eac7fedae0c4430e7055b0ce477 Mon Sep 17 00:00:00 2001 From: Zhen Chen Date: Thu, 15 Jul 2021 14:37:02 +0800 Subject: [PATCH] Mali: midgard: Fix a runtime WARNING as below [ 4.128429] WARNING: CPU: 0 PID: 247 at drivers/gpu/arm/midgard/mali_kbase_mem_linux.c:1772 kbase_mmap+0x380/0xa78 ... Treat VM_FAULT_NOPAGE as success of calling vmf_insert_pfn(). Take https://android.googlesource.com/kernel/hikey-modules/+/refs/heads/android12-5.10/midgard/mali_kbase_mem_linux.c as a reference. Fixes: 970017f88ef7 ("MALI: midgard: Fix all compile errors under kernel 5.10") Change-Id: Ie0562d8024e58031ba8126aab42dc7005f08b071 Signed-off-by: Zhen Chen --- drivers/gpu/arm/midgard/mali_kbase_mem_linux.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/arm/midgard/mali_kbase_mem_linux.c b/drivers/gpu/arm/midgard/mali_kbase_mem_linux.c index e133c43bebb0..e20315e67242 100644 --- a/drivers/gpu/arm/midgard/mali_kbase_mem_linux.c +++ b/drivers/gpu/arm/midgard/mali_kbase_mem_linux.c @@ -1662,6 +1662,7 @@ static vm_fault_t kbase_cpu_vm_fault(struct vm_fault *vmf) pgoff_t rel_pgoff; size_t i; pgoff_t addr; + vm_fault_t ret = VM_FAULT_SIGBUS; KBASE_DEBUG_ASSERT(map); KBASE_DEBUG_ASSERT(map->count > 0); @@ -1686,9 +1687,9 @@ static vm_fault_t kbase_cpu_vm_fault(struct vm_fault *vmf) addr = (pgoff_t)(vmf->address >> PAGE_SHIFT); #endif while (i < map->alloc->nents && (addr < vma->vm_end >> PAGE_SHIFT)) { - int ret = vmf_insert_pfn(vma, addr << PAGE_SHIFT, + ret = vmf_insert_pfn(vma, addr << PAGE_SHIFT, PFN_DOWN(map->alloc->pages[i])); - if (ret < 0 && ret != -EBUSY) + if (ret != VM_FAULT_NOPAGE) goto locked_bad_fault; i++; addr++; @@ -1700,7 +1701,7 @@ static vm_fault_t kbase_cpu_vm_fault(struct vm_fault *vmf) locked_bad_fault: kbase_gpu_vm_unlock(map->kctx); - return VM_FAULT_SIGBUS; + return ret; } const struct vm_operations_struct kbase_vm_ops = { @@ -1767,10 +1768,16 @@ static int kbase_cpu_mmap(struct kbase_va_region *reg, struct vm_area_struct *vm vma->vm_flags |= VM_PFNMAP; for (i = 0; i < nr_pages; i++) { unsigned long pfn = PFN_DOWN(page_array[i + start_off]); + vm_fault_t ret; - err = vmf_insert_pfn(vma, addr, pfn); - if (WARN_ON(err)) + ret = vmf_insert_pfn(vma, addr, pfn); + if (WARN_ON(ret != VM_FAULT_NOPAGE)) { + if (ret == VM_FAULT_OOM) + err = -ENOMEM; + else + err = -EFAULT; break; + } addr += PAGE_SIZE; }