From: Brian Foster <bfoster@redhat.com>
To: Kent Overstreet <kent.overstreet@linux.dev>
Cc: linux-bcachefs@vger.kernel.org
Subject: Re: [PATCH] bcachefs: update alloc cursor in early bucket allocator
Date: Thu, 19 Oct 2023 13:22:38 -0400 [thread overview]
Message-ID: <ZTFl3jJJi2CoDdJB@bfoster> (raw)
In-Reply-To: <20231019153019.jl73n6ipif7zwc5b@moria.home.lan>
On Thu, Oct 19, 2023 at 11:30:19AM -0400, Kent Overstreet wrote:
> On Thu, Oct 19, 2023 at 09:27:46AM -0400, Brian Foster wrote:
> > A recent bug report uncovered a scenario where a filesystem never
> > runs with freespace_initialized, and therefore the user observes
> > significantly degraded write performance by virtue of running the
> > early bucket allocator. The associated bug aside, the primary cause
> > of the performance drop in this particular instance is that the
> > early bucket allocator does not update the allocation cursor. This
> > means that every allocation walks the alloc btree from the first
> > bucket of the associated device looking for a bucket marked as free
> > space.
> >
> > Update the early allocator code to set the alloc cursor to the
> > prospectively allocated bucket, similar to how the freelist
> > allocator behaves. This improves performance of the early bucket
> > allocator dramatically (even though it should be bypassed in favor
> > of the freelist allocator in most cases).
> >
> > Signed-off-by: Brian Foster <bfoster@redhat.com>
> > ---
> >
> > cshepherd on #bcache originally reported the early bucket allocator
> > problem and helped chase it down to what looks like a members_v2
> > regression. I believe he was planning to post a patch for that one.
> >
> > Brian
> >
> > fs/bcachefs/alloc_foreground.c | 2 +-
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/fs/bcachefs/alloc_foreground.c b/fs/bcachefs/alloc_foreground.c
> > index 3bc4abd3d7d5..be3fc0f38c79 100644
> > --- a/fs/bcachefs/alloc_foreground.c
> > +++ b/fs/bcachefs/alloc_foreground.c
> > @@ -431,7 +431,7 @@ bch2_bucket_alloc_early(struct btree_trans *trans,
> > }
> > bch2_trans_iter_exit(trans, &iter);
> >
> > - ca->alloc_cursor = alloc_cursor;
> > + ca->alloc_cursor = IS_ERR_OR_NULL(ob) ? alloc_cursor : ob->bucket;
>
> Oh, this code is broken. The local alloc_cursor never gets updated, and
> it needs to for where we check if we need to loop around.
>
Ah, good point.
> The proper fix would be to add
>
> alloc_cursor = iter.pos.offset;
>
> before the line you changed
>
Thanks. I'll give that a whirl.
BTW, should this code be protected from no free space situations at a
higher level, or should we consider a max retry count or something? I
want to be cautious about things like prospective livelocks
(particularly if this path is less common) if this retry was effectively
dead code due to not updating alloc_cursor.
Brian
next prev parent reply other threads:[~2023-10-19 17:23 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-19 13:27 [PATCH] bcachefs: update alloc cursor in early bucket allocator Brian Foster
2023-10-19 15:30 ` Kent Overstreet
2023-10-19 17:22 ` Brian Foster [this message]
2023-10-19 18:38 ` Kent Overstreet
2023-10-20 16:01 ` 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=ZTFl3jJJi2CoDdJB@bfoster \
--to=bfoster@redhat.com \
--cc=kent.overstreet@linux.dev \
--cc=linux-bcachefs@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 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.