mirror of
https://github.com/torvalds/linux.git
synced 2026-09-11 20:13:02 +02: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/20260813-b4-scalable-cow-virt-pgoff-v5-6-c21581c0c3c8@kernel.org Signed-off-by: Lorenzo Stoakes (ARM) <ljs@kernel.org> Tested-by: syzbot@syzkaller.appspotmail.com Acked-by: David Hildenbrand (Arm) <david@kernel.org> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Deucher <alexander.deucher@amd.com> Cc: Alexander Gordeev <agordeev@linux.ibm.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Alistair Popple <apopple@nvidia.com> Cc: Arnaldo Carvalho de Melo <acme@kernel.org> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Baolin Wang <baolin.wang@linux.alibaba.com> Cc: Baoquan He <baoquan.he@linux.dev> Cc: Barry Song <baohua@kernel.org> Cc: Boris Brezillon <boris.brezillon@collabora.com> Cc: Byungchul Park <byungchul@sk.com> Cc: Chengming Zhou <chengming.zhou@linux.dev> Cc: Chris Li <chrisl@kernel.org> Cc: Christan König <christian.koenig@amd.com> Cc: Christian Borntraeger <borntraeger@linux.ibm.com> Cc: Claudio Imbrenda <imbrenda@linux.ibm.com> Cc: Dave Airlie <airlied@gmail.com> Cc: Dev Jain <dev.jain@arm.com> Cc: Gerald Schaefer <gerald.schaefer@linux.ibm.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Gregory Price (Meta) <gourry@gourry.net> Cc: Harry Yoo <harry@kernel.org> Cc: Heiko Carstens <hca@linux.ibm.com> Cc: Huang Ray <Ray.Huang@amd.com> Cc: "Huang, Ying" <ying.huang@linux.alibaba.com> Cc: Ian Rogers <irogers@google.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: James Clark <james.clark@linaro.org> Cc: Jan Kara <jack@suse.cz> Cc: Jann Horn <jannh@google.com> Cc: Janosch Frank <frankja@linux.ibm.com> Cc: Jason Gunthorpe <jgg@ziepe.ca> Cc: Jiri Olsa <jolsa@kernel.org> Cc: John Hubbard <jhubbard@nvidia.com> Cc: Joshua Hahn <joshua.hahnjy@gmail.com> Cc: Kairui Song <kasong@tencent.com> Cc: Kees Cook <kees@kernel.org> Cc: Kemeng Shi <shikemeng@huaweicloud.com> Cc: Lance Yang <lance.yang@linux.dev> Cc: Liam R. Howlett <liam@infradead.org> Cc: Liviu Dudau <liviu.dudau@arm.com> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Cc: Marc Rutland <mark.rutland@arm.com> Cc: "Masami Hiramatsu (Google)" <mhiramat@kernel.org> Cc: Matthew Auld <matthew.auld@intel.com> Cc: Matthew Brost <matthew.brost@intel.com> Cc: Matthew Wilcox (Oracle) <willy@infradead.org> Cc: Maxime Ripard <mripard@kernel.org> Cc: Miaohe Lin <linmiaohe@huawei.com> Cc: Michal Hocko <mhocko@suse.com> Cc: Mike Rapoport <rppt@kernel.org> Cc: Muchun Song <muchun.song@linux.dev> Cc: Namhyung kim <namhyung@kernel.org> Cc: Naoya Horiguchi <nao.horiguchi@gmail.com> Cc: Nhat Pham <nphamcs@gmail.com> Cc: Nico Pache <npache@redhat.com> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Oscar Salvador <osalvador@suse.de> Cc: Pedro Falcato <pfalcato@suse.de> Cc: Peter Xu <peterx@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Rakie Kim <rakie.kim@sk.com> Cc: Rik van Riel <riel@surriel.com> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> Cc: Ryan Roberts <ryan.roberts@arm.com> Cc: Steven Price <steven.price@arm.com> Cc: Suren Baghdasaryan <surenb@google.com> Cc: Sven Schnelle <svens@linux.ibm.com> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com> Cc: Thomas Zimemrmann <tzimmermann@suse.de> Cc: Vasily Gorbik <gor@linux.ibm.com> Cc: Vlastimil Babka <vbabka@kernel.org> Cc: xu xin <xu.xin16@zte.com.cn> Cc: Zi Yan <ziy@nvidia.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
2a8de2d1d6
commit
dba10745e9
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
10
mm/rmap.c
10
mm/rmap.c
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user