From: sashiko-bot@kernel.org
To: "Lorenzo Stoakes (ARM)" <ljs@kernel.org>
Cc: linux-s390@vger.kernel.org, bpf@vger.kernel.org,
"Marc Zyngier" <maz@kernel.org>,
kvm@vger.kernel.org, "Heiko Carstens" <hca@linux.ibm.com>,
linux-rdma@vger.kernel.org, selinux@vger.kernel.org,
"Christian Borntraeger" <borntraeger@linux.ibm.com>,
linux-trace-kernel@vger.kernel.org,
linux-perf-users@vger.kernel.org, kvmarm@lists.linux.dev,
"Alexander Gordeev" <agordeev@linux.ibm.com>,
linux-scsi@vger.kernel.org, "Vasily Gorbik" <gor@linux.ibm.com>,
"Oliver Upton" <oupton@kernel.org>,
dri-devel@lists.freedesktop.org
Subject: Re: [PATCH v2 08/40] mm: add mmap action for discontiguous kernel page mapping
Date: Mon, 14 Sep 2026 17:03:44 +0000 [thread overview]
Message-ID: <20260914170344.B2DB81F00893@smtp.kernel.org> (raw)
In-Reply-To: <20260914-b4-mmap-prepare-vma-flag-sanify-v2-8-7d9781ed5361@kernel.org>
Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [High] `discontig_kernel_map_page()` silently maps entire compound pages instead of single pages and maps incorrect memory when passed a tail page.
- [Medium] API design causes an unavoidable memory leak if a driver allocates state in `ops->init()` and a subsequent failure occurs.
- [Low] Missing NULL check for the `ops` struct before dereferencing it in validation code.
--
commit d5639a50ca1090febd85053c26c1f0a170b51deb
Author: Lorenzo Stoakes (ARM) <ljs@kernel.org>
Date: Mon Sep 14 14:57:28 2026 +0000
mm: add mmap action for discontiguous kernel page mapping
This commit introduces a new mmap action allowing drivers to map discontiguous
kernel pages. It adds discontig_kernel_page_ops for defining the mapping
operation, including initialization and page retrieval logic. Helpers are
provided to map single pages, ranges, or compound pages.
> diff --git a/include/linux/mm.h b/include/linux/mm.h
> index a1f2d375cf7d8..2a92193ac6a5e 100644
> --- a/include/linux/mm.h
> +++ b/include/linux/mm.h
[ ... ]
> @@ -4647,10 +4647,55 @@ static inline void mmap_action_map_kernel_pages_full(struct vm_area_desc *desc,
> +static inline void
> +discontig_kernel_map_page(struct discontig_kernel_page_state *state,
> + struct page *page)
> +{
> + struct folio *folio = page_folio(page);
> +
> + if (folio_test_large(folio)) {
> + VM_WARN_ON_ONCE(page != folio_page(folio, 0));
> + state->action = DISCONTIG_KERNEL_PAGE_MAP_COMPOUND_PAGE;
> + state->__folio = folio;
> + state->__nr_pages = min(state->nr_pages_remain,
> + folio_nr_pages(folio));
[Severity: High]
If a driver passes a tail page here intending to map just that specific page,
does this unintentionally escalate the mapping to the entire compound page?
The API discards the specific page pointer and sets up a folio mapping
instead. Even though there is a warning when passing a tail page, the code
proceeds to map starting from the head page in apply_discontig_action(),
which could expose unrequested kernel memory to userspace.
> diff --git a/mm/memory.c b/mm/memory.c
> index 448342883e9da..42f0845172471 100644
> --- a/mm/memory.c
> +++ b/mm/memory.c
[ ... ]
> +int map_discontig_kernel_pages_prepare(struct vm_area_desc *desc)
> +{
> + const struct mmap_action *action = &desc->action;
> + const struct discontig_kernel_page_ops *ops =
> + action->map_kernel_discontig.ops;
> +
> + /* At minimum need to be able to get pages. */
> + if (WARN_ON_ONCE(!ops->get))
[Severity: Low]
Is it possible for the ops pointer to be NULL here?
If a driver erroneously sets up a discontiguous mapping action but passes a
NULL ops pointer, dereferencing ops->get will cause a panic before the
intended validation warning can trigger.
> + return -EINVAL;
> +
> + __map_kernel_pages_prepare(desc);
> + return 0;
> +}
> +
> +static int apply_discontig_action(struct vm_area_struct *vma,
> + struct discontig_kernel_page_state *state)
> +{
> + unsigned long nr_pages = state->__nr_pages;
> + unsigned long addr = state->addr;
> + unsigned long i;
[ ... ]
> + /* Compound folio - have to iterate through each page. */
> + for (i = 0; i < nr_pages; i++, addr += PAGE_SIZE) {
> + struct page *page = folio_page(state->__folio, i);
[Severity: High]
As mentioned above, if a tail page was passed to discontig_kernel_map_page(),
this loop always starts mapping from the head page (i = 0) of the folio.
Could this map the wrong memory into userspace if the caller specifically
requested a tail page?
> + int err;
> +
> + err = insert_page(vma, addr, page, vma->vm_page_prot,
> + /*mkwrite=*/false);
> + if (err)
> + return err;
> + }
> + return 0;
> +}
> +
> +int map_discontig_kernel_pages_complete(struct vm_area_struct *vma,
> + struct mmap_action *action)
> +{
> + const struct discontig_kernel_page_ops *ops =
> + action->map_kernel_discontig.ops;
> + struct discontig_kernel_page_state state = {
> + .start = vma->vm_start,
> + .end = vma->vm_end,
> + .addr = vma->vm_start,
> + .pgoff = vma->vm_pgoff,
> + .nr_pages_mapped = 0,
> + .nr_pages_remain = vma_pages(vma),
> + .vm_private_data = vma->vm_private_data,
> + .private = action->map_kernel_discontig.init_private,
> + };
> + int err = 0;
> +
> + if (ops->init)
> + err = ops->init(vma->vm_private_data, &state.private);
> + if (err)
> + return err;
> +
> + do {
> + unsigned long end, pgoff_end;
> + unsigned long nr_pages;
> +
> + /* Default to abort. */
> + state.action = DISCONTIG_KERNEL_PAGE_ABORT;
> + err = ops->get(&state);
> + if (err || state.action == DISCONTIG_KERNEL_PAGE_ABORT)
> + return err;
[Severity: Medium]
Does this error path leak memory if a driver allocated state in ops->init()?
The commit message mentions that any state established by ops->init() is
released in vm_ops->close. However, if an error occurs here (or below in
apply_discontig_action), the function returns immediately.
Since state is a local variable on the stack, and the driver's close callback
only receives the vma (which has no access to state.private), it appears any
memory assigned to *private would be permanently leaked.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260914-b4-mmap-prepare-vma-flag-sanify-v2-0-7d9781ed5361@kernel.org?part=8
next prev parent reply other threads:[~2026-09-14 17:03 UTC|newest]
Thread overview: 82+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-14 14:57 [PATCH v2 00/40] mm: make VMA flag semantics explicit, eliminate VM_SPECIAL Lorenzo Stoakes (ARM)
2026-09-14 14:57 ` [PATCH v2 01/40] mm/vma: fix mmap_prepare file handling, remove file_doesnt_need_get Lorenzo Stoakes (ARM)
2026-09-14 15:40 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 02/40] mm/vma: predicate setting mmap_prepare VMA fields on new vma alloc Lorenzo Stoakes (ARM)
2026-09-14 15:55 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 03/40] mm/vma: introduce and use vma_[flags_]can_merge() Lorenzo Stoakes (ARM)
2026-09-14 15:59 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 04/40] mm: consistently validate VMA state after mmap[_prepare] hooks Lorenzo Stoakes (ARM)
2026-09-14 16:18 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 05/40] mm/vma: ensure mmap_prepare doesn't set actions on a mergeable vma Lorenzo Stoakes (ARM)
2026-09-14 16:45 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 06/40] mm: make map_kernel_pages_[prepare,complete] internal and unexported Lorenzo Stoakes (ARM)
2026-09-14 16:47 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 07/40] mm/vma: tidy up map kernel pages enum values Lorenzo Stoakes (ARM)
2026-09-14 16:50 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 08/40] mm: add mmap action for discontiguous kernel page mapping Lorenzo Stoakes (ARM)
2026-09-14 17:03 ` sashiko-bot [this message]
2026-09-14 14:57 ` [PATCH v2 09/40] docs: filesystems: update mmap_prepare docs for discontig kernel pgs Lorenzo Stoakes (ARM)
2026-09-14 17:07 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 10/40] drivers/usb/mon: update to use mmap_prepare + map kernel pages Lorenzo Stoakes (ARM)
2026-09-14 17:18 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 11/40] infiniband: update hfi1 to use remap_vmalloc_range() Lorenzo Stoakes (ARM)
2026-09-14 17:39 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 12/40] selinux: reject writable opens of policy file, drop mmap shared/write check Lorenzo Stoakes (ARM)
2026-09-14 17:57 ` sashiko-bot
2026-09-14 19:57 ` Paul Moore
2026-09-14 14:57 ` [PATCH v2 13/40] ALSA: pcm: use vm_insert_page() to map PCM status page Lorenzo Stoakes (ARM)
2026-09-14 18:30 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 14/40] bpf: arena: mark arena_map_mmap() mappings VM_MIXEDMAP Lorenzo Stoakes (ARM)
2026-09-14 18:46 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 15/40] mm/vma: add vma[_flags]_is_kernel_owned() predicates Lorenzo Stoakes (ARM)
2026-09-14 18:50 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 16/40] mm/vma: only allow mmap to clear VMA_MAYWRITE_BIT if kernel-owned Lorenzo Stoakes (ARM)
2026-09-14 19:14 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 17/40] mm/vma: add and use vma_[flags]_is_fixed_mapping Lorenzo Stoakes (ARM)
2026-09-14 19:24 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 18/40] scsi: sg: convert mmap hook to mmap_prepare and rework Lorenzo Stoakes (ARM)
2026-09-14 19:30 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 19/40] fbdev: defio: assert FBINFO_VIRTFB, drop VM_IO, add VM_MIXEDMAP Lorenzo Stoakes (ARM)
2026-09-14 19:44 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 20/40] HSI: cmt_speech: convert mmap hook to mmap_prepare, refactor Lorenzo Stoakes (ARM)
2026-09-14 20:15 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 21/40] mm/gup: error out early on !VMA_MAYREAD_BIT VMAs Lorenzo Stoakes (ARM)
2026-09-14 20:33 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 22/40] uprobes: remove VM_IO, set VM_MIXEDMAP for mapped kernel pages Lorenzo Stoakes (ARM)
2026-09-14 20:47 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 23/40] mm/mlock: clear VMA_LOCKED_MASK over mmap callback Lorenzo Stoakes (ARM)
2026-09-14 21:09 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 24/40] mm/mlock: eliminate weird VMA_IO_BIT abuse and simplify Lorenzo Stoakes (ARM)
2026-09-14 21:44 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 25/40] mm/vma: enforce that only kernel-owned mappings may set VMA_IO_BIT Lorenzo Stoakes (ARM)
2026-09-14 22:18 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 26/40] mm: remove VMA_IO_BIT check in vma[_flags]_is_kernel_owned() Lorenzo Stoakes (ARM)
2026-09-14 22:09 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 27/40] mm: remove hugetlb_inline.h Lorenzo Stoakes (ARM)
2026-09-14 22:09 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 28/40] mm: rename is_vm_hugetlb_page() to vma_is_hugetlb() Lorenzo Stoakes (ARM)
2026-09-14 14:57 ` [PATCH v2 29/40] mm: drop some redundant checks around hugetlb VMAs Lorenzo Stoakes (ARM)
2026-09-14 22:08 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 30/40] mm/madvise: update is_valid_guard_vma() to use vma_can_merge() Lorenzo Stoakes (ARM)
2026-09-14 22:14 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 31/40] mm/vma: introduce vma[_flags]_is_persistent() Lorenzo Stoakes (ARM)
2026-09-14 22:12 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 32/40] mm/uffd: use predicates for userfaultfd checks Lorenzo Stoakes (ARM)
2026-09-14 22:16 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 33/40] mm/madvise: use predicates for madvise(..., MADV_DOFORK) Lorenzo Stoakes (ARM)
2026-09-14 22:18 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 34/40] mm: eliminate VMA_SPECIAL_FLAGS usage when hugetlb explicitly tested Lorenzo Stoakes (ARM)
2026-09-14 22:21 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 35/40] mm: eliminate VMA_SPECIAL_FLAGS check in lru_gen_look_around() Lorenzo Stoakes (ARM)
2026-09-14 22:22 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 36/40] mm: avoid use of VMA_SPECIAL_FLAGS in migrate_vma_setup() Lorenzo Stoakes (ARM)
2026-09-14 22:23 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 37/40] mm: eliminate VM_SPECIAL, VMA_SPECIAL_FLAGS Lorenzo Stoakes (ARM)
2026-09-14 22:19 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 38/40] fuse: dax: do not set VM_MIXEDMAP Lorenzo Stoakes (ARM)
2026-09-14 22:30 ` sashiko-bot
2026-09-14 14:57 ` [PATCH v2 39/40] mm/huge_memory: remove vma_is_special_huge() Lorenzo Stoakes (ARM)
2026-09-14 22:26 ` sashiko-bot
2026-09-14 14:58 ` [PATCH v2 40/40] mm/vma: introduce and use vma[_flags]_can_gup() Lorenzo Stoakes (ARM)
2026-09-14 22:25 ` sashiko-bot
2026-09-15 1:08 ` [PATCH v2 00/40] mm: make VMA flag semantics explicit, eliminate VM_SPECIAL Andrew Morton
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260914170344.B2DB81F00893@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=agordeev@linux.ibm.com \
--cc=borntraeger@linux.ibm.com \
--cc=bpf@vger.kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=gor@linux.ibm.com \
--cc=hca@linux.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.linux.dev \
--cc=linux-perf-users@vger.kernel.org \
--cc=linux-rdma@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=ljs@kernel.org \
--cc=maz@kernel.org \
--cc=oupton@kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
--cc=selinux@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).