lkml.org 
[lkml]   [2021]   [Jul]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v13 032/137] mm: Add folio_mapped()
    Date
    This function is the equivalent of page_mapped().  It is slightly
    shorter as we do not need to handle the PageTail() case. Reimplement
    page_mapped() as a wrapper around folio_mapped(). folio_mapped()
    is 13 bytes smaller than page_mapped(), but the page_mapped() wrapper
    is 30 bytes, for a net increase of 17 bytes of text.

    Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
    Acked-by: Vlastimil Babka <vbabka@suse.cz>
    Reviewed-by: William Kucharski <william.kucharski@oracle.com>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: David Howells <dhowells@redhat.com>
    Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    ---
    include/linux/mm.h | 1 +
    include/linux/mm_types.h | 6 ++++++
    mm/folio-compat.c | 6 ++++++
    mm/util.c | 29 ++++++++++++++++-------------
    4 files changed, 29 insertions(+), 13 deletions(-)

    diff --git a/include/linux/mm.h b/include/linux/mm.h
    index 24311e4c08e9..a856c078e040 100644
    --- a/include/linux/mm.h
    +++ b/include/linux/mm.h
    @@ -1766,6 +1766,7 @@ static inline pgoff_t page_index(struct page *page)
    }

    bool page_mapped(struct page *page);
    +bool folio_mapped(struct folio *folio);

    /*
    * Return true only if the page has been allocated with
    diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
    index c15b4af8ef4d..d0061ddf080f 100644
    --- a/include/linux/mm_types.h
    +++ b/include/linux/mm_types.h
    @@ -291,6 +291,12 @@ FOLIO_MATCH(memcg_data, memcg_data);
    #endif
    #undef FOLIO_MATCH

    +static inline atomic_t *folio_mapcount_ptr(struct folio *folio)
    +{
    + struct page *tail = &folio->page + 1;
    + return &tail->compound_mapcount;
    +}
    +
    static inline atomic_t *compound_mapcount_ptr(struct page *page)
    {
    return &page[1].compound_mapcount;
    diff --git a/mm/folio-compat.c b/mm/folio-compat.c
    index 3c83f03b80d7..7044fcc8a8aa 100644
    --- a/mm/folio-compat.c
    +++ b/mm/folio-compat.c
    @@ -35,3 +35,9 @@ void wait_for_stable_page(struct page *page)
    return folio_wait_stable(page_folio(page));
    }
    EXPORT_SYMBOL_GPL(wait_for_stable_page);
    +
    +bool page_mapped(struct page *page)
    +{
    + return folio_mapped(page_folio(page));
    +}
    +EXPORT_SYMBOL(page_mapped);
    diff --git a/mm/util.c b/mm/util.c
    index d6176bb63629..0c65b260cded 100644
    --- a/mm/util.c
    +++ b/mm/util.c
    @@ -652,28 +652,31 @@ void *page_rmapping(struct page *page)
    return __page_rmapping(page);
    }

    -/*
    - * Return true if this page is mapped into pagetables.
    - * For compound page it returns true if any subpage of compound page is mapped.
    +/**
    + * folio_mapped - Is this folio mapped into userspace?
    + * @folio: The folio.
    + *
    + * Return: True if any page in this folio is referenced by user page tables.
    */
    -bool page_mapped(struct page *page)
    +bool folio_mapped(struct folio *folio)
    {
    - int i;
    + int i, nr;

    - if (likely(!PageCompound(page)))
    - return atomic_read(&page->_mapcount) >= 0;
    - page = compound_head(page);
    - if (atomic_read(compound_mapcount_ptr(page)) >= 0)
    + if (folio_single(folio))
    + return atomic_read(&folio->_mapcount) >= 0;
    + if (atomic_read(folio_mapcount_ptr(folio)) >= 0)
    return true;
    - if (PageHuge(page))
    + if (folio_hugetlb(folio))
    return false;
    - for (i = 0; i < compound_nr(page); i++) {
    - if (atomic_read(&page[i]._mapcount) >= 0)
    +
    + nr = folio_nr_pages(folio);
    + for (i = 0; i < nr; i++) {
    + if (atomic_read(&folio_page(folio, i)->_mapcount) >= 0)
    return true;
    }
    return false;
    }
    -EXPORT_SYMBOL(page_mapped);
    +EXPORT_SYMBOL(folio_mapped);

    struct anon_vma *page_anon_vma(struct page *page)
    {
    --
    2.30.2
    \
     
     \ /
      Last update: 2021-07-12 05:26    [W:4.158 / U:0.164 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site