From: "Darrick J. Wong" <djwong@kernel.org>
To: Shiyang Ruan <ruansy.fnst@fujitsu.com>
Cc: linux-kernel@vger.kernel.org, linux-xfs@vger.kernel.org,
linux-nvdimm@lists.01.org, linux-fsdevel@vger.kernel.org,
darrick.wong@oracle.com, dan.j.williams@intel.com,
willy@infradead.org, viro@zeniv.linux.org.uk,
david@fromorbit.com, hch@lst.de, rgoldwyn@suse.de, jack@suse.cz
Subject: Re: [PATCH v6 7/7] fs/xfs: Add dax dedupe support
Date: Tue, 25 May 2021 17:31:16 -0700 [thread overview]
Message-ID: <20210526003116.GU202121@locust> (raw)
In-Reply-To: <20210519060045.1051226-8-ruansy.fnst@fujitsu.com>
On Wed, May 19, 2021 at 02:00:45PM +0800, Shiyang Ruan wrote:
> Introduce xfs_mmaplock_two_inodes_and_break_dax_layout() for dax files
> who are going to be deduped. After that, call compare range function
> only when files are both DAX or not.
>
> Signed-off-by: Shiyang Ruan <ruansy.fnst@fujitsu.com>
> ---
> fs/xfs/xfs_file.c | 2 +-
> fs/xfs/xfs_inode.c | 57 ++++++++++++++++++++++++++++++++++++++++++++
> fs/xfs/xfs_inode.h | 1 +
> fs/xfs/xfs_reflink.c | 4 ++--
> 4 files changed, 61 insertions(+), 3 deletions(-)
>
> diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
> index 38d8eca05aee..bd5002d38df4 100644
> --- a/fs/xfs/xfs_file.c
> +++ b/fs/xfs/xfs_file.c
> @@ -823,7 +823,7 @@ xfs_wait_dax_page(
> xfs_ilock(ip, XFS_MMAPLOCK_EXCL);
> }
>
> -static int
> +int
> xfs_break_dax_layouts(
> struct inode *inode,
> bool *retry)
> diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
> index 0369eb22c1bb..d5e2791969ba 100644
> --- a/fs/xfs/xfs_inode.c
> +++ b/fs/xfs/xfs_inode.c
> @@ -3711,6 +3711,59 @@ xfs_iolock_two_inodes_and_break_layout(
> return 0;
> }
>
> +static int
> +xfs_mmaplock_two_inodes_and_break_dax_layout(
> + struct xfs_inode *ip1,
> + struct xfs_inode *ip2)
> +{
> + int error, attempts = 0;
> + bool retry;
> + struct page *page;
> + struct xfs_log_item *lp;
> +
> + if (ip1->i_ino > ip2->i_ino)
> + swap(ip1, ip2);
If Jan Kara [added to cc] succeeds in hoisting the MMAPLOCK to struct
address space then this is going to have to change to:
if (VFS_I(ip1)->i_mapping > VFS_I(ip2)->i_mapping)
swap(ip1, ip2);
For now this is ok.
> +
> +again:
> + retry = false;
> + /* Lock the first inode */
> + xfs_ilock(ip1, XFS_MMAPLOCK_EXCL);
> + error = xfs_break_dax_layouts(VFS_I(ip1), &retry);
> + if (error || retry) {
> + xfs_iunlock(ip1, XFS_MMAPLOCK_EXCL);
> + goto again;
> + }
> +
> + if (ip1 == ip2)
> + return 0;
> +
> + /* Nested lock the second inode */
> + lp = &ip1->i_itemp->ili_item;
> + if (lp && test_bit(XFS_LI_IN_AIL, &lp->li_flags)) {
> + if (!xfs_ilock_nowait(ip2,
> + xfs_lock_inumorder(XFS_MMAPLOCK_EXCL, 1))) {
> + xfs_iunlock(ip1, XFS_MMAPLOCK_EXCL);
> + if ((++attempts % 5) == 0)
> + delay(1); /* Don't just spin the CPU */
> + goto again;
> + }
> + } else
> + xfs_ilock(ip2, xfs_lock_inumorder(XFS_MMAPLOCK_EXCL, 1));
I wonder if this chunk is really necessary considering that the AIL
never touches the MMAPLOCK/i_mapping invalidation lock? I guess it
doesn't really hurt anything since that's what the code does now.
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
--D
> + /*
> + * We cannot use xfs_break_dax_layouts() directly here because it may
> + * need to unlock & lock the XFS_MMAPLOCK_EXCL which is not suitable
> + * for this nested lock case.
> + */
> + page = dax_layout_busy_page(VFS_I(ip2)->i_mapping);
> + if (page && page_ref_count(page) != 1) {
> + xfs_iunlock(ip2, XFS_MMAPLOCK_EXCL);
> + xfs_iunlock(ip1, XFS_MMAPLOCK_EXCL);
> + goto again;
> + }
> +
> + return 0;
> +}
> +
> /*
> * Lock two inodes so that userspace cannot initiate I/O via file syscalls or
> * mmap activity.
> @@ -3725,6 +3778,10 @@ xfs_ilock2_io_mmap(
> ret = xfs_iolock_two_inodes_and_break_layout(VFS_I(ip1), VFS_I(ip2));
> if (ret)
> return ret;
> +
> + if (IS_DAX(VFS_I(ip1)) && IS_DAX(VFS_I(ip2)))
> + return xfs_mmaplock_two_inodes_and_break_dax_layout(ip1, ip2);
> +
> if (ip1 == ip2)
> xfs_ilock(ip1, XFS_MMAPLOCK_EXCL);
> else
> diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h
> index ca826cfba91c..2d0b344fb100 100644
> --- a/fs/xfs/xfs_inode.h
> +++ b/fs/xfs/xfs_inode.h
> @@ -457,6 +457,7 @@ enum xfs_prealloc_flags {
>
> int xfs_update_prealloc_flags(struct xfs_inode *ip,
> enum xfs_prealloc_flags flags);
> +int xfs_break_dax_layouts(struct inode *inode, bool *retry);
> int xfs_break_layouts(struct inode *inode, uint *iolock,
> enum layout_break_reason reason);
>
> diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c
> index 9a780948dbd0..ff308304c5cd 100644
> --- a/fs/xfs/xfs_reflink.c
> +++ b/fs/xfs/xfs_reflink.c
> @@ -1324,8 +1324,8 @@ xfs_reflink_remap_prep(
> if (XFS_IS_REALTIME_INODE(src) || XFS_IS_REALTIME_INODE(dest))
> goto out_unlock;
>
> - /* Don't share DAX file data for now. */
> - if (IS_DAX(inode_in) || IS_DAX(inode_out))
> + /* Don't share DAX file data with non-DAX file. */
> + if (IS_DAX(inode_in) != IS_DAX(inode_out))
> goto out_unlock;
>
> if (!IS_DAX(inode_in))
> --
> 2.31.1
>
>
>
next prev parent reply other threads:[~2021-05-26 0:31 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-19 6:00 [PATCH v6 0/7] fsdax,xfs: Add reflink&dedupe support for fsdax Shiyang Ruan
2021-05-19 6:00 ` Shiyang Ruan
2021-05-19 6:00 ` [PATCH v6 1/7] fsdax: Introduce dax_iomap_cow_copy() Shiyang Ruan
2021-05-19 6:00 ` Shiyang Ruan
2021-05-19 6:00 ` [PATCH v6 2/7] fsdax: Replace mmap entry in case of CoW Shiyang Ruan
2021-05-19 6:00 ` Shiyang Ruan
2021-05-19 6:00 ` [PATCH v6 3/7] fsdax: Add dax_iomap_cow_copy() for dax_iomap_zero Shiyang Ruan
2021-05-19 6:00 ` Shiyang Ruan
2021-05-25 22:17 ` Darrick J. Wong
2021-05-19 6:00 ` [PATCH v6 4/7] iomap: Introduce iomap_apply2() for operations on two files Shiyang Ruan
2021-05-19 6:00 ` Shiyang Ruan
2021-05-19 6:00 ` [PATCH v6 5/7] fsdax: Dedup file range to use a compare function Shiyang Ruan
2021-05-19 6:00 ` Shiyang Ruan
2021-05-25 23:29 ` Darrick J. Wong
2021-05-19 6:00 ` [PATCH v6 6/7] fs/xfs: Handle CoW for fsdax write() path Shiyang Ruan
2021-05-19 6:00 ` Shiyang Ruan
2021-05-26 0:21 ` Darrick J. Wong
2021-06-09 2:28 ` ruansy.fnst
2021-06-15 7:21 ` [PATCH v6.1 " Shiyang Ruan
2021-06-24 8:49 ` ruansy.fnst
2021-06-25 22:18 ` Darrick J. Wong
2021-06-28 2:55 ` ruansy.fnst
2021-06-28 5:09 ` Darrick J. Wong
2021-06-29 11:25 ` ruansy.fnst
2021-06-29 21:01 ` Darrick J. Wong
2021-07-08 23:16 ` Dave Chinner
2021-07-09 12:36 ` [PATCH v6.2 6/7] dax: Introduce dax_iomap_ops for end of reflink Shiyang Ruan
2021-05-19 6:00 ` [PATCH v6 7/7] fs/xfs: Add dax dedupe support Shiyang Ruan
2021-05-19 6:00 ` Shiyang Ruan
2021-05-26 0:31 ` Darrick J. Wong [this message]
2021-05-26 0:51 ` [PATCH v6 0/7] fsdax,xfs: Add reflink&dedupe support for fsdax Darrick J. Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210526003116.GU202121@locust \
--to=djwong@kernel.org \
--cc=dan.j.williams@intel.com \
--cc=darrick.wong@oracle.com \
--cc=david@fromorbit.com \
--cc=hch@lst.de \
--cc=jack@suse.cz \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nvdimm@lists.01.org \
--cc=linux-xfs@vger.kernel.org \
--cc=rgoldwyn@suse.de \
--cc=ruansy.fnst@fujitsu.com \
--cc=viro@zeniv.linux.org.uk \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.