From: David Sterba <dsterba@suse.cz>
To: Naohiro Aota <naohiro.aota@wdc.com>
Cc: linux-btrfs@vger.kernel.org, johannes.thumshirn@wdc.com
Subject: Re: [PATCH v2 2/2] btrfs: zoned: activate block group only for extent allocation
Date: Fri, 1 Apr 2022 16:12:20 +0200 [thread overview]
Message-ID: <20220401141220.GJ15609@twin.jikos.cz> (raw)
In-Reply-To: <9d491b6ea2d2628eb9632f4dfc43e52b8bfb7057.1647936783.git.naohiro.aota@wdc.com>
On Tue, Mar 22, 2022 at 06:11:34PM +0900, Naohiro Aota wrote:
> In btrfs_make_block_group(), we activate the allocated block group,
> expecting that the block group is soon used for allocation. However, the
> chunk allocation from flush_space() context broke the assumption. There can
> be a large time gap between the chunk allocation time and the extent
> allocation time from the chunk.
>
> Activating the empty block groups pre-allocated from flush_space() context
> can exhaust the active zone counter of a device. Once we use all the active
> zone counts for empty pre-allocated BGs, we cannot activate new BG for the
> other things: metadata, tree-log, or data relocation BG. That failure
> results in a fake -ENOSPC.
>
> This patch introduces CHUNK_ALLOC_FORCE_FOR_EXTENT to distinguish the chunk
> allocation from find_free_extent(). Now, the new block group is activated
> only in that context.
>
> Fixes: eb66a010d518 ("btrfs: zoned: activate new block group")
> Cc: stable@vger.kernel.org # 5.16+: c7d1b9109dd0: btrfs: return allocated block group from do_chunk_alloc()
> Cc: stable@vger.kernel.org # 5.16+
> Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com>
> ---
> fs/btrfs/block-group.c | 24 ++++++++++++++++--------
> fs/btrfs/block-group.h | 1 +
> fs/btrfs/extent-tree.c | 2 +-
> 3 files changed, 18 insertions(+), 9 deletions(-)
>
> diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c
> index d4ac1c76f539..84c97d76de92 100644
> --- a/fs/btrfs/block-group.c
> +++ b/fs/btrfs/block-group.c
> @@ -2481,12 +2481,6 @@ struct btrfs_block_group *btrfs_make_block_group(struct btrfs_trans_handle *tran
> return ERR_PTR(ret);
> }
>
> - /*
> - * New block group is likely to be used soon. Try to activate it now.
> - * Failure is OK for now.
> - */
> - btrfs_zone_activate(cache);
> -
> ret = exclude_super_stripes(cache);
> if (ret) {
> /* We may have excluded something, so call this just in case */
> @@ -3642,8 +3636,14 @@ int btrfs_chunk_alloc(struct btrfs_trans_handle *trans, u64 flags,
> struct btrfs_block_group *ret_bg;
> bool wait_for_alloc = false;
> bool should_alloc = false;
> + bool from_extent_allocation = false;
> int ret = 0;
>
> + if (force == CHUNK_ALLOC_FORCE_FOR_EXTENT) {
> + from_extent_allocation = true;
> + force = CHUNK_ALLOC_FORCE;
> + }
> +
> /* Don't re-enter if we're already allocating a chunk */
> if (trans->allocating_chunk)
> return -ENOSPC;
> @@ -3736,9 +3736,17 @@ int btrfs_chunk_alloc(struct btrfs_trans_handle *trans, u64 flags,
> ret_bg = do_chunk_alloc(trans, flags);
> trans->allocating_chunk = false;
>
> - if (IS_ERR(ret_bg))
> + if (IS_ERR(ret_bg)) {
> ret = PTR_ERR(ret_bg);
> - else
> + } else if (from_extent_allocation) {
> + /*
> + * New block group is likely to be used soon. Try to activate
> + * it now. Failure is OK for now.
> + */
> + btrfs_zone_activate(ret_bg);
> + }
> +
> + if (!ret)
> btrfs_put_block_group(ret_bg);
>
> spin_lock(&space_info->lock);
> diff --git a/fs/btrfs/block-group.h b/fs/btrfs/block-group.h
> index 93aabc68bb6a..9c822367c432 100644
> --- a/fs/btrfs/block-group.h
> +++ b/fs/btrfs/block-group.h
> @@ -40,6 +40,7 @@ enum btrfs_chunk_alloc_enum {
> CHUNK_ALLOC_NO_FORCE,
> CHUNK_ALLOC_LIMITED,
> CHUNK_ALLOC_FORCE,
> + CHUNK_ALLOC_FORCE_FOR_EXTENT,
There's a comment documenting what it means, I've written
CHUNK_ALLOC_FORCE_FOR_EXTENT like CHUNK_ALLOC_FORCE but called from
find_free_extent() that also activaes the zone
based on the changelog.
next prev parent reply other threads:[~2022-04-01 14:16 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-22 9:11 [PATCH v2 0/2] btrfs: zoned: activate new BG only from extent allocation context Naohiro Aota
2022-03-22 9:11 ` [PATCH v2 1/2] btrfs: return allocated block group from do_chunk_alloc() Naohiro Aota
2022-03-22 9:11 ` [PATCH v2 2/2] btrfs: zoned: activate block group only for extent allocation Naohiro Aota
2022-04-01 14:12 ` David Sterba [this message]
2022-03-22 16:03 ` [PATCH v2 0/2] btrfs: zoned: activate new BG only from extent allocation context Johannes Thumshirn
2022-04-01 14:22 ` David Sterba
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=20220401141220.GJ15609@twin.jikos.cz \
--to=dsterba@suse.cz \
--cc=johannes.thumshirn@wdc.com \
--cc=linux-btrfs@vger.kernel.org \
--cc=naohiro.aota@wdc.com \
/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