lkml.org 
[lkml]   [2020]   [Oct]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v20 05/20] mm/thp: Simplify lru_add_page_tail()
    Date
    Simplify lru_add_page_tail(), there are actually only two cases possible:
    split_huge_page_to_list(), with list supplied and head isolated from lru
    by its caller; or split_huge_page(), with NULL list and head on lru -
    because when head is racily isolated from lru, the isolator's reference
    will stop the split from getting any further than its page_ref_freeze().

    So decide between the two cases by "list", but add VM_WARN_ON()s to
    verify that they match our lru expectations.

    [Hugh Dickins: rewrite commit log]
    Signed-off-by: Alex Shi <alex.shi@linux.alibaba.com>
    Reviewed-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Acked-by: Hugh Dickins <hughd@google.com>
    Cc: Kirill A. Shutemov <kirill@shutemov.name>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Mika Penttilä <mika.penttila@nextfour.com>
    Cc: linux-mm@kvack.org
    Cc: linux-kernel@vger.kernel.org
    ---
    mm/huge_memory.c | 21 ++++++---------------
    1 file changed, 6 insertions(+), 15 deletions(-)

    diff --git a/mm/huge_memory.c b/mm/huge_memory.c
    index 93c0b73eb8c6..4b72dd7b8b34 100644
    --- a/mm/huge_memory.c
    +++ b/mm/huge_memory.c
    @@ -2354,25 +2354,16 @@ static void lru_add_page_tail(struct page *head, struct page *page_tail,
    VM_BUG_ON_PAGE(PageLRU(page_tail), head);
    lockdep_assert_held(&lruvec_pgdat(lruvec)->lru_lock);

    - if (!list)
    - SetPageLRU(page_tail);
    -
    - if (likely(PageLRU(head)))
    - list_add_tail(&page_tail->lru, &head->lru);
    - else if (list) {
    + if (list) {
    /* page reclaim is reclaiming a huge page */
    + VM_WARN_ON(PageLRU(head));
    get_page(page_tail);
    list_add_tail(&page_tail->lru, list);
    } else {
    - /*
    - * Head page has not yet been counted, as an hpage,
    - * so we must account for each subpage individually.
    - *
    - * Put page_tail on the list at the correct position
    - * so they all end up in order.
    - */
    - add_page_to_lru_list_tail(page_tail, lruvec,
    - page_lru(page_tail));
    + /* head is still on lru (and we have it frozen) */
    + VM_WARN_ON(!PageLRU(head));
    + SetPageLRU(page_tail);
    + list_add_tail(&page_tail->lru, &head->lru);
    }
    }

    --
    1.8.3.1
    \
     
     \ /
      Last update: 2020-10-29 11:47    [W:4.020 / U:1.220 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site