On Fri, Feb 03, 2023 at 09:16:33PM +0800, Yin Fengwei wrote: > @@ -3378,45 +3425,18 @@ vm_fault_t filemap_map_pages(struct vm_fault *vmf, > addr = vma->vm_start + ((start_pgoff - vma->vm_pgoff) << PAGE_SHIFT); > vmf->pte = pte_offset_map_lock(vma->vm_mm, vmf->pmd, addr, &vmf->ptl); > do { > -again: > - page = folio_file_page(folio, xas.xa_index); > - if (PageHWPoison(page)) > - goto unlock; > - > - if (mmap_miss > 0) > - mmap_miss--; > + unsigned long end; > > addr += (xas.xa_index - last_pgoff) << PAGE_SHIFT; > vmf->pte += xas.xa_index - last_pgoff; > last_pgoff = xas.xa_index; > + end = folio->index + folio_nr_pages(folio) - 1; > + nr_pages = min(end, end_pgoff) - xas.xa_index + 1; > > - /* > - * NOTE: If there're PTE markers, we'll leave them to be > - * handled in the specific fault path, and it'll prohibit the > - * fault-around logic. > - */ > - if (!pte_none(*vmf->pte)) > - goto unlock; > - > - /* We're about to handle the fault */ > - if (vmf->address == addr) > - ret = VM_FAULT_NOPAGE; > + ret |= filemap_map_folio_range(vmf, folio, > + xas.xa_index - folio->index, addr, nr_pages); > + xas.xa_index = end; IIRC, end here can be beyond end_pgoff. Can it cause an issue? I don't see it, but just in case. -- Kiryl Shutsemau / Kirill A. Shutemov