public inbox for linux-xfs@vger.kernel.org
 help / color / mirror / Atom feed
From: Dave Chinner <david@fromorbit.com>
To: "Darrick J. Wong" <djwong@kernel.org>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH 4/4] xfs: speed up write operations by using non-overlapped lookups when possible
Date: Sat, 23 Apr 2022 07:46:44 +1000	[thread overview]
Message-ID: <20220422214644.GX1544202@dread.disaster.area> (raw)
In-Reply-To: <164997686196.383709.14448633533668211390.stgit@magnolia>

On Thu, Apr 14, 2022 at 03:54:22PM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <djwong@kernel.org>
> 
> Reverse mapping on a reflink-capable filesystem has some pretty high
> overhead when performing file operations.  This is because the rmap
> records for logically and physically adjacent extents might not be
> adjacent in the rmap index due to data block sharing.  As a result, we
> use expensive overlapped-interval btree search, which walks every record
> that overlaps with the supplied key in the hopes of finding the record.
> 
> However, profiling data shows that when the index contains a record that
> is an exact match for a query key, the non-overlapped btree search
> function can find the record much faster than the overlapped version.
> Try the non-overlapped lookup first when we're trying to find the left
> neighbor rmap record for a given file mapping, which makes unwritten
> extent conversion and remap operations run faster if data block sharing
> is minimal in this part of the filesystem.
> 
> Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> ---
>  fs/xfs/libxfs/xfs_rmap.c |   35 ++++++++++++++++++++++++++++++-----
>  fs/xfs/libxfs/xfs_rmap.h |    3 ---
>  2 files changed, 30 insertions(+), 8 deletions(-)
> 
> 
> diff --git a/fs/xfs/libxfs/xfs_rmap.c b/fs/xfs/libxfs/xfs_rmap.c
> index 5aa94deb3afd..bd394138df9e 100644
> --- a/fs/xfs/libxfs/xfs_rmap.c
> +++ b/fs/xfs/libxfs/xfs_rmap.c
> @@ -299,7 +299,7 @@ xfs_rmap_find_left_neighbor_helper(
>   * return a match with the same owner and adjacent physical and logical
>   * block ranges.
>   */
> -int
> +STATIC int
>  xfs_rmap_find_left_neighbor(
>  	struct xfs_btree_cur	*cur,
>  	xfs_agblock_t		bno,
> @@ -332,10 +332,35 @@ xfs_rmap_find_left_neighbor(
>  	trace_xfs_rmap_find_left_neighbor_query(cur->bc_mp,
>  			cur->bc_ag.pag->pag_agno, bno, 0, owner, offset, flags);
>  
> -	error = xfs_rmap_query_range(cur, &info.high, &info.high,
> -			xfs_rmap_find_left_neighbor_helper, &info);
> -	if (error == -ECANCELED)
> -		error = 0;
> +	/*
> +	 * Historically, we always used the range query to walk every reverse
> +	 * mapping that could possibly overlap the key that the caller asked
> +	 * for, and filter out the ones that don't.  That is very slow when
> +	 * there are a lot of records.
> +	 *
> +	 * However, there are two scenarios where the classic btree search can
> +	 * produce correct results -- if the index contains a record that is an
> +	 * exact match for the lookup key; and if there are no other records
> +	 * between the record we want and the key we supplied.
> +	 *
> +	 * As an optimization, try a non-overlapped lookup first.  This makes
> +	 * extent conversion and remap operations run a bit faster if the
> +	 * physical extents aren't being shared.  If we don't find what we
> +	 * want, we fall back to the overlapped query.
> +	 */
> +	error = xfs_rmap_lookup_le(cur, bno, owner, offset, flags, irec, stat);
> +	if (error)
> +		return error;
> +	if (*stat) {
> +		*stat = 0;
> +		xfs_rmap_find_left_neighbor_helper(cur, irec, &info);
> +	}
> +	if (!(*stat)) {
> +		error = xfs_rmap_query_range(cur, &info.high, &info.high,
> +				xfs_rmap_find_left_neighbor_helper, &info);
> +		if (error == -ECANCELED)
> +			error = 0;
> +	}

Same comment as previous patch.

Cheers,

Dave.

-- 
Dave Chinner
david@fromorbit.com

  reply	other threads:[~2022-04-22 22:35 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-14 22:53 [PATCHSET 0/4] xfs: fix rmap inefficiencies Darrick J. Wong
2022-04-14 22:54 ` [PATCH 1/4] xfs: capture buffer ops in the xfs_buf tracepoints Darrick J. Wong
2022-04-22 21:47   ` Dave Chinner
2022-04-14 22:54 ` [PATCH 2/4] xfs: simplify xfs_rmap_lookup_le call sites Darrick J. Wong
2022-04-22 21:48   ` Dave Chinner
2022-04-24  5:45   ` Christoph Hellwig
2022-04-14 22:54 ` [PATCH 3/4] xfs: speed up rmap lookups by using non-overlapped lookups when possible Darrick J. Wong
2022-04-22 21:43   ` Dave Chinner
2022-04-25 18:35     ` Darrick J. Wong
2022-04-14 22:54 ` [PATCH 4/4] xfs: speed up write operations " Darrick J. Wong
2022-04-22 21:46   ` Dave Chinner [this message]
  -- strict thread matches above, loose matches on Subject: below --
2022-04-27  0:51 [PATCHSET v2 0/4] xfs: fix rmap inefficiencies Darrick J. Wong
2022-04-27  0:51 ` [PATCH 4/4] xfs: speed up write operations by using non-overlapped lookups when possible Darrick J. Wong
2022-04-27  4:22   ` Dave Chinner
2022-04-28 12:45   ` Christoph Hellwig

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=20220422214644.GX1544202@dread.disaster.area \
    --to=david@fromorbit.com \
    --cc=djwong@kernel.org \
    --cc=linux-xfs@vger.kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox