Messages in this thread | | | Date | Fri, 26 Jun 2015 01:08:29 +0300 | From | "Kirill A. Shutemov" <> | Subject | Re: [PATCH v2 1/1] mm: move ->mremap() from file_operations to vm_operations_struct |
| |
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@redhat.com> > --- > 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@linux.intel.com>
-- Kirill A. Shutemov
| |