lkml.org 
[lkml]   [2021]   [Jul]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v13 122/137] mm/filemap: Use a folio in filemap_map_pages
    Date
    Saves 61 bytes due to fewer calls to compound_head().

    Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
    ---
    mm/filemap.c | 27 ++++++++++++++-------------
    1 file changed, 14 insertions(+), 13 deletions(-)

    diff --git a/mm/filemap.c b/mm/filemap.c
    index 37fb333d56ce..82f985f61224 100644
    --- a/mm/filemap.c
    +++ b/mm/filemap.c
    @@ -3105,7 +3105,7 @@ static bool filemap_map_pmd(struct vm_fault *vmf, struct page *page)
    return false;
    }

    -static struct page *next_uptodate_page(struct folio *folio,
    +static struct folio *next_uptodate_page(struct folio *folio,
    struct address_space *mapping,
    struct xa_state *xas, pgoff_t end_pgoff)
    {
    @@ -3136,7 +3136,7 @@ static struct page *next_uptodate_page(struct folio *folio,
    max_idx = DIV_ROUND_UP(i_size_read(mapping->host), PAGE_SIZE);
    if (xas->xa_index >= max_idx)
    goto unlock;
    - return &folio->page;
    + return folio;
    unlock:
    folio_unlock(folio);
    skip:
    @@ -3146,7 +3146,7 @@ static struct page *next_uptodate_page(struct folio *folio,
    return NULL;
    }

    -static inline struct page *first_map_page(struct address_space *mapping,
    +static inline struct folio *first_map_page(struct address_space *mapping,
    struct xa_state *xas,
    pgoff_t end_pgoff)
    {
    @@ -3154,7 +3154,7 @@ static inline struct page *first_map_page(struct address_space *mapping,
    mapping, xas, end_pgoff);
    }

    -static inline struct page *next_map_page(struct address_space *mapping,
    +static inline struct folio *next_map_page(struct address_space *mapping,
    struct xa_state *xas,
    pgoff_t end_pgoff)
    {
    @@ -3171,16 +3171,17 @@ vm_fault_t filemap_map_pages(struct vm_fault *vmf,
    pgoff_t last_pgoff = start_pgoff;
    unsigned long addr;
    XA_STATE(xas, &mapping->i_pages, start_pgoff);
    - struct page *head, *page;
    + struct folio *folio;
    + struct page *page;
    unsigned int mmap_miss = READ_ONCE(file->f_ra.mmap_miss);
    vm_fault_t ret = 0;

    rcu_read_lock();
    - head = first_map_page(mapping, &xas, end_pgoff);
    - if (!head)
    + folio = first_map_page(mapping, &xas, end_pgoff);
    + if (!folio)
    goto out;

    - if (filemap_map_pmd(vmf, head)) {
    + if (filemap_map_pmd(vmf, &folio->page)) {
    ret = VM_FAULT_NOPAGE;
    goto out;
    }
    @@ -3188,7 +3189,7 @@ vm_fault_t filemap_map_pages(struct vm_fault *vmf,
    addr = vma->vm_start + ((start_pgoff - vma->vm_pgoff) << PAGE_SHIFT);
    vmf->pte = pte_offset_map_lock(vma->vm_mm, vmf->pmd, addr, &vmf->ptl);
    do {
    - page = find_subpage(head, xas.xa_index);
    + page = folio_file_page(folio, xas.xa_index);
    if (PageHWPoison(page))
    goto unlock;

    @@ -3209,12 +3210,12 @@ vm_fault_t filemap_map_pages(struct vm_fault *vmf,
    do_set_pte(vmf, page, addr);
    /* no need to invalidate: a not-present page won't be cached */
    update_mmu_cache(vma, addr, vmf->pte);
    - unlock_page(head);
    + folio_unlock(folio);
    continue;
    unlock:
    - unlock_page(head);
    - put_page(head);
    - } while ((head = next_map_page(mapping, &xas, end_pgoff)) != NULL);
    + folio_unlock(folio);
    + folio_put(folio);
    + } while ((folio = next_map_page(mapping, &xas, end_pgoff)) != NULL);
    pte_unmap_unlock(vmf->pte, vmf->ptl);
    out:
    rcu_read_unlock();
    --
    2.30.2
    \
     
     \ /
      Last update: 2021-07-12 06:13    [W:5.706 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site