On Wed, Mar 11, 2020 at 03:35:00PM -0300, Jason Gunthorpe wrote: > @@ -694,6 +672,15 @@ long hmm_range_fault(struct hmm_range *range, unsigned int flags) > return -EBUSY; > ret = walk_page_range(mm, hmm_vma_walk.last, range->end, > &hmm_walk_ops, &hmm_vma_walk); > + /* > + * A pgmap is kept cached in the hmm_vma_walk to avoid expensive > + * searching in the probably common case that the pgmap is the > + * same for the entire requested range. > + */ > + if (hmm_vma_walk.pgmap) { > + put_dev_pagemap(hmm_vma_walk.pgmap); > + hmm_vma_walk.pgmap = NULL; > + } > } while (ret == -EBUSY); In which case it should only be put on return, and not for every loop. I still think the right fix is to just delete all the unused and broken pgmap handling code. If we ever need to add it back it can be added in a proper understood and tested way.