Message ID | 1506413721-25306-1-git-send-email-clombard@linux.vnet.ibm.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 4fc0870d7e462fe3b86e0f938ae75ce884728c7d |
Headers | show |
Series | [V3] cxl: Fix memory page not handled | expand |
On Tue, 2017-09-26 at 08:15:21 UTC, Christophe Lombard wrote: > The in-kernel 'library' API can be called by drivers to help > interaction with an IBM XSL on a POWER9 system. > > The cxllib_handle_fault() API is used to handle memory fault. All memory > pages of the specified buffer have to be handled but under certain > conditions,the last page may not be touched, and the address the > adapter is trying to access is never sent to the kernel for resolution. > > This patch reworks start address of the loop with an address aligned on > the page size. In this context, the last page is not missed. > > Signed-off-by: Christophe Lombard <clombard@linux.vnet.ibm.com> > Acked-by: Frederic Barrat <fbarrat@linux.vnet.ibm.com> > Acked-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com> Applied to powerpc fixes, thanks. https://git.kernel.org/powerpc/c/4fc0870d7e462fe3b86e0f938ae75c cheers
diff --git a/drivers/misc/cxl/cxllib.c b/drivers/misc/cxl/cxllib.c index 5dba23c..dc9bc18 100644 --- a/drivers/misc/cxl/cxllib.c +++ b/drivers/misc/cxl/cxllib.c @@ -219,8 +219,17 @@ int cxllib_handle_fault(struct mm_struct *mm, u64 addr, u64 size, u64 flags) down_read(&mm->mmap_sem); - for (dar = addr; dar < addr + size; dar += page_size) { - if (!vma || dar < vma->vm_start || dar > vma->vm_end) { + vma = find_vma(mm, addr); + if (!vma) { + pr_err("Can't find vma for addr %016llx\n", addr); + rc = -EFAULT; + goto out; + } + /* get the size of the pages allocated */ + page_size = vma_kernel_pagesize(vma); + + for (dar = (addr & ~(page_size - 1)); dar < (addr + size); dar += page_size) { + if (dar < vma->vm_start || dar >= vma->vm_end) { vma = find_vma(mm, addr); if (!vma) { pr_err("Can't find vma for addr %016llx\n", addr);