Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mm: add shmem_zero_setup_desc()

Add the ability to set up a shared anonymous mapping based on a VMA
descriptor rather than a VMA.

This is a prerequisite for converting to the char mm driver to use the
mmap_prepare hook.

Link: https://lkml.kernel.org/r/d9181517a7e3d6b014a5697c6990d3722c2c9fcd.1760959442.git.lorenzo.stoakes@oracle.com
Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Cc: Alexander Gordeev <agordeev@linux.ibm.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Andreas Larsson <andreas@gaisler.com>
Cc: Andrey Konovalov <andreyknvl@gmail.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Baolin Wang <baolin.wang@linux.alibaba.com>
Cc: Baoquan He <bhe@redhat.com>
Cc: Chatre, Reinette <reinette.chatre@intel.com>
Cc: Christian Borntraeger <borntraeger@linux.ibm.com>
Cc: Christian Brauner <brauner@kernel.org>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Dave Jiang <dave.jiang@intel.com>
Cc: Dave Martin <dave.martin@arm.com>
Cc: Dave Young <dyoung@redhat.com>
Cc: David Hildenbrand <david@redhat.com>
Cc: David S. Miller <davem@davemloft.net>
Cc: Dmitriy Vyukov <dvyukov@google.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Guo Ren <guoren@kernel.org>
Cc: Heiko Carstens <hca@linux.ibm.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: James Morse <james.morse@arm.com>
Cc: Jan Kara <jack@suse.cz>
Cc: Jann Horn <jannh@google.com>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Kevin Tian <kevin.tian@intel.com>
Cc: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
Cc: Liam Howlett <liam.howlett@oracle.com>
Cc: "Luck, Tony" <tony.luck@intel.com>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Mike Rapoport <rppt@kernel.org>
Cc: Muchun Song <muchun.song@linux.dev>
Cc: Nicolas Pitre <nico@fluxnic.net>
Cc: Oscar Salvador <osalvador@suse.de>
Cc: Pedro Falcato <pfalcato@suse.de>
Cc: Robin Murohy <robin.murphy@arm.com>
Cc: Sumanth Korikkar <sumanthk@linux.ibm.com>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Sven Schnelle <svens@linux.ibm.com>
Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
Cc: "Uladzislau Rezki (Sony)" <urezki@gmail.com>
Cc: Vasily Gorbik <gor@linux.ibm.com>
Cc: Vishal Verma <vishal.l.verma@intel.com>
Cc: Vivek Goyal <vgoyal@redhat.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Will Deacon <will@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

Lorenzo Stoakes and committed by
Andrew Morton
89646d9c ea52cb24

+35 -9
+2 -1
include/linux/shmem_fs.h
··· 94 94 unsigned long flags); 95 95 extern struct file *shmem_file_setup_with_mnt(struct vfsmount *mnt, 96 96 const char *name, loff_t size, unsigned long flags); 97 - extern int shmem_zero_setup(struct vm_area_struct *); 97 + int shmem_zero_setup(struct vm_area_struct *vma); 98 + int shmem_zero_setup_desc(struct vm_area_desc *desc); 98 99 extern unsigned long shmem_get_unmapped_area(struct file *, unsigned long addr, 99 100 unsigned long len, unsigned long pgoff, unsigned long flags); 100 101 extern int shmem_lock(struct file *file, int lock, struct ucounts *ucounts);
+33 -8
mm/shmem.c
··· 5880 5880 } 5881 5881 EXPORT_SYMBOL_GPL(shmem_file_setup_with_mnt); 5882 5882 5883 - /** 5884 - * shmem_zero_setup - setup a shared anonymous mapping 5885 - * @vma: the vma to be mmapped is prepared by do_mmap 5886 - */ 5887 - int shmem_zero_setup(struct vm_area_struct *vma) 5883 + static struct file *__shmem_zero_setup(unsigned long start, unsigned long end, vm_flags_t vm_flags) 5888 5884 { 5889 - struct file *file; 5890 - loff_t size = vma->vm_end - vma->vm_start; 5885 + loff_t size = end - start; 5891 5886 5892 5887 /* 5893 5888 * Cloning a new file under mmap_lock leads to a lock ordering conflict ··· 5890 5895 * accessible to the user through its mapping, use S_PRIVATE flag to 5891 5896 * bypass file security, in the same way as shmem_kernel_file_setup(). 5892 5897 */ 5893 - file = shmem_kernel_file_setup("dev/zero", size, vma->vm_flags); 5898 + return shmem_kernel_file_setup("dev/zero", size, vm_flags); 5899 + } 5900 + 5901 + /** 5902 + * shmem_zero_setup - setup a shared anonymous mapping 5903 + * @vma: the vma to be mmapped is prepared by do_mmap 5904 + * Returns: 0 on success, or error 5905 + */ 5906 + int shmem_zero_setup(struct vm_area_struct *vma) 5907 + { 5908 + struct file *file = __shmem_zero_setup(vma->vm_start, vma->vm_end, vma->vm_flags); 5909 + 5894 5910 if (IS_ERR(file)) 5895 5911 return PTR_ERR(file); 5896 5912 ··· 5909 5903 fput(vma->vm_file); 5910 5904 vma->vm_file = file; 5911 5905 vma->vm_ops = &shmem_anon_vm_ops; 5906 + 5907 + return 0; 5908 + } 5909 + 5910 + /** 5911 + * shmem_zero_setup_desc - same as shmem_zero_setup, but determined by VMA 5912 + * descriptor for convenience. 5913 + * @desc: Describes VMA 5914 + * Returns: 0 on success, or error 5915 + */ 5916 + int shmem_zero_setup_desc(struct vm_area_desc *desc) 5917 + { 5918 + struct file *file = __shmem_zero_setup(desc->start, desc->end, desc->vm_flags); 5919 + 5920 + if (IS_ERR(file)) 5921 + return PTR_ERR(file); 5922 + 5923 + desc->vm_file = file; 5924 + desc->vm_ops = &shmem_anon_vm_ops; 5912 5925 5913 5926 return 0; 5914 5927 }