Re: [PATCH v2 1/1] mm: move ->mremap() from file_operations to vm_operations_struct

From: Kirill A. Shutemov
Date: Thu Jun 25 2015 - 18:09:09 EST


On Thu, Jun 25, 2015 at 10:45:04PM +0200, Oleg Nesterov wrote:
> vma->vm_ops->mremap() looks more natural and clean in move_vma(),
> and this way ->mremap() can have more users. Say, vdso.
>
> While at it, s/aio_ring_remap/aio_ring_mremap/.
>
> Signed-off-by: Oleg Nesterov <oleg@xxxxxxxxxx>
> ---
> fs/aio.c | 25 ++++++++++++++++---------
> include/linux/fs.h | 1 -
> include/linux/mm.h | 1 +
> mm/mremap.c | 4 ++--
> 4 files changed, 19 insertions(+), 12 deletions(-)
>
> diff --git a/fs/aio.c b/fs/aio.c
> index 9bc1335..a632f14 100644
> --- a/fs/aio.c
> +++ b/fs/aio.c
> @@ -308,15 +308,9 @@ static void aio_free_ring(struct kioctx *ctx)
> }
> }
>
> -static int aio_ring_mmap(struct file *file, struct vm_area_struct *vma)
> -{
> - vma->vm_flags |= VM_DONTEXPAND;
> - vma->vm_ops = &generic_file_vm_ops;
> - return 0;
> -}
> -
> -static int aio_ring_remap(struct file *file, struct vm_area_struct *vma)
> +static int aio_ring_mremap(struct vm_area_struct *vma)
> {
> + struct file *file = vma->vm_file;
> struct mm_struct *mm = vma->vm_mm;
> struct kioctx_table *table;
> int i, res = -EINVAL;
> @@ -339,9 +333,22 @@ static int aio_ring_remap(struct file *file, struct vm_area_struct *vma)
> return res;
> }
>
> +static const struct vm_operations_struct aio_ring_vm_ops = {
> + .mremap = aio_ring_mremap,
> + .fault = filemap_fault,
> + .map_pages = filemap_map_pages,
> + .page_mkwrite = filemap_page_mkwrite,
> +};
> +
> +static int aio_ring_mmap(struct file *file, struct vm_area_struct *vma)
> +{
> + vma->vm_flags |= VM_DONTEXPAND;
> + vma->vm_ops = &aio_ring_vm_ops;
> + return 0;
> +}
> +
> static const struct file_operations aio_ring_fops = {
> .mmap = aio_ring_mmap,
> - .mremap = aio_ring_remap,
> };
>
> #if IS_ENABLED(CONFIG_MIGRATION)
> diff --git a/include/linux/fs.h b/include/linux/fs.h
> index 35ec87e..42aac09 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -1582,7 +1582,6 @@ struct file_operations {
> long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
> long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
> int (*mmap) (struct file *, struct vm_area_struct *);
> - int (*mremap)(struct file *, struct vm_area_struct *);
> int (*open) (struct inode *, struct file *);
> int (*flush) (struct file *, fl_owner_t id);
> int (*release) (struct inode *, struct file *);
> diff --git a/include/linux/mm.h b/include/linux/mm.h
> index a0fe3d3..0295b4a 100644
> --- a/include/linux/mm.h
> +++ b/include/linux/mm.h
> @@ -244,6 +244,7 @@ struct vm_fault {
> struct vm_operations_struct {
> void (*open)(struct vm_area_struct * area);
> void (*close)(struct vm_area_struct * area);
> + int (*mremap)(struct vm_area_struct * area);
> int (*fault)(struct vm_area_struct *vma, struct vm_fault *vmf);
> void (*map_pages)(struct vm_area_struct *vma, struct vm_fault *vmf);
>
> diff --git a/mm/mremap.c b/mm/mremap.c
> index ed1b13a..aeba807 100644
> --- a/mm/mremap.c
> +++ b/mm/mremap.c
> @@ -276,8 +276,8 @@ static unsigned long move_vma(struct vm_area_struct *vma,
> need_rmap_locks);
> if (moved_len < old_len) {
> err = -ENOMEM;
> - } else if (vma->vm_file && vma->vm_file->f_op->mremap) {
> - err = vma->vm_file->f_op->mremap(vma->vm_file, new_vma);
> + } else if (vma->vm_ops && vma->vm_ops->mremap) {
> + err = vma->vm_ops->mremap(new_vma);
> }
>
> if (unlikely(err)) {

I'm not sure what is target tree for the patch. Last hunk is not going to
apply on Linus' tree or -next. Hm?

Otherwise, looks good.

Acked-by: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx>

--
Kirill A. Shutemov
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/