Message ID | 20200324011457.2817-10-jgg@ziepe.ca (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2,hmm,1/9] mm/hmm: remove pgmap checking for devmap pages | expand |
On Mon, Mar 23, 2020 at 10:14:57PM -0300, Jason Gunthorpe wrote: > From: Jason Gunthorpe <jgg@mellanox.com> > > The pagewalker does not call most ops with NULL vma, those are all routed > to pte_hole instead. Does ->pte_hole > > Thus hmm_vma_fault() is only called with a NULL vma from > hmm_vma_walk_hole(), so hoist the check to there. > > Now it is clear that snapshotting with no vma is a HMM_PFN_ERROR as > without a vma we have no path to call hmm_vma_fault(). > > Signed-off-by: Jason Gunthorpe <jgg@mellanox.com> Looks good, Reviewed-by: Christoph Hellwig <hch@lst.de>
diff --git a/mm/hmm.c b/mm/hmm.c index 14c33e1225866c..df0574061b37d3 100644 --- a/mm/hmm.c +++ b/mm/hmm.c @@ -83,9 +83,6 @@ static int hmm_vma_fault(unsigned long addr, unsigned long end, WARN_ON_ONCE(!required_fault); hmm_vma_walk->last = addr; - if (!vma) - return -EFAULT; - if ((required_fault & HMM_NEED_WRITE_FAULT) == HMM_NEED_WRITE_FAULT) { if (!(vma->vm_flags & VM_WRITE)) return -EPERM; @@ -175,6 +172,11 @@ static int hmm_vma_walk_hole(unsigned long addr, unsigned long end, npages = (end - addr) >> PAGE_SHIFT; pfns = &range->pfns[i]; required_fault = hmm_range_need_fault(hmm_vma_walk, pfns, npages, 0); + if (!walk->vma) { + if (required_fault) + return -EFAULT; + return hmm_pfns_fill(addr, end, range, HMM_PFN_ERROR); + } if (required_fault) return hmm_vma_fault(addr, end, required_fault, walk); hmm_vma_walk->last = addr;