lkml.org 
[lkml]   [2021]   [Dec]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 4/9] mm: avoid using set_page_count() when pages are freed into allocator
    Date
    When struct pages are first initialized the page->_refcount field is
    set 1. However, later when pages are freed into allocator we set
    _refcount to 0 via set_page_count(). Unconditionally resetting
    _refcount is dangerous.

    Instead use page_ref_dec_return(), and verify that the _refcount is
    what is expected.

    Signed-off-by: Pasha Tatashin <pasha.tatashin@soleen.com>
    ---
    mm/page_alloc.c | 11 ++++++++---
    1 file changed, 8 insertions(+), 3 deletions(-)

    diff --git a/mm/page_alloc.c b/mm/page_alloc.c
    index b5554767b9de..13d989d62012 100644
    --- a/mm/page_alloc.c
    +++ b/mm/page_alloc.c
    @@ -1667,6 +1667,7 @@ void __free_pages_core(struct page *page, unsigned int order)
    unsigned int nr_pages = 1 << order;
    struct page *p = page;
    unsigned int loop;
    + int refcnt;

    /*
    * When initializing the memmap, __init_single_page() sets the refcount
    @@ -1677,10 +1678,12 @@ void __free_pages_core(struct page *page, unsigned int order)
    for (loop = 0; loop < (nr_pages - 1); loop++, p++) {
    prefetchw(p + 1);
    __ClearPageReserved(p);
    - set_page_count(p, 0);
    + refcnt = page_ref_dec_return(p);
    + VM_BUG_ON_PAGE(refcnt, p);
    }
    __ClearPageReserved(p);
    - set_page_count(p, 0);
    + refcnt = page_ref_dec_return(p);
    + VM_BUG_ON_PAGE(refcnt, p);

    atomic_long_add(nr_pages, &page_zone(page)->managed_pages);

    @@ -2252,10 +2255,12 @@ void __init init_cma_reserved_pageblock(struct page *page)
    {
    unsigned i = pageblock_nr_pages;
    struct page *p = page;
    + int refcnt;

    do {
    __ClearPageReserved(p);
    - set_page_count(p, 0);
    + refcnt = page_ref_dec_return(p);
    + VM_BUG_ON_PAGE(refcnt, p);
    } while (++p, --i);

    set_pageblock_migratetype(page, MIGRATE_CMA);
    --
    2.34.1.307.g9b7440fafd-goog
    \
     
     \ /
      Last update: 2021-12-21 16:02    [W:2.281 / U:0.148 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site