Re: [PATCHi v2] mm: put_and_wait_on_page_locked() while page is migrated
From: Hugh Dickins
Date: Thu Jan 10 2019 - 21:08:58 EST
On Thu, 10 Jan 2019, Vlastimil Babka wrote:
>
> For the record, anyone backporting this to older kernels should make
> sure to also include 605ca5ede764 ("mm/huge_memory.c: reorder operations
> in __split_huge_page_tail()") or they are in for a lot of fun, like me.
Thanks a lot for alerting us all to this, Vlastimil. Yes, I consider
Konstantin's 605ca5ede764 a must-have, and so had it already in all
the trees on which I was testing put_and_wait_on_page_locked(),
without being aware of the critical role it was playing.
But you do enjoy fun, don't you? So I shouldn't apologize :)
>
> Long story [1] short, Konstantin was correct in 605ca5ede764 changelog,
> although it wasn't the main known issue he was fixing:
>
> clear_compound_head() also must be called before unfreezing page
> reference because after successful get_page_unless_zero() might follow
> put_page() which needs correct compound_head().
>
> Which is exactly what happens in __migration_entry_wait():
>
> if (!get_page_unless_zero(page))
> goto out;
> pte_unmap_unlock(ptep, ptl);
> put_and_wait_on_page_locked(page); -> does put_page(page)
>
> while waiting on the THP split (which inserts those migration entries)
> to finish. Before put_and_wait_on_page_locked() it would wait first, and
> only then do put_page() on a page that's no longer tail page, so it
> would work out despite the dangerous get_page_unless_zero() on a tail
> page. Now it doesn't :)
It took me a while to follow there, but yes, agreed.
>
> Now if only 605ca5ede764 had a CC:stable and a Fixes: tag... Machine
> Learning won this round though, because 605ca5ede764 was added to 4.14
> stable by Sasha...
I'm proud to have passed the Turing test in reverse, but actually
that was me, not ML. My 173d9d9fd3dd ("mm/huge_memory: splitting set
mapping+index before unfreeze") in 4.20 built upon Konstantin's, so I
included his as a precursor when sending the stable guys pre-XArray
backports. So Konstantin's is even in 4.9 stable now.
Hugh