Skip to content

Commit

Permalink
mm: convert find_get_incore_page() to filemap_get_incore_folio()
Browse files Browse the repository at this point in the history
Return the containing folio instead of the precise page.  One of the
callers wants the folio and the other can do the folio->page conversion
itself.  Nets 442 bytes of text size reduction, 478 bytes removed and 36
bytes added.

Link: https://lkml.kernel.org/r/[email protected]
Signed-off-by: Matthew Wilcox (Oracle) <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
  • Loading branch information
Matthew Wilcox (Oracle) authored and akpm00 committed Nov 9, 2022
1 parent dd8095b commit 524984f
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 19 deletions.
12 changes: 9 additions & 3 deletions mm/memcontrol.c
Original file line number Diff line number Diff line change
Expand Up @@ -5648,15 +5648,21 @@ static struct page *mc_handle_swap_pte(struct vm_area_struct *vma,
static struct page *mc_handle_file_pte(struct vm_area_struct *vma,
unsigned long addr, pte_t ptent)
{
unsigned long index;
struct folio *folio;

if (!vma->vm_file) /* anonymous vma */
return NULL;
if (!(mc.flags & MOVE_FILE))
return NULL;

/* page is moved even if it's not RSS of this task(page-faulted). */
/* folio is moved even if it's not RSS of this task(page-faulted). */
/* shmem/tmpfs may report page out on swap: account for that too. */
return find_get_incore_page(vma->vm_file->f_mapping,
linear_page_index(vma, addr));
index = linear_page_index(vma, addr);
folio = filemap_get_incore_folio(vma->vm_file->f_mapping, index);
if (!folio)
return NULL;
return folio_file_page(folio, index);
}

/**
Expand Down
10 changes: 5 additions & 5 deletions mm/mincore.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,18 +52,18 @@ static int mincore_hugetlb(pte_t *pte, unsigned long hmask, unsigned long addr,
static unsigned char mincore_page(struct address_space *mapping, pgoff_t index)
{
unsigned char present = 0;
struct page *page;
struct folio *folio;

/*
* When tmpfs swaps out a page from a file, any process mapping that
* file will not get a swp_entry_t in its pte, but rather it is like
* any other file mapping (ie. marked !present and faulted in with
* tmpfs's .fault). So swapped out tmpfs mappings are tested here.
*/
page = find_get_incore_page(mapping, index);
if (page) {
present = PageUptodate(page);
put_page(page);
folio = filemap_get_incore_folio(mapping, index);
if (folio) {
present = folio_test_uptodate(folio);
folio_put(folio);
}

return present;
Expand Down
8 changes: 5 additions & 3 deletions mm/swap.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ void clear_shadow_from_swap_cache(int type, unsigned long begin,
unsigned long end);
struct folio *swap_cache_get_folio(swp_entry_t entry,
struct vm_area_struct *vma, unsigned long addr);
struct page *find_get_incore_page(struct address_space *mapping, pgoff_t index);
struct folio *filemap_get_incore_folio(struct address_space *mapping,
pgoff_t index);

struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask,
struct vm_area_struct *vma,
Expand Down Expand Up @@ -105,9 +106,10 @@ static inline struct folio *swap_cache_get_folio(swp_entry_t entry,
}

static inline
struct page *find_get_incore_page(struct address_space *mapping, pgoff_t index)
struct folio *filemap_get_incore_folio(struct address_space *mapping,
pgoff_t index)
{
return find_get_page(mapping, index);
return filemap_get_folio(mapping, index);
}

static inline bool add_to_swap(struct folio *folio)
Expand Down
15 changes: 7 additions & 8 deletions mm/swap_state.c
Original file line number Diff line number Diff line change
Expand Up @@ -373,16 +373,17 @@ struct folio *swap_cache_get_folio(swp_entry_t entry,
}

/**
* find_get_incore_page - Find and get a page from the page or swap caches.
* filemap_get_incore_folio - Find and get a folio from the page or swap caches.
* @mapping: The address_space to search.
* @index: The page cache index.
*
* This differs from find_get_page() in that it will also look for the
* page in the swap cache.
* This differs from filemap_get_folio() in that it will also look for the
* folio in the swap cache.
*
* Return: The found page or %NULL.
* Return: The found folio or %NULL.
*/
struct page *find_get_incore_page(struct address_space *mapping, pgoff_t index)
struct folio *filemap_get_incore_folio(struct address_space *mapping,
pgoff_t index)
{
swp_entry_t swp;
struct swap_info_struct *si;
Expand All @@ -405,9 +406,7 @@ struct page *find_get_incore_page(struct address_space *mapping, pgoff_t index)
folio = filemap_get_folio(swap_address_space(swp), index);
put_swap_device(si);
out:
if (!folio)
return NULL;
return folio_file_page(folio, index);
return folio;
}

struct page *__read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask,
Expand Down

0 comments on commit 524984f

Please sign in to comment.