* + scsi-sg-convert-mmap-hook-to-mmap_prepare-and-rework.patch added to mm-new branch
@ 2026-09-15 1:09 Andrew Morton
0 siblings, 0 replies; only message in thread
From: Andrew Morton @ 2026-09-15 1:09 UTC (permalink / raw)
To: mm-commits, ljs, akpm
The patch titled
Subject: scsi: sg: convert mmap hook to mmap_prepare and rework
has been added to the -mm mm-new branch. Its filename is
scsi-sg-convert-mmap-hook-to-mmap_prepare-and-rework.patch
This patch will shortly appear at
https://git.kernel.org/pub/scm/linux/kernel/git/akpm/25-new.git/tree/patches/scsi-sg-convert-mmap-hook-to-mmap_prepare-and-rework.patch
This patch will later appear in the mm-new branch at
git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
Note, mm-new is a provisional staging ground for work-in-progress
patches, and acceptance into mm-new is a notification for others take
notice and to finish up reviews. Please do not hesitate to respond to
review feedback and post updated versions to replace or incrementally
fixup patches in mm-new.
The mm-new branch of mm.git is not included in linux-next
If a few days of testing in mm-new is successful, the patch will me moved
into mm.git's mm-unstable branch, which is included in linux-next
Before you just go and hit "reply", please:
a) Consider who else should be cc'ed
b) Prefer to cc a suitable mailing list as well
c) Ideally: find the original patch on the mailing list and do a
reply-to-all to that, adding suitable additional cc's
*** Remember to use Documentation/process/submit-checklist.rst when testing your code ***
The -mm tree is included into linux-next via various
branches at git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
and is updated there most days
------------------------------------------------------
From: "Lorenzo Stoakes (ARM)" <ljs@kernel.org>
Subject: scsi: sg: convert mmap hook to mmap_prepare and rework
Date: Mon, 14 Sep 2026 15:57:38 +0100
Move from the deprecated mmap hook to the new mmap_prepare hook.
We are mapping kernel pages here, so use the discontiguous kernel mapping
mmap action to do so.
Unwind the rather confusing loop and instead map as many pages as we can
at one time.
Note that we do not need to pay attention to rsv_schp->k_use_sg here, as
the pages are populated for the length of the buffer at
rsv_schp->page_order granularity as compound pages.
The discontiguous kernel page mapping logic handles the compound pages for
us.
sfp->mmap_called keeps the buffer stable for us. As before it is never
cleared, so a failed mmap also leaves it set.
We also remove some useless vma, vma->vm_file NULL checks - these will
always be non-NULL if you reached the mmap hook logic.
We retain log output for consistency, but change what's output on page
mapping to indicate that sg_discontig_get() does the work now.
Note that we drop the VMA_IO_BIT flag for the VMA here. It was never
necessary as we invoke alloc_pages() which gives us refcounted folios that
are fine for GUP to access (VMA_IO_BIT would prevent that).
Link: https://lore.kernel.org/20260914-b4-mmap-prepare-vma-flag-sanify-v2-18-7d9781ed5361@kernel.org
Signed-off-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---
drivers/scsi/sg.c | 115 +++++++++++++++++++-------------------------
1 file changed, 51 insertions(+), 64 deletions(-)
--- a/drivers/scsi/sg.c~scsi-sg-convert-mmap-hook-to-mmap_prepare-and-rework
+++ a/drivers/scsi/sg.c
@@ -1212,85 +1212,72 @@ sg_fasync(int fd, struct file *filp, int
return fasync_helper(fd, filp, mode, &sfp->async_qp);
}
-static vm_fault_t
-sg_vma_fault(struct vm_fault *vmf)
+static int sg_discontig_init(void *vm_private_data, void **private)
{
- struct vm_area_struct *vma = vmf->vma;
- Sg_fd *sfp;
- unsigned long offset, len, sa;
- Sg_scatter_hold *rsv_schp;
- int k, length;
-
- if ((NULL == vma) || (!(sfp = (Sg_fd *) vma->vm_private_data)))
- return VM_FAULT_SIGBUS;
- rsv_schp = &sfp->reserve;
- offset = vmf->pgoff << PAGE_SHIFT;
- if (offset >= rsv_schp->bufflen)
- return VM_FAULT_SIGBUS;
- SCSI_LOG_TIMEOUT(3, sg_printk(KERN_INFO, sfp->parentdp,
- "sg_vma_fault: offset=%lu, scatg=%d\n",
- offset, rsv_schp->k_use_sg));
- sa = vma->vm_start;
- length = 1 << (PAGE_SHIFT + rsv_schp->page_order);
- for (k = 0; k < rsv_schp->k_use_sg && sa < vma->vm_end; k++) {
- len = vma->vm_end - sa;
- len = (len < length) ? len : length;
- if (offset < len) {
- struct page *page = rsv_schp->pages[k] + (offset >> PAGE_SHIFT);
- get_page(page); /* increment page count */
- vmf->page = page;
- return 0; /* success */
- }
- sa += len;
- offset -= len;
+ const unsigned long req_sz = (unsigned long)*private;
+ Sg_fd *sfp = vm_private_data;
+ Sg_scatter_hold *rsv_schp = &sfp->reserve;
+ int err = 0;
+
+ mutex_lock(&sfp->f_mutex);
+ if (req_sz > rsv_schp->bufflen) {
+ err = -ENOMEM; /* cannot map more than reserved buffer */
+ goto out;
+ }
+ sfp->mmap_called = 1; /* Prevents changes to buffer size. */
+out:
+ mutex_unlock(&sfp->f_mutex);
+ return err;
+}
+
+static int
+sg_discontig_get(struct discontig_kernel_page_state *state)
+{
+ Sg_fd *sfp = state->vm_private_data;
+ Sg_scatter_hold *rsv_schp = &sfp->reserve;
+ const unsigned int order = rsv_schp->page_order;
+ const pgoff_t nr_pages = state->nr_pages_mapped;
+
+ if (nr_pages >= (rsv_schp->bufflen >> PAGE_SHIFT)) {
+ discontig_kernel_map_abort(state);
+ return 0;
}
- return VM_FAULT_SIGBUS;
+ SCSI_LOG_TIMEOUT(3, sg_printk(KERN_INFO, sfp->parentdp,
+ "%s: offset=%lu, scatg=%d\n", __func__,
+ nr_pages << PAGE_SHIFT, rsv_schp->k_use_sg));
+
+ discontig_kernel_map_page(state, rsv_schp->pages[nr_pages >> order]);
+ return 0;
}
-static const struct vm_operations_struct sg_mmap_vm_ops = {
- .fault = sg_vma_fault,
+static const struct discontig_kernel_page_ops sg_discontig_ops = {
+ .init = sg_discontig_init,
+ .get = sg_discontig_get,
};
static int
-sg_mmap(struct file *filp, struct vm_area_struct *vma)
+sg_mmap_prepare(struct vm_area_desc *desc)
{
- Sg_fd *sfp;
- unsigned long req_sz, len, sa;
- Sg_scatter_hold *rsv_schp;
- int k, length;
- int ret = 0;
+ Sg_fd *sfp = desc->file->private_data;
+ const unsigned long req_sz = vma_desc_size(desc);
- if ((!filp) || (!vma) || (!(sfp = (Sg_fd *) filp->private_data)))
+ if (!sfp)
return -ENXIO;
- req_sz = vma->vm_end - vma->vm_start;
+
SCSI_LOG_TIMEOUT(3, sg_printk(KERN_INFO, sfp->parentdp,
"sg_mmap starting, vm_start=%p, len=%d\n",
- (void *) vma->vm_start, (int) req_sz));
- if (vma->vm_pgoff)
+ (void *) desc->start, (int) req_sz));
+
+ if (desc->pgoff)
return -EINVAL; /* want no offset */
- rsv_schp = &sfp->reserve;
- mutex_lock(&sfp->f_mutex);
- if (req_sz > rsv_schp->bufflen) {
- ret = -ENOMEM; /* cannot map more than reserved buffer */
- goto out;
- }
- sa = vma->vm_start;
- length = 1 << (PAGE_SHIFT + rsv_schp->page_order);
- for (k = 0; k < rsv_schp->k_use_sg && sa < vma->vm_end; k++) {
- len = vma->vm_end - sa;
- len = (len < length) ? len : length;
- sa += len;
- }
+ vma_desc_set_flags(desc, VMA_DONTEXPAND_BIT, VMA_DONTDUMP_BIT);
+ desc->private_data = sfp;
- sfp->mmap_called = 1;
- vm_flags_set(vma, VM_IO | VM_DONTEXPAND | VM_DONTDUMP);
- vma->vm_private_data = sfp;
- vma->vm_ops = &sg_mmap_vm_ops;
-out:
- mutex_unlock(&sfp->f_mutex);
- return ret;
+ mmap_action_map_discontig_kernel_pages(desc, (void *)req_sz,
+ &sg_discontig_ops);
+ return 0;
}
static void
@@ -1415,7 +1402,7 @@ static const struct file_operations sg_f
.unlocked_ioctl = sg_ioctl,
.compat_ioctl = compat_ptr_ioctl,
.open = sg_open,
- .mmap = sg_mmap,
+ .mmap_prepare = sg_mmap_prepare,
.release = sg_release,
.fasync = sg_fasync,
};
_
Patches currently in -mm which might be from ljs@kernel.org are
mm-vmpressure-remove-window-size-todo.patch
tools-testing-selftests-mm-add-missing-gitignore-entries.patch
mm-move-drivers-char-memc-to-mm-char-memc.patch
mm-implement-file_is_dev_zero-to-uniquely-identify-dev-zero.patch
mm-vma-only-permit-map_private-dev-zero-to-be-mapped-anonymous.patch
mm-vma-make-map_private-mapped-dev-zero-mappings-truly-anonymous.patch
tools-testing-vma-add-test-to-assert-map_private-dev-zero-is-anon.patch
tools-testing-selftests-mm-add-map_private-dev-zero-merge-tests.patch
mm-madvise-swap-in-cowd-map_private-file-mappings-on-madv_willneed.patch
mm-huge_memory-zap-deposited-page-tables-after-an-rcu-grace-period.patch
mm-enable-mmu_gather_rcu_table_free-for-most-2-level-architectures.patch
mm-enable-mmu_gather_rcu_table_free-for-mmu-riscv.patch
mm-enable-mmu_gather_rcu_table_free-for-mmu-arm.patch
mm-enable-mmu_gather_rcu_table_free-for-arc-microblaze-xtensa.patch
mm-enable-mmu_gather_rcu_table_free-for-sparc64.patch
mm-enable-mmu_gather_rcu_table_free-for-m68k-coldfire.patch
mm-enable-mmu_gather_rcu_table_free-for-sh-x2.patch
mm-enable-mmu_gather_rcu_table_free-for-m68k-motorola.patch
mm-enable-mmu_gather_rcu_table_free-for-sparc32.patch
mm-make-userland-page-table-freeing-rcu-safe.patch
mm-change-the-contract-for-free_pgtables-update-docs.patch
mm-vma-fix-mmap_prepare-file-handling-remove-file_doesnt_need_get.patch
mm-vma-predicate-setting-mmap_prepare-vma-fields-on-new-vma-alloc.patch
mm-vma-introduce-and-use-vma_can_merge.patch
mm-consistently-validate-vma-state-after-mmap-hooks.patch
mm-vma-ensure-mmap_prepare-doesnt-set-actions-on-a-mergeable-vma.patch
mm-make-map_kernel_pages_-internal-and-unexported.patch
mm-vma-tidy-up-map-kernel-pages-enum-values.patch
mm-add-mmap-action-for-discontiguous-kernel-page-mapping.patch
docs-filesystems-update-mmap_prepare-docs-for-discontig-kernel-pgs.patch
drivers-usb-mon-update-to-use-mmap_prepare-map-kernel-pages.patch
infiniband-update-hfi1-to-use-remap_vmalloc_range.patch
selinux-reject-writable-opens-of-policy-file-drop-mmap-shared-write-check.patch
alsa-pcm-use-vm_insert_page-to-map-pcm-status-page.patch
bpf-arena-mark-arena_map_mmap-mappings-vm_mixedmap.patch
mm-vma-add-vma_is_kernel_owned-predicates.patch
mm-vma-only-allow-mmap-to-clear-vma_maywrite_bit-if-kernel-owned.patch
mm-vma-add-and-use-vma__is_fixed_mapping.patch
scsi-sg-convert-mmap-hook-to-mmap_prepare-and-rework.patch
fbdev-defio-assert-fbinfo_virtfb-drop-vm_io-add-vm_mixedmap.patch
hsi-cmt_speech-convert-mmap-hook-to-mmap_prepare-refactor.patch
mm-gup-error-out-early-on-vma_mayread_bit-vmas.patch
uprobes-remove-vm_io-set-vm_mixedmap-for-mapped-kernel-pages.patch
mm-mlock-clear-vma_locked_mask-over-mmap-callback.patch
mm-mlock-eliminate-weird-vma_io_bit-abuse-and-simplify.patch
mm-vma-enforce-that-only-kernel-owned-mappings-may-set-vma_io_bit.patch
mm-remove-vma_io_bit-check-in-vma_is_kernel_owned.patch
mm-remove-hugetlb_inlineh.patch
mm-rename-is_vm_hugetlb_page-to-vma_is_hugetlb.patch
mm-drop-some-redundant-checks-around-hugetlb-vmas.patch
mm-madvise-update-is_valid_guard_vma-to-use-vma_can_merge.patch
mm-vma-introduce-vma_is_persistent.patch
mm-uffd-use-predicates-for-userfaultfd-checks.patch
mm-madvise-use-predicates-for-madvise-madv_dofork.patch
mm-eliminate-vma_special_flags-usage-when-hugetlb-explicitly-tested.patch
mm-eliminate-vma_special_flags-check-in-lru_gen_look_around.patch
mm-avoid-use-of-vma_special_flags-in-migrate_vma_setup.patch
mm-eliminate-vm_special-vma_special_flags.patch
fuse-dax-do-not-set-vm_mixedmap.patch
mm-huge_memory-remove-vma_is_special_huge.patch
mm-vma-introduce-and-use-vma_can_gup.patch
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2026-09-15 1:09 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-15 1:09 + scsi-sg-convert-mmap-hook-to-mmap_prepare-and-rework.patch added to mm-new branch Andrew Morton
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.