lkml.org 
[lkml]   [2021]   [Jun]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 074/101] mm, thp: use head page in __migration_entry_wait()
    Date
    From: Xu Yu <xuyu@linux.alibaba.com>

    commit ffc90cbb2970ab88b66ea51dd580469eede57b67 upstream.

    We notice that hung task happens in a corner but practical scenario when
    CONFIG_PREEMPT_NONE is enabled, as follows.

    Process 0 Process 1 Process 2..Inf
    split_huge_page_to_list
    unmap_page
    split_huge_pmd_address
    __migration_entry_wait(head)
    __migration_entry_wait(tail)
    remap_page (roll back)
    remove_migration_ptes
    rmap_walk_anon
    cond_resched

    Where __migration_entry_wait(tail) is occurred in kernel space, e.g.,
    copy_to_user in fstat, which will immediately fault again without
    rescheduling, and thus occupy the cpu fully.

    When there are too many processes performing __migration_entry_wait on
    tail page, remap_page will never be done after cond_resched.

    This makes __migration_entry_wait operate on the compound head page,
    thus waits for remap_page to complete, whether the THP is split
    successfully or roll back.

    Note that put_and_wait_on_page_locked helps to drop the page reference
    acquired with get_page_unless_zero, as soon as the page is on the wait
    queue, before actually waiting. So splitting the THP is only prevented
    for a brief interval.

    Link: https://lkml.kernel.org/r/b9836c1dd522e903891760af9f0c86a2cce987eb.1623144009.git.xuyu@linux.alibaba.com
    Fixes: ba98828088ad ("thp: add option to setup migration entries during PMD split")
    Suggested-by: Hugh Dickins <hughd@google.com>
    Signed-off-by: Gang Deng <gavin.dg@linux.alibaba.com>
    Signed-off-by: Xu Yu <xuyu@linux.alibaba.com>
    Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Acked-by: Hugh Dickins <hughd@google.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    mm/migrate.c | 1 +
    1 file changed, 1 insertion(+)

    diff --git a/mm/migrate.c b/mm/migrate.c
    index 7982256a5125..278e6f3fa62c 100644
    --- a/mm/migrate.c
    +++ b/mm/migrate.c
    @@ -326,6 +326,7 @@ void __migration_entry_wait(struct mm_struct *mm, pte_t *ptep,
    goto out;

    page = migration_entry_to_page(entry);
    + page = compound_head(page);

    /*
    * Once page cache replacement of page migration started, page_count
    --
    2.30.2
    \
     
     \ /
      Last update: 2021-06-28 16:39    [W:8.128 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site