Messages in this thread | | | Date | Mon, 12 Feb 2018 17:11:09 +0300 | From | "Kirill A. Shutemov" <> | Subject | Re: [PATCH v3 2/2] mm/huge_memory.c: reorder operations in __split_huge_page_tail() |
| |
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@yandex-team.ru>
Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
-- Kirill A. Shutemov
| |