From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: Brian Foster <bfoster@redhat.com>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH v4 08/11] xfs: refactor and reuse best extent scanning logic
Date: Wed, 18 Sep 2019 14:03:20 -0700 [thread overview]
Message-ID: <20190918210320.GZ2229799@magnolia> (raw)
In-Reply-To: <20190916121635.43148-9-bfoster@redhat.com>
On Mon, Sep 16, 2019 at 08:16:32AM -0400, Brian Foster wrote:
> The bnobt "find best" helper implements a simple btree walker
> function. This general pattern, or a subset thereof, is reused in
> various parts of a near mode allocation operation. For example, the
> bnobt left/right scans are each iterative btree walks along with the
> cntbt lastblock scan.
>
> Rework this function into a generic btree walker, add a couple
> parameters to control termination behavior from various contexts and
> reuse it where applicable.
>
> XXX: This slightly changes the cntbt lastblock scan logic to scan
> the entire block and use the best candidate as opposed to the
> current logic of checking until we locate a perfect match. Fix up
> cur_check() to terminate on perfect match.
Did that fix up happen in a previous patch?
> Signed-off-by: Brian Foster <bfoster@redhat.com>
> ---
> fs/xfs/libxfs/xfs_alloc.c | 103 ++++++++++++++++++--------------------
> 1 file changed, 48 insertions(+), 55 deletions(-)
>
> diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c
> index 3eacc799c4cb..ab494fd50dd7 100644
> --- a/fs/xfs/libxfs/xfs_alloc.c
> +++ b/fs/xfs/libxfs/xfs_alloc.c
> @@ -1172,30 +1172,38 @@ xfs_alloc_ag_vextent_exact(
> }
>
> /*
> - * Search the btree in a given direction and check the records against the good
> - * extent we've already found.
> + * Search a given number of btree records in a given direction. Check each
> + * record against the good extent we've already found.
> */
> STATIC int
> -xfs_alloc_find_best_extent(
> +xfs_alloc_walk_iter(
> struct xfs_alloc_arg *args,
> struct xfs_alloc_cur *acur,
> struct xfs_btree_cur *cur,
> - bool increment)
> + bool increment,
> + bool find_one,/* quit on first candidate */
Space between the comma and the comment?
--D
> + int count, /* rec count (-1 for infinite) */
> + int *stat)
> {
> int error;
> int i;
>
> + *stat = 0;
> +
> /*
> * Search so long as the cursor is active or we find a better extent.
> * The cursor is deactivated if it extends beyond the range of the
> * current allocation candidate.
> */
> - while (xfs_alloc_cur_active(cur)) {
> + while (xfs_alloc_cur_active(cur) && count) {
> error = xfs_alloc_cur_check(args, acur, cur, &i);
> if (error)
> return error;
> - if (i == 1)
> - break;
> + if (i == 1) {
> + *stat = 1;
> + if (find_one)
> + break;
> + }
> if (!xfs_alloc_cur_active(cur))
> break;
>
> @@ -1207,6 +1215,9 @@ xfs_alloc_find_best_extent(
> return error;
> if (i == 0)
> cur->bc_private.a.priv.abt.active = false;
> +
> + if (count > 0)
> + count--;
> }
>
> return 0;
> @@ -1226,7 +1237,6 @@ xfs_alloc_ag_vextent_near(
> struct xfs_btree_cur *fbcur = NULL;
> int error; /* error code */
> int i; /* result code, temporary */
> - int j; /* result code, temporary */
> xfs_agblock_t bno;
> xfs_extlen_t len;
> bool fbinc = false;
> @@ -1313,19 +1323,12 @@ xfs_alloc_ag_vextent_near(
> if (!i)
> break;
> }
> - i = acur.cnt->bc_ptrs[0];
> - for (j = 1;
> - !error && j && xfs_alloc_cur_active(acur.cnt) &&
> - (acur.len < args->maxlen || acur.diff > 0);
> - error = xfs_btree_increment(acur.cnt, 0, &j)) {
> - /*
> - * For each entry, decide if it's better than
> - * the previous best entry.
> - */
> - error = xfs_alloc_cur_check(args, &acur, acur.cnt, &i);
> - if (error)
> - goto out;
> - }
> +
> + error = xfs_alloc_walk_iter(args, &acur, acur.cnt, true, false,
> + -1, &i);
> + if (error)
> + goto out;
> +
> /*
> * It didn't work. We COULD be in a case where
> * there's a good record somewhere, so try again.
> @@ -1357,49 +1360,39 @@ xfs_alloc_ag_vextent_near(
> goto out;
>
> /*
> - * Loop going left with the leftward cursor, right with the
> - * rightward cursor, until either both directions give up or
> - * we find an entry at least as big as minlen.
> + * Loop going left with the leftward cursor, right with the rightward
> + * cursor, until either both directions give up or we find an entry at
> + * least as big as minlen.
> */
> do {
> - if (xfs_alloc_cur_active(acur.bnolt)) {
> - error = xfs_alloc_cur_check(args, &acur, acur.bnolt, &i);
> - if (error)
> - goto out;
> - if (i == 1) {
> - trace_xfs_alloc_cur_left(args);
> - fbcur = acur.bnogt;
> - fbinc = true;
> - break;
> - }
> - error = xfs_btree_decrement(acur.bnolt, 0, &i);
> - if (error)
> - goto out;
> - if (!i)
> - acur.bnolt->bc_private.a.priv.abt.active = false;
> + error = xfs_alloc_walk_iter(args, &acur, acur.bnolt, false,
> + true, 1, &i);
> + if (error)
> + goto out;
> + if (i == 1) {
> + trace_xfs_alloc_cur_left(args);
> + fbcur = acur.bnogt;
> + fbinc = true;
> + break;
> }
> - if (xfs_alloc_cur_active(acur.bnogt)) {
> - error = xfs_alloc_cur_check(args, &acur, acur.bnogt, &i);
> - if (error)
> - goto out;
> - if (i == 1) {
> - trace_xfs_alloc_cur_right(args);
> - fbcur = acur.bnolt;
> - fbinc = false;
> - break;
> - }
> - error = xfs_btree_increment(acur.bnogt, 0, &i);
> - if (error)
> - goto out;
> - if (!i)
> - acur.bnogt->bc_private.a.priv.abt.active = false;
> +
> + error = xfs_alloc_walk_iter(args, &acur, acur.bnogt, true, true,
> + 1, &i);
> + if (error)
> + goto out;
> + if (i == 1) {
> + trace_xfs_alloc_cur_right(args);
> + fbcur = acur.bnolt;
> + fbinc = false;
> + break;
> }
> } while (xfs_alloc_cur_active(acur.bnolt) ||
> xfs_alloc_cur_active(acur.bnogt));
>
> /* search the opposite direction for a better entry */
> if (fbcur) {
> - error = xfs_alloc_find_best_extent(args, &acur, fbcur, fbinc);
> + error = xfs_alloc_walk_iter(args, &acur, fbcur, fbinc, true, -1,
> + &i);
> if (error)
> goto out;
> }
> --
> 2.20.1
>
next prev parent reply other threads:[~2019-09-18 21:04 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-16 12:16 [PATCH v4 00/11] xfs: rework near mode extent allocation Brian Foster
2019-09-16 12:16 ` [PATCH v4 01/11] xfs: track active state of allocation btree cursors Brian Foster
2019-09-18 18:38 ` Darrick J. Wong
2019-09-19 14:57 ` Brian Foster
2019-09-16 12:16 ` [PATCH v4 02/11] xfs: introduce allocation cursor data structure Brian Foster
2019-09-18 18:46 ` Darrick J. Wong
2019-09-16 12:16 ` [PATCH v4 03/11] xfs: track allocation busy state in allocation cursor Brian Foster
2019-09-18 18:48 ` Darrick J. Wong
2019-09-19 14:58 ` Brian Foster
2019-09-16 12:16 ` [PATCH v4 04/11] xfs: track best extent from cntbt lastblock scan in alloc cursor Brian Foster
2019-09-18 18:56 ` Darrick J. Wong
2019-09-19 15:00 ` Brian Foster
2019-09-16 12:16 ` [PATCH v4 05/11] xfs: refactor cntbt lastblock scan best extent logic into helper Brian Foster
2019-09-18 19:03 ` Darrick J. Wong
2019-09-19 15:01 ` Brian Foster
2019-09-16 12:16 ` [PATCH v4 06/11] xfs: reuse best extent tracking logic for bnobt scan Brian Foster
2019-09-18 20:43 ` Darrick J. Wong
2019-09-19 15:04 ` Brian Foster
2019-10-04 22:44 ` Darrick J. Wong
2019-10-07 11:08 ` Brian Foster
2019-09-16 12:16 ` [PATCH v4 07/11] xfs: refactor allocation tree fixup code Brian Foster
2019-09-18 20:44 ` Darrick J. Wong
2019-09-16 12:16 ` [PATCH v4 08/11] xfs: refactor and reuse best extent scanning logic Brian Foster
2019-09-18 21:03 ` Darrick J. Wong [this message]
2019-09-19 15:04 ` Brian Foster
2019-09-16 12:16 ` [PATCH v4 09/11] xfs: refactor near mode alloc bnobt scan into separate function Brian Foster
2019-09-18 20:55 ` Darrick J. Wong
2019-09-16 12:16 ` [PATCH v4 10/11] xfs: factor out tree fixup logic into helper Brian Foster
2019-09-18 20:56 ` Darrick J. Wong
2019-09-16 12:16 ` [PATCH v4 11/11] xfs: optimize near mode bnobt scans with concurrent cntbt lookups Brian Foster
2019-09-18 21:11 ` Darrick J. Wong
2019-09-19 15:05 ` Brian Foster
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=20190918210320.GZ2229799@magnolia \
--to=darrick.wong@oracle.com \
--cc=bfoster@redhat.com \
--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