mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-28 04:45:43 +01:00
mm: introduce and use vma_filebacked_address()
In cases where we know that the VMA is file-backed, use vma_filebacked_address() rather than vma_address(). This lays the foundation for using the anonymous page offset via vma_anon_address(). Also add an assert to ensure that the VMA whose address is required is not anonymous. No functional change intended. Link: https://lore.kernel.org/[email protected] Signed-off-by: Lorenzo Stoakes (ARM) <[email protected]> Tested-by: [email protected] Acked-by: David Hildenbrand (Arm) <[email protected]> Cc: Adrian Hunter <[email protected]> Cc: Alexander Deucher <[email protected]> Cc: Alexander Gordeev <[email protected]> Cc: Alexander Shishkin <[email protected]> Cc: Alistair Popple <[email protected]> Cc: Arnaldo Carvalho de Melo <[email protected]> Cc: Arnd Bergmann <[email protected]> Cc: Baolin Wang <[email protected]> Cc: Baoquan He <[email protected]> Cc: Barry Song <[email protected]> Cc: Boris Brezillon <[email protected]> Cc: Byungchul Park <[email protected]> Cc: Chengming Zhou <[email protected]> Cc: Chris Li <[email protected]> Cc: Christan König <[email protected]> Cc: Christian Borntraeger <[email protected]> Cc: Claudio Imbrenda <[email protected]> Cc: Dave Airlie <[email protected]> Cc: Dev Jain <[email protected]> Cc: Gerald Schaefer <[email protected]> Cc: Greg Kroah-Hartman <[email protected]> Cc: Gregory Price (Meta) <[email protected]> Cc: Harry Yoo <[email protected]> Cc: Heiko Carstens <[email protected]> Cc: Huang Ray <[email protected]> Cc: "Huang, Ying" <[email protected]> Cc: Ian Rogers <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: James Clark <[email protected]> Cc: Jan Kara <[email protected]> Cc: Jann Horn <[email protected]> Cc: Janosch Frank <[email protected]> Cc: Jason Gunthorpe <[email protected]> Cc: Jiri Olsa <[email protected]> Cc: John Hubbard <[email protected]> Cc: Joshua Hahn <[email protected]> Cc: Kairui Song <[email protected]> Cc: Kees Cook <[email protected]> Cc: Kemeng Shi <[email protected]> Cc: Lance Yang <[email protected]> Cc: Liam R. Howlett <[email protected]> Cc: Liviu Dudau <[email protected]> Cc: Maarten Lankhorst <[email protected]> Cc: Marc Rutland <[email protected]> Cc: "Masami Hiramatsu (Google)" <[email protected]> Cc: Matthew Auld <[email protected]> Cc: Matthew Brost <[email protected]> Cc: Matthew Wilcox (Oracle) <[email protected]> Cc: Maxime Ripard <[email protected]> Cc: Miaohe Lin <[email protected]> Cc: Michal Hocko <[email protected]> Cc: Mike Rapoport <[email protected]> Cc: Muchun Song <[email protected]> Cc: Namhyung kim <[email protected]> Cc: Naoya Horiguchi <[email protected]> Cc: Nhat Pham <[email protected]> Cc: Nico Pache <[email protected]> Cc: Oleg Nesterov <[email protected]> Cc: Oscar Salvador <[email protected]> Cc: Pedro Falcato <[email protected]> Cc: Peter Xu <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Rakie Kim <[email protected]> Cc: Rik van Riel <[email protected]> Cc: Rodrigo Vivi <[email protected]> Cc: Ryan Roberts <[email protected]> Cc: Steven Price <[email protected]> Cc: Suren Baghdasaryan <[email protected]> Cc: Sven Schnelle <[email protected]> Cc: Thomas Hellström <[email protected]> Cc: Thomas Zimemrmann <[email protected]> Cc: Vasily Gorbik <[email protected]> Cc: Vlastimil Babka <[email protected]> Cc: xu xin <[email protected]> Cc: Zi Yan <[email protected]> Signed-off-by: Andrew Morton <[email protected]>
This commit is contained in:
1 parent
2a8de2d1d6
commit
dba10745e9
4 files changed
+31
-7
No files matched your search
@@ -1037,6 +1037,24 @@ static inline unsigned long __vma_address(const struct vm_area_struct *vma,
|
||||
return address;
|
||||
}
|
||||
|
||||
/**
|
||||
* vma_filebacked_address - Find the virtual address a file-backed page range is
|
||||
* mapped at.
|
||||
* @vma: The vma which maps this object.
|
||||
* @pgoff: The page offset within its object.
|
||||
* @nr_pages: The number of pages to consider.
|
||||
*
|
||||
* Returns: If any page in this range is mapped by this VMA, return the first
|
||||
* address where any of these pages appear. Otherwise, return -EFAULT.
|
||||
*/
|
||||
static inline unsigned long vma_filebacked_address(const struct vm_area_struct *vma,
|
||||
pgoff_t pgoff, unsigned long nr_pages)
|
||||
{
|
||||
VM_WARN_ON_ONCE(vma_is_anonymous(vma));
|
||||
|
||||
return __vma_address(vma, pgoff, vma_start_pgoff(vma), nr_pages);
|
||||
}
|
||||
|
||||
/**
|
||||
* vma_address - Find the virtual address a page range is mapped at.
|
||||
* @vma: The vma which maps this object.
|
||||
|
||||
+2
-2
@@ -620,7 +620,7 @@ static void add_to_kill_fsdax(struct task_struct *tsk, const struct page *p,
|
||||
struct vm_area_struct *vma,
|
||||
struct list_head *to_kill, pgoff_t pgoff)
|
||||
{
|
||||
unsigned long addr = vma_address(vma, pgoff, 1);
|
||||
unsigned long addr = vma_filebacked_address(vma, pgoff, 1);
|
||||
__add_to_kill(tsk, p, vma, to_kill, addr);
|
||||
}
|
||||
|
||||
@@ -2265,7 +2265,7 @@ static void add_to_kill_pgoff(struct task_struct *tsk,
|
||||
}
|
||||
|
||||
/* Check for pgoff not backed by struct page */
|
||||
tk->addr = vma_address(vma, pgoff, 1);
|
||||
tk->addr = vma_filebacked_address(vma, pgoff, 1);
|
||||
tk->size_shift = PAGE_SHIFT;
|
||||
|
||||
if (tk->addr == -EFAULT)
|
||||
|
||||
@@ -356,6 +356,7 @@ unsigned long page_mapped_in_vma(const struct page *page,
|
||||
struct vm_area_struct *vma)
|
||||
{
|
||||
const struct folio *folio = page_folio(page);
|
||||
const pgoff_t pgoff = page_pgoff(folio, page);
|
||||
struct page_vma_mapped_walk pvmw = {
|
||||
.pfn = page_to_pfn(page),
|
||||
.nr_pages = 1,
|
||||
@@ -363,7 +364,10 @@ unsigned long page_mapped_in_vma(const struct page *page,
|
||||
.flags = PVMW_SYNC,
|
||||
};
|
||||
|
||||
pvmw.address = vma_address(vma, page_pgoff(folio, page), 1);
|
||||
if (folio_test_anon(folio))
|
||||
pvmw.address = vma_address(vma, pgoff, 1);
|
||||
else
|
||||
pvmw.address = vma_filebacked_address(vma, pgoff, 1);
|
||||
if (pvmw.address == -EFAULT)
|
||||
goto out;
|
||||
if (!page_vma_mapped_walk(&pvmw))
|
||||
|
||||
@@ -865,14 +865,15 @@ unsigned long page_address_in_vma(const struct folio *folio,
|
||||
if (!vma->anon_vma || !anon_vma ||
|
||||
vma->anon_vma->root != anon_vma->root)
|
||||
return -EFAULT;
|
||||
/* KSM folios don't reach here because of the !anon_vma check */
|
||||
return vma_address(vma, page_pgoff(folio, page), 1);
|
||||
} else if (!vma->vm_file) {
|
||||
return -EFAULT;
|
||||
} else if (vma->vm_file->f_mapping != folio->mapping) {
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
/* KSM folios don't reach here because of the !anon_vma check */
|
||||
return vma_address(vma, page_pgoff(folio, page), 1);
|
||||
return vma_filebacked_address(vma, page_pgoff(folio, page), 1);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1321,7 +1322,7 @@ int pfn_mkclean_range(unsigned long pfn, unsigned long nr_pages, pgoff_t pgoff,
|
||||
if (invalid_mkclean_vma(vma, NULL))
|
||||
return 0;
|
||||
|
||||
pvmw.address = vma_address(vma, pgoff, nr_pages);
|
||||
pvmw.address = vma_filebacked_address(vma, pgoff, nr_pages);
|
||||
VM_BUG_ON_VMA(pvmw.address == -EFAULT, vma);
|
||||
|
||||
return page_vma_mkclean_one(&pvmw);
|
||||
@@ -3098,7 +3099,8 @@ static void __rmap_walk_file(struct folio *folio, struct address_space *mapping,
|
||||
}
|
||||
lookup:
|
||||
mapping_rmap_tree_foreach(vma, mapping, pgoff_start, pgoff_end) {
|
||||
unsigned long address = vma_address(vma, pgoff_start, nr_pages);
|
||||
unsigned long address = vma_filebacked_address(vma, pgoff_start,
|
||||
nr_pages);
|
||||
|
||||
VM_BUG_ON_VMA(address == -EFAULT, vma);
|
||||
cond_resched();
|
||||
|
||||
Reference in new issue
Block a user