Re: [RFC PATCH v2 3/3] mm: mlock: update mlock_pte_range to handle large folio

From: Yu Zhao
Date: Mon Jul 17 2023 - 23:59:54 EST


On Mon, Jul 17, 2023 at 8:07 PM Yin Fengwei <fengwei.yin@xxxxxxxxx> wrote:
>
> On 7/17/23 16:12, Yin Fengwei wrote:
> >
> > On 7/17/23 08:35, Yu Zhao wrote:
> >> On Sun, Jul 16, 2023 at 6:00 PM Yin, Fengwei <fengwei.yin@xxxxxxxxx> wrote:
> >>>
> >>> On 7/15/2023 2:06 PM, Yu Zhao wrote:
> >>>> There is a problem here that I didn't have the time to elaborate: we
> >>>> can't mlock() a folio that is within the range but not fully mapped
> >>>> because this folio can be on the deferred split queue. When the split
> >>>> happens, those unmapped folios (not mapped by this vma but are mapped
> >>>> into other vmas) will be stranded on the unevictable lru.
> >>>
> >>> This should be fine unless I missed something. During large folio split,
> >>> the unmap_folio() will be migrate(anon)/unmap(file) folio. Folio will be
> >>> munlocked in unmap_folio(). So the head/tail pages will be evictable always.
> >>
> >> It's close but not entirely accurate: munlock can fail on isolated folios.
> >
> > I suppose normal 4K page can hit this problem also and following patch could
> > fix it:
> No. This patch is not necessary as unevictable folio will not be picked up by
> page reclaim. It's not possible to munlock the isolated folio from lru list.
>
> The possible cases I am ware are: page_migrate, madvise and damon_pa_pageout and
> lru_gen_look_around. The first three already handle this case correctly by call
> folio_putback_lru().
>
> If folio is isolated, the split_folio() will just fail. So looks we are fine
> for this corner case. Let me know if I miss something here.

The race is between isolation and munlock -- split_folio() only fails
if a folio is still isolated when it tries to freeze its refcnt, e.g.,
cpu 1 cpu 2
split_folio()
isolation unmap_folio()
putback
freeze refcnt