All of lore.kernel.org
 help / color / mirror / Atom feed
From: Shiyang Ruan <ruansy.fnst@fujitsu.com>
To: "Darrick J. Wong" <djwong@kernel.org>
Cc: <hch@lst.de>, <linux-xfs@vger.kernel.org>,
	<dan.j.williams@intel.com>, <david@fromorbit.com>,
	<linux-fsdevel@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<nvdimm@lists.linux.dev>, <rgoldwyn@suse.de>,
	<viro@zeniv.linux.org.uk>, <willy@infradead.org>
Subject: Re: [PATCH v9 8/8] xfs: Add dax dedupe support
Date: Thu, 16 Sep 2021 12:01:18 +0800	[thread overview]
Message-ID: <38eeee6f-aa11-4c13-b7c0-2e48927b85dc@fujitsu.com> (raw)
In-Reply-To: <20210916003008.GE34830@magnolia>



On 2021/9/16 8:30, Darrick J. Wong wrote:
> On Wed, Sep 15, 2021 at 06:45:01PM +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>
>> Reviewed-by: Darrick J. Wong <djwong@kernel.org>
>> Reviewed-by: Christoph Hellwig <hch@lst.de>
>> ---
>>   fs/xfs/xfs_file.c    |  2 +-
>>   fs/xfs/xfs_inode.c   | 80 +++++++++++++++++++++++++++++++++++++++++---
>>   fs/xfs/xfs_inode.h   |  1 +
>>   fs/xfs/xfs_reflink.c |  4 +--
>>   4 files changed, 80 insertions(+), 7 deletions(-)
>>
>> diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
>> index 2ef1930374d2..c3061723613c 100644
>> --- a/fs/xfs/xfs_file.c
>> +++ b/fs/xfs/xfs_file.c
>> @@ -846,7 +846,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 a4f6f034fb81..bdc084cdbf46 100644
>> --- a/fs/xfs/xfs_inode.c
>> +++ b/fs/xfs/xfs_inode.c
>> @@ -3790,6 +3790,61 @@ 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);
>> +
>> +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);
>> +		if (error == 0 && retry)
>> +			goto again;
>> +		return error;
>> +	}
>> +
>> +	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;
>> +		}
> 
> I suspect we don't need this part for grabbing the MMAPLOCK^W pagecache
> invalidatelock.  The AIL only grabs the ILOCK, never the IOLOCK or the
> MMAPLOCK.

Maybe I have misunderstood this part.

What I want is to lock the two inode nestedly.  This code is copied from 
xfs_lock_two_inodes(), which checks this AIL during locking two inode 
with each of the three kinds of locks.

But I also found the recent merged function: 
filemap_invalidate_lock_two() just locks two inode directly without 
checking AIL.  So, I am not if the AIL check is needed in this case.

> 
>> +	} else
>> +		xfs_ilock(ip2, xfs_lock_inumorder(XFS_MMAPLOCK_EXCL, 1));
>> +	/*
>> +	 * 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) {
> 
> Do you think the patch "ext4/xfs: add page refcount helper" would be a
> good cleanup to head this series?
> 
> https://lore.kernel.org/linux-xfs/20210913161604.31981-1-alex.sierra@amd.com/T/#m59cf7cd5c0d521ad487fa3a15d31c3865db88bdf

Got it.


--
Thanks,
Ruan

> 
> The rest of the logic looks ok.
> 
> --D
> 
>> +		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.
>> @@ -3804,8 +3859,19 @@ xfs_ilock2_io_mmap(
>>   	ret = xfs_iolock_two_inodes_and_break_layout(VFS_I(ip1), VFS_I(ip2));
>>   	if (ret)
>>   		return ret;
>> -	filemap_invalidate_lock_two(VFS_I(ip1)->i_mapping,
>> -				    VFS_I(ip2)->i_mapping);
>> +
>> +	if (IS_DAX(VFS_I(ip1)) && IS_DAX(VFS_I(ip2))) {
>> +		ret = xfs_mmaplock_two_inodes_and_break_dax_layout(ip1, ip2);
>> +		if (ret) {
>> +			inode_unlock(VFS_I(ip2));
>> +			if (ip1 != ip2)
>> +				inode_unlock(VFS_I(ip1));
>> +			return ret;
>> +		}
>> +	} else
>> +		filemap_invalidate_lock_two(VFS_I(ip1)->i_mapping,
>> +					    VFS_I(ip2)->i_mapping);
>> +
>>   	return 0;
>>   }
>>   
>> @@ -3815,8 +3881,14 @@ xfs_iunlock2_io_mmap(
>>   	struct xfs_inode	*ip1,
>>   	struct xfs_inode	*ip2)
>>   {
>> -	filemap_invalidate_unlock_two(VFS_I(ip1)->i_mapping,
>> -				      VFS_I(ip2)->i_mapping);
>> +	if (IS_DAX(VFS_I(ip1)) && IS_DAX(VFS_I(ip2))) {
>> +		xfs_iunlock(ip2, XFS_MMAPLOCK_EXCL);
>> +		if (ip1 != ip2)
>> +			xfs_iunlock(ip1, XFS_MMAPLOCK_EXCL);
>> +	} else
>> +		filemap_invalidate_unlock_two(VFS_I(ip1)->i_mapping,
>> +					      VFS_I(ip2)->i_mapping);
>> +
>>   	inode_unlock(VFS_I(ip2));
>>   	if (ip1 != ip2)
>>   		inode_unlock(VFS_I(ip1));
>> diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h
>> index b21b177832d1..f7e26fe31a26 100644
>> --- a/fs/xfs/xfs_inode.h
>> +++ b/fs/xfs/xfs_inode.h
>> @@ -472,6 +472,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 9d876e268734..3b99c9dfcf0d 100644
>> --- a/fs/xfs/xfs_reflink.c
>> +++ b/fs/xfs/xfs_reflink.c
>> @@ -1327,8 +1327,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.33.0
>>
>>
>>



  reply	other threads:[~2021-09-16  4:01 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-15 10:44 [PATCH v9 0/8] fsdax,xfs: Add reflink&dedupe support for fsdax Shiyang Ruan
2021-09-15 10:44 ` [PATCH v9 1/8] fsdax: Output address in dax_iomap_pfn() and rename it Shiyang Ruan
2021-09-16  0:09   ` Darrick J. Wong
2021-09-16  1:36     ` Shiyang Ruan
2021-09-15 10:44 ` [PATCH v9 2/8] fsdax: Introduce dax_iomap_cow_copy() Shiyang Ruan
2021-09-15 10:44 ` [PATCH v9 3/8] fsdax: Replace mmap entry in case of CoW Shiyang Ruan
2021-09-16 14:51   ` kernel test robot
2021-09-16 14:51     ` kernel test robot
2021-09-15 10:44 ` [PATCH v9 4/8] fsdax: Convert dax_iomap_zero to iter model Shiyang Ruan
2021-09-16  0:11   ` Darrick J. Wong
2021-09-16  6:15   ` Christoph Hellwig
2021-09-15 10:44 ` [PATCH v9 5/8] fsdax: Add dax_iomap_cow_copy() for dax_iomap_zero Shiyang Ruan
2021-09-16  6:16   ` Christoph Hellwig
2021-09-16  8:49     ` Shiyang Ruan
2021-09-16 22:55       ` Darrick J. Wong
2021-09-15 10:44 ` [PATCH v9 6/8] fsdax: Dedup file range to use a compare function Shiyang Ruan
2021-09-16  6:17   ` Christoph Hellwig
2021-09-15 10:45 ` [PATCH v9 7/8] xfs: support CoW in fsdax mode Shiyang Ruan
2021-09-16  0:22   ` Darrick J. Wong
2021-09-16  6:32     ` Christoph Hellwig
2021-09-17 15:33       ` Darrick J. Wong
2021-09-21  8:14         ` Christoph Hellwig
2021-09-16  6:23   ` Christoph Hellwig
2021-09-16  8:51     ` Shiyang Ruan
2021-09-15 10:45 ` [PATCH v9 8/8] xfs: Add dax dedupe support Shiyang Ruan
2021-09-16  0:30   ` Darrick J. Wong
2021-09-16  4:01     ` Shiyang Ruan [this message]
2021-09-16  4:18       ` 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=38eeee6f-aa11-4c13-b7c0-2e48927b85dc@fujitsu.com \
    --to=ruansy.fnst@fujitsu.com \
    --cc=dan.j.williams@intel.com \
    --cc=david@fromorbit.com \
    --cc=djwong@kernel.org \
    --cc=hch@lst.de \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-xfs@vger.kernel.org \
    --cc=nvdimm@lists.linux.dev \
    --cc=rgoldwyn@suse.de \
    --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.