Thread (49 messages) 49 messages, 9 authors, 2017-10-15

Re: [PATCH v7 06/12] xfs: wire up MAP_DIRECT

From: Dave Chinner <david@fromorbit.com>
Date: 2017-10-09 22:50:25
Also in: linux-api, linux-fsdevel, linux-rdma, linux-xfs, nvdimm

On Mon, Oct 09, 2017 at 10:08:40AM -0700, Dan Williams wrote:
On Sun, Oct 8, 2017 at 8:40 PM, Dave Chinner [off-list ref] wrote:
quoted
quoted
 /*
  * Clear the specified ranges to zero through either the pagecache or DAX.
@@ -1008,6 +1018,26 @@ xfs_file_llseek(
      return vfs_setpos(file, offset, inode->i_sb->s_maxbytes);
 }

+static int
+xfs_vma_checks(
+     struct vm_area_struct   *vma,
+     struct inode            *inode)
Exactly what are we checking for - function name doesn't tell me,
and there's no comments, either?
Ok, I'll improve this.
quoted
quoted
+{
+     if (!is_xfs_map_direct(vma))
+             return 0;
+
+     if (!is_map_direct_valid(vma->vm_private_data))
+             return VM_FAULT_SIGBUS;
+
+     if (xfs_is_reflink_inode(XFS_I(inode)))
+             return VM_FAULT_SIGBUS;
+
+     if (!IS_DAX(inode))
+             return VM_FAULT_SIGBUS;
And how do we get is_xfs_map_direct() set to true if we don't have a
DAX inode or the inode has shared extents?
So, this was my way of trying to satisfy the request you made here:

    https://lkml.org/lkml/2017/8/11/876

i.e. allow MAP_DIRECT on non-dax files to enable a use case of
freezing the block-map to examine which file extents are linked. If
you don't want to use MAP_DIRECT for this, we can move these checks to
mmap time.
Ok, but I don't want to use mmap to deal with this, nor do I care
whether DAX is in use or not. So I don't think this is really
necessary for MAP_DIRECT.

quoted
quoted
+xfs_file_mmap_validate(
+     struct file             *filp,
+     struct vm_area_struct   *vma,
+     unsigned long           map_flags,
+     int                     fd)
+{
+     struct inode            *inode = file_inode(filp);
+     struct xfs_inode        *ip = XFS_I(inode);
+     struct map_direct_state *mds;
+
+     if (map_flags & ~(XFS_MAP_SUPPORTED))
+             return -EOPNOTSUPP;
+
+     if ((map_flags & MAP_DIRECT) == 0)
+             return xfs_file_mmap(filp, vma);
+
+     file_accessed(filp);
+     vma->vm_ops = &xfs_file_vm_direct_ops;
+     if (IS_DAX(inode))
+             vma->vm_flags |= VM_MIXEDMAP | VM_HUGEPAGE;
And if it isn't a DAX inode? what is MAP_DIRECT supposed to do then?
In the non-DAX case it just takes the FL_LAYOUT file lease... although
we could also just have an fcntl for that purpose. The use case of
just freezing the block map does not need a mapping.
RIght, so I think we should just add a fcntl for the non-DAX case I
have in mind, and not complicate the MAP_DIRECT implementation right
now.  We can alsways extend the scope of MAP_DIRECT in future if we
actually need to do so.
quoted
quoted
+     mds = map_direct_register(fd, vma);
+     if (IS_ERR(mds))
+             return PTR_ERR(mds);
+
+     /* flush in-flight faults */
+     xfs_ilock(ip, XFS_MMAPLOCK_EXCL);
+     xfs_iunlock(ip, XFS_MMAPLOCK_EXCL);
Urk. That's nasty. And why is it even necessary? Please explain why
this is necessary in the comment, because it's not at all obvious to
me...
This is related to your other observation about i_mapdcount and adding
an iomap_can_allocate() helper. I think I can clean both of these up
by using a call to break_layout(inode, false) and bailing in
->iomap_begin() if it returns EWOULDBLOCK. This would also fix the
current problem that allocating write-faults don't start the lease
break process.
OK.

Cheers,

Dave.
-- 
Dave Chinner
david@fromorbit.com

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help