Message ID | 20240619115426.332708-5-hch@lst.de (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
Series | [1/6] xfs: move the dio write relocking out of xfs_ilock_for_iomap | expand |
On Wed, Jun 19, 2024 at 01:53:54PM +0200, Christoph Hellwig wrote: > Split the write fault and DAX fault handling into separate helpers > so that the main fault handler is easier to follow. > > Signed-off-by: Christoph Hellwig <hch@lst.de> > --- > fs/xfs/xfs_file.c | 71 ++++++++++++++++++++++++++++++----------------- > 1 file changed, 45 insertions(+), 26 deletions(-) > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 8aab2f66fe016f..51e50afd935895 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -1252,7 +1252,7 @@ xfs_file_llseek( > } > > static inline vm_fault_t > -xfs_dax_fault( > +xfs_dax_fault_locked( > struct vm_fault *vmf, > unsigned int order, > bool write_fault) > @@ -1273,6 +1273,45 @@ xfs_dax_fault( > return ret; > } > > +static vm_fault_t > +xfs_dax_fault( Oh, hey, you /did/ split the dax handling into two helpers. Would you mind renaming this xfs_dax_read_fault since this doesn't handle write faults? With that changed, Reviewed-by: Darrick J. Wong <djwong@kernel.org> --D > + struct vm_fault *vmf, > + unsigned int order) > +{ > + struct xfs_inode *ip = XFS_I(file_inode(vmf->vma->vm_file)); > + unsigned int lock_mode; > + vm_fault_t ret; > + > + lock_mode = xfs_ilock_for_write_fault(ip); > + ret = xfs_dax_fault_locked(vmf, order, false); > + xfs_iunlock(ip, lock_mode); > + > + return ret; > +} > + > +static vm_fault_t > +xfs_write_fault( > + struct vm_fault *vmf, > + unsigned int order) > +{ > + struct inode *inode = file_inode(vmf->vma->vm_file); > + unsigned int lock_mode; > + vm_fault_t ret; > + > + sb_start_pagefault(inode->i_sb); > + file_update_time(vmf->vma->vm_file); > + > + lock_mode = xfs_ilock_for_write_fault(XFS_I(inode)); > + if (IS_DAX(inode)) > + ret = xfs_dax_fault_locked(vmf, order, true); > + else > + ret = iomap_page_mkwrite(vmf, &xfs_page_mkwrite_iomap_ops); > + xfs_iunlock(XFS_I(inode), lock_mode); > + > + sb_end_pagefault(inode->i_sb); > + return ret; > +} > + > /* > * Locking for serialisation of IO during page faults. This results in a lock > * ordering of: > @@ -1290,34 +1329,14 @@ __xfs_filemap_fault( > bool write_fault) > { > struct inode *inode = file_inode(vmf->vma->vm_file); > - struct xfs_inode *ip = XFS_I(inode); > - vm_fault_t ret; > - unsigned int lock_mode = 0; > > - trace_xfs_filemap_fault(ip, order, write_fault); > - > - if (write_fault) { > - sb_start_pagefault(inode->i_sb); > - file_update_time(vmf->vma->vm_file); > - } > - > - if (IS_DAX(inode) || write_fault) > - lock_mode = xfs_ilock_for_write_fault(XFS_I(inode)); > - > - if (IS_DAX(inode)) { > - ret = xfs_dax_fault(vmf, order, write_fault); > - } else if (write_fault) { > - ret = iomap_page_mkwrite(vmf, &xfs_page_mkwrite_iomap_ops); > - } else { > - ret = filemap_fault(vmf); > - } > - > - if (lock_mode) > - xfs_iunlock(XFS_I(inode), lock_mode); > + trace_xfs_filemap_fault(XFS_I(inode), order, write_fault); > > if (write_fault) > - sb_end_pagefault(inode->i_sb); > - return ret; > + return xfs_write_fault(vmf, order); > + if (IS_DAX(inode)) > + return xfs_dax_fault(vmf, order); > + return filemap_fault(vmf); > } > > static inline bool > -- > 2.43.0 > >
On Thu, Jun 20, 2024 at 11:54:06AM -0700, Darrick J. Wong wrote: > Oh, hey, you /did/ split the dax handling into two helpers. > > Would you mind renaming this xfs_dax_read_fault since this doesn't > handle write faults? Sure.
diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 8aab2f66fe016f..51e50afd935895 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -1252,7 +1252,7 @@ xfs_file_llseek( } static inline vm_fault_t -xfs_dax_fault( +xfs_dax_fault_locked( struct vm_fault *vmf, unsigned int order, bool write_fault) @@ -1273,6 +1273,45 @@ xfs_dax_fault( return ret; } +static vm_fault_t +xfs_dax_fault( + struct vm_fault *vmf, + unsigned int order) +{ + struct xfs_inode *ip = XFS_I(file_inode(vmf->vma->vm_file)); + unsigned int lock_mode; + vm_fault_t ret; + + lock_mode = xfs_ilock_for_write_fault(ip); + ret = xfs_dax_fault_locked(vmf, order, false); + xfs_iunlock(ip, lock_mode); + + return ret; +} + +static vm_fault_t +xfs_write_fault( + struct vm_fault *vmf, + unsigned int order) +{ + struct inode *inode = file_inode(vmf->vma->vm_file); + unsigned int lock_mode; + vm_fault_t ret; + + sb_start_pagefault(inode->i_sb); + file_update_time(vmf->vma->vm_file); + + lock_mode = xfs_ilock_for_write_fault(XFS_I(inode)); + if (IS_DAX(inode)) + ret = xfs_dax_fault_locked(vmf, order, true); + else + ret = iomap_page_mkwrite(vmf, &xfs_page_mkwrite_iomap_ops); + xfs_iunlock(XFS_I(inode), lock_mode); + + sb_end_pagefault(inode->i_sb); + return ret; +} + /* * Locking for serialisation of IO during page faults. This results in a lock * ordering of: @@ -1290,34 +1329,14 @@ __xfs_filemap_fault( bool write_fault) { struct inode *inode = file_inode(vmf->vma->vm_file); - struct xfs_inode *ip = XFS_I(inode); - vm_fault_t ret; - unsigned int lock_mode = 0; - trace_xfs_filemap_fault(ip, order, write_fault); - - if (write_fault) { - sb_start_pagefault(inode->i_sb); - file_update_time(vmf->vma->vm_file); - } - - if (IS_DAX(inode) || write_fault) - lock_mode = xfs_ilock_for_write_fault(XFS_I(inode)); - - if (IS_DAX(inode)) { - ret = xfs_dax_fault(vmf, order, write_fault); - } else if (write_fault) { - ret = iomap_page_mkwrite(vmf, &xfs_page_mkwrite_iomap_ops); - } else { - ret = filemap_fault(vmf); - } - - if (lock_mode) - xfs_iunlock(XFS_I(inode), lock_mode); + trace_xfs_filemap_fault(XFS_I(inode), order, write_fault); if (write_fault) - sb_end_pagefault(inode->i_sb); - return ret; + return xfs_write_fault(vmf, order); + if (IS_DAX(inode)) + return xfs_dax_fault(vmf, order); + return filemap_fault(vmf); } static inline bool
Split the write fault and DAX fault handling into separate helpers so that the main fault handler is easier to follow. Signed-off-by: Christoph Hellwig <hch@lst.de> --- fs/xfs/xfs_file.c | 71 ++++++++++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 26 deletions(-)