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 8/9] mm: do not use atomic_set_release in page_ref_unfreeze()
    Date
    In we set the old _refcount value after verifying that the old value was
    indeed 0.

    VM_BUG_ON_PAGE(page_count(page) != 0, page);
    < the _refcount may change here>
    atomic_set_release(&page->_refcount, count);

    To avoid the smal gap where _refcount may change lets verify the time
    of the _refcount at the time of the set operation.

    Use atomic_xchg_release() and at the set time verify that the value
    was 0.

    Signed-off-by: Pasha Tatashin <pasha.tatashin@soleen.com>
    ---
    include/linux/page_ref.h | 5 ++---
    1 file changed, 2 insertions(+), 3 deletions(-)

    diff --git a/include/linux/page_ref.h b/include/linux/page_ref.h
    index 243fc60ae6c8..9efabeff4e06 100644
    --- a/include/linux/page_ref.h
    +++ b/include/linux/page_ref.h
    @@ -322,10 +322,9 @@ static inline int folio_ref_freeze(struct folio *folio, int count)

    static inline void page_ref_unfreeze(struct page *page, int count)
    {
    - VM_BUG_ON_PAGE(page_count(page) != 0, page);
    - VM_BUG_ON(count == 0);
    + int old_val = atomic_xchg_release(&page->_refcount, count);

    - atomic_set_release(&page->_refcount, count);
    + VM_BUG_ON_PAGE(count == 0 || old_val != 0, page);
    if (page_ref_tracepoint_active(page_ref_unfreeze))
    __page_ref_unfreeze(page, count);
    }
    --
    2.34.1.307.g9b7440fafd-goog
    \
     
     \ /
      Last update: 2021-12-21 16:02    [W:4.338 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site