lkml.org 
[lkml]   [2020]   [Apr]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 16/25] mm: Make prep_transhuge_page return its argument
    Date
    From: "Matthew Wilcox (Oracle)" <willy@infradead.org>

    By permitting NULL or order-0 pages as an argument, and returning the
    argument, callers can write:

    return prep_transhuge_page(alloc_pages(...));

    instead of assigning the result to a temporary variable and conditionally
    passing that to prep_transhuge_page().

    Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
    Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    ---
    include/linux/huge_mm.h | 7 +++++--
    mm/huge_memory.c | 9 +++++++--
    2 files changed, 12 insertions(+), 4 deletions(-)

    diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h
    index 1f6245091917..6a8502278f41 100644
    --- a/include/linux/huge_mm.h
    +++ b/include/linux/huge_mm.h
    @@ -193,7 +193,7 @@ extern unsigned long thp_get_unmapped_area(struct file *filp,
    unsigned long addr, unsigned long len, unsigned long pgoff,
    unsigned long flags);

    -extern void prep_transhuge_page(struct page *page);
    +extern struct page *prep_transhuge_page(struct page *page);
    extern void free_transhuge_page(struct page *page);
    bool is_transparent_hugepage(struct page *page);

    @@ -358,7 +358,10 @@ static inline bool transhuge_vma_suitable(struct vm_area_struct *vma,
    return false;
    }

    -static inline void prep_transhuge_page(struct page *page) {}
    +static inline struct page *prep_transhuge_page(struct page *page)
    +{
    + return page;
    +}

    static inline bool is_transparent_hugepage(struct page *page)
    {
    diff --git a/mm/huge_memory.c b/mm/huge_memory.c
    index 6ecd1045113b..7a5e2b470bc7 100644
    --- a/mm/huge_memory.c
    +++ b/mm/huge_memory.c
    @@ -508,15 +508,20 @@ static inline struct deferred_split *get_deferred_split_queue(struct page *page)
    }
    #endif

    -void prep_transhuge_page(struct page *page)
    +struct page *prep_transhuge_page(struct page *page)
    {
    + if (!page || compound_order(page) == 0)
    + return page;
    /*
    - * we use page->mapping and page->indexlru in second tail page
    + * we use page->mapping and page->index in second tail page
    * as list_head: assuming THP order >= 2
    */
    + BUG_ON(compound_order(page) == 1);

    INIT_LIST_HEAD(page_deferred_list(page));
    set_compound_page_dtor(page, TRANSHUGE_PAGE_DTOR);
    +
    + return page;
    }

    bool is_transparent_hugepage(struct page *page)
    --
    2.26.2
    \
     
     \ /
      Last update: 2020-04-29 15:42    [W:5.898 / U:0.544 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site