Re: [PATCH v2] fix mmap return value when vma is merged after call_mmap()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Dec 04, 2020 at 11:10:28AM -0400, Jason Gunthorpe wrote:
> On Fri, Dec 04, 2020 at 03:11:54PM +0100, David Hildenbrand wrote:
> > On 03.12.20 09:53, Liu Zixian wrote:
> > > On success, mmap should return the begin address of newly mapped area,
> > > but patch "mm: mmap: merge vma after call_mmap() if possible"
> > > set vm_start of newly merged vma to return value addr.
> > > Users of mmap will get wrong address if vma is merged after call_mmap().
> > > We fix this by moving the assignment to addr before merging vma.
> > > 
> > > Fixes: d70cec898324 ("mm: mmap: merge vma after call_mmap() if possible")
> > > Signed-off-by: Liu Zixian <liuzixian4@xxxxxxxxxx>
> > > v2:
> > > We want to do "addr = vma->vm_start;" unconditionally,
> > > so move assignment to addr before if(unlikely) block.
> > >  mm/mmap.c | 26 ++++++++++++--------------
> > >  1 file changed, 12 insertions(+), 14 deletions(-)
> > > 
> > > diff --git a/mm/mmap.c b/mm/mmap.c
> > > index d91ecb00d38c..5c8b4485860d 100644
> > > +++ b/mm/mmap.c
> > > @@ -1808,6 +1808,17 @@ unsigned long mmap_region(struct file *file, unsigned long addr,
> > >  		if (error)
> > >  			goto unmap_and_free_vma;
> > >  
> > > +		/* Can addr have changed??
> > > +		 *
> > > +		 * Answer: Yes, several device drivers can do it in their
> > > +		 *         f_op->mmap method. -DaveM
> > > +		 * Bug: If addr is changed, prev, rb_link, rb_parent should
> > > +		 *      be updated for vma_link()
> > > +		 */
> > 
> > 
> > Why do we tolerate device drivers doing such stuff at all?
> > WARN_ON_ONCE() is just as good as BUG_ON() in many environments. If we
> > support it, then no warning. If we don't support it, then why tolerate it?
> 
> The commit that introduced this seemed pretty clear it is to catch
> possibly wrong drivers. I suppose the idea was to give a migration
> time where things would "work" and drivers could be fixed. Since it
> has now been 8 years it should be either dropped or turned into:
> 
>  /* Drivers are not permitted to change vm_start */
>  if (WARN_ON(addr != vma->vm_start)) {
>      err = EINVAL
>      goto unmap_and_free_vma
>  }

This commit makes no sense.  I know it's eight years old, so maybe the
device driver which did this has long been removed from the tree, but
davem's comment was (iirc) related to a device driver for a graphics
card that would 256MB-align the user address.  Another possibility is
that userspace always asks for a 256MB-aligned address these days.

I don't understand why prev/rb_link/rb_parent would need to be changed
in this case.  It's going to be inserted at the exact same location in
the rbtree, just at a slightly shifted address.



[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux