vmcore: convert mmap_vmcore_fault() to use folios

Use a folio for the page cache page the s390 fault handler reads the old
kernel's memory into.  This removes four compound_head() calls and one of
the last callers of find_or_create_page().

The vmcore mapping only has order-0 folios, so the logic is unchanged.

Compile tested for s390.

Link: https://lore.kernel.org/20260915-vmcore-fault-folio-v1-1-a0cb6278670f@columbia.edu
Signed-off-by: Tal Zussman <tz2294@columbia.edu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Acked-by: Pratyush Yadav <pratyush@kernel.org>
Cc: Baoquan He <baoquan.he@linux.dev>
Cc: Dave Young <ruirui.yang@linux.dev>
Cc: Mike Rapoport <rppt@kernel.org>
Cc: Pasha Tatashin <pasha.tatashin@soleen.com>
This commit is contained in:
Tal Zussman 2026-09-15 19:42:15 -04:00 committed by Andrew Morton
parent dba177ad78
commit d8020965b2

View File

@ -474,29 +474,30 @@ static vm_fault_t mmap_vmcore_fault(struct vm_fault *vmf)
pgoff_t index = vmf->pgoff;
struct iov_iter iter;
struct kvec kvec;
struct page *page;
struct folio *folio;
loff_t offset;
int rc;
page = find_or_create_page(mapping, index, GFP_KERNEL);
if (!page)
folio = __filemap_get_folio(mapping, index,
FGP_LOCK | FGP_ACCESSED | FGP_CREAT, GFP_KERNEL);
if (IS_ERR(folio))
return VM_FAULT_OOM;
if (!PageUptodate(page)) {
offset = (loff_t) index << PAGE_SHIFT;
kvec.iov_base = page_address(page);
kvec.iov_len = PAGE_SIZE;
iov_iter_kvec(&iter, ITER_DEST, &kvec, 1, PAGE_SIZE);
if (!folio_test_uptodate(folio)) {
offset = folio_pos(folio);
kvec.iov_base = folio_address(folio);
kvec.iov_len = folio_size(folio);
iov_iter_kvec(&iter, ITER_DEST, &kvec, 1, folio_size(folio));
rc = __read_vmcore(&iter, &offset);
if (rc < 0) {
unlock_page(page);
put_page(page);
folio_unlock(folio);
folio_put(folio);
return vmf_error(rc);
}
SetPageUptodate(page);
folio_mark_uptodate(folio);
}
unlock_page(page);
vmf->page = page;
folio_unlock(folio);
vmf->page = folio_file_page(folio, index);
return 0;
#else
return VM_FAULT_SIGBUS;