* Lorenzo Stoakes <lorenzo.stoakes@xxxxxxxxxx> [250509 08:14]: > Secretmem has a simple .mmap() hook which is easily converted to the new > .mmap_prepare() callback. > > Importantly, it's a rare instance of an driver that manipulates a VMA which > is mergeable (that is, not a VM_SPECIAL mapping) while also adjusting VMA > flags which may adjust mergeability, meaning the retry merge logic might > impact whether or not the VMA is merged. > > By using .mmap_prepare() there's no longer any need to retry the merge > later as we can simply set the correct flags from the start. > > This change therefore allows us to remove the retry merge logic in a > subsequent commit. > > Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@xxxxxxxxxx> > Acked-by: Mike Rapoport (Microsoft) <rppt@xxxxxxxxxx> > Reviewed-by: David Hildenbrand <david@xxxxxxxxxx> Reviewed-by: Liam R. Howlett <Liam.Howlett@xxxxxxxxxx> > --- > mm/secretmem.c | 14 +++++++------- > 1 file changed, 7 insertions(+), 7 deletions(-) > > diff --git a/mm/secretmem.c b/mm/secretmem.c > index 1b0a214ee558..589b26c2d553 100644 > --- a/mm/secretmem.c > +++ b/mm/secretmem.c > @@ -120,18 +120,18 @@ static int secretmem_release(struct inode *inode, struct file *file) > return 0; > } > > -static int secretmem_mmap(struct file *file, struct vm_area_struct *vma) > +static int secretmem_mmap_prepare(struct vm_area_desc *desc) > { > - unsigned long len = vma->vm_end - vma->vm_start; > + const unsigned long len = desc->end - desc->start; > > - if ((vma->vm_flags & (VM_SHARED | VM_MAYSHARE)) == 0) > + if ((desc->vm_flags & (VM_SHARED | VM_MAYSHARE)) == 0) > return -EINVAL; > > - if (!mlock_future_ok(vma->vm_mm, vma->vm_flags | VM_LOCKED, len)) > + if (!mlock_future_ok(desc->mm, desc->vm_flags | VM_LOCKED, len)) > return -EAGAIN; > > - vm_flags_set(vma, VM_LOCKED | VM_DONTDUMP); > - vma->vm_ops = &secretmem_vm_ops; > + desc->vm_flags |= VM_LOCKED | VM_DONTDUMP; > + desc->vm_ops = &secretmem_vm_ops; > > return 0; > } > @@ -143,7 +143,7 @@ bool vma_is_secretmem(struct vm_area_struct *vma) > > static const struct file_operations secretmem_fops = { > .release = secretmem_release, > - .mmap = secretmem_mmap, > + .mmap_prepare = secretmem_mmap_prepare, > }; > > static int secretmem_migrate_folio(struct address_space *mapping, > -- > 2.49.0 >