On Mon, Feb 12, 2018 at 04:58:53PM +0300, Konstantin Khlebnikov wrote: > THP split makes non-atomic change of tail page flags. This is almost ok > because tail pages are locked and isolated but this breaks recent changes > in page locking: non-atomic operation could clear bit PG_waiters. > > As a result concurrent sequence get_page_unless_zero() -> lock_page() > might block forever. Especially if this page was truncated later. > > Fix is trivial: clone flags before unfreezing page reference counter. > > This race exists since commit 62906027091f ("mm: add PageWaiters indicating > tasks are waiting for a page bit") while unsave unfreeze itself was added > in commit 8df651c7059e ("thp: cleanup split_huge_page()"). > > 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(). > > And replace page_ref_inc()/page_ref_add() with page_ref_unfreeze() which > is made especially for that and has semantic of smp_store_release(). > > Signed-off-by: Konstantin Khlebnikov <khlebnikov@xxxxxxxxxxxxxx> Acked-by: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> -- Kirill A. Shutemov -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>