Re: [PATCH -next v3 4/7] md/raid1-10: submit write io directly if bitmap is not enabled

From: Xiao Ni
Date: Wed May 31 2023 - 11:22:01 EST


On Wed, May 31, 2023 at 4:25 PM Yu Kuai <yukuai1@xxxxxxxxxxxxxxx> wrote:
>
> Hi,
>
> 在 2023/05/31 15:26, Xiao Ni 写道:
> > On Mon, May 29, 2023 at 9:14 PM Yu Kuai <yukuai1@xxxxxxxxxxxxxxx> wrote:
> >>
> >> From: Yu Kuai <yukuai3@xxxxxxxxxx>
> >>
> >> Commit 6cce3b23f6f8 ("[PATCH] md: write intent bitmap support for raid10")
> >> add bitmap support, and it changed that write io is submitted through
> >> daemon thread because bitmap need to be updated before write io. And
> >> later, plug is used to fix performance regression because all the write io
> >> will go to demon thread, which means io can't be issued concurrently.
> >>
> >> However, if bitmap is not enabled, the write io should not go to daemon
> >> thread in the first place, and plug is not needed as well.
> >>
> >> Fixes: 6cce3b23f6f8 ("[PATCH] md: write intent bitmap support for raid10")
> >> Signed-off-by: Yu Kuai <yukuai3@xxxxxxxxxx>
> >> ---
> >> drivers/md/md-bitmap.c | 4 +---
> >> drivers/md/md-bitmap.h | 7 +++++++
> >> drivers/md/raid1-10.c | 13 +++++++++++--
> >> 3 files changed, 19 insertions(+), 5 deletions(-)
> >>
> >> diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c
> >> index ad5a3456cd8a..3ee590cf12a7 100644
> >> --- a/drivers/md/md-bitmap.c
> >> +++ b/drivers/md/md-bitmap.c
> >> @@ -1016,7 +1016,6 @@ static int md_bitmap_file_test_bit(struct bitmap *bitmap, sector_t block)
> >> return set;
> >> }
> >>
> >> -
> >> /* this gets called when the md device is ready to unplug its underlying
> >> * (slave) device queues -- before we let any writes go down, we need to
> >> * sync the dirty pages of the bitmap file to disk */
> >> @@ -1026,8 +1025,7 @@ void md_bitmap_unplug(struct bitmap *bitmap)
> >> int dirty, need_write;
> >> int writing = 0;
> >>
> >> - if (!bitmap || !bitmap->storage.filemap ||
> >> - test_bit(BITMAP_STALE, &bitmap->flags))
> >> + if (!md_bitmap_enabled(bitmap))
> >> return;
> >>
> >> /* look at each page to see if there are any set bits that need to be
> >> diff --git a/drivers/md/md-bitmap.h b/drivers/md/md-bitmap.h
> >> index cfd7395de8fd..3a4750952b3a 100644
> >> --- a/drivers/md/md-bitmap.h
> >> +++ b/drivers/md/md-bitmap.h
> >> @@ -273,6 +273,13 @@ int md_bitmap_copy_from_slot(struct mddev *mddev, int slot,
> >> sector_t *lo, sector_t *hi, bool clear_bits);
> >> void md_bitmap_free(struct bitmap *bitmap);
> >> void md_bitmap_wait_behind_writes(struct mddev *mddev);
> >> +
> >> +static inline bool md_bitmap_enabled(struct bitmap *bitmap)
> >> +{
> >> + return bitmap && bitmap->storage.filemap &&
> >> + !test_bit(BITMAP_STALE, &bitmap->flags);
> >> +}
> >> +
> >> #endif
> >>
> >> #endif
> >> diff --git a/drivers/md/raid1-10.c b/drivers/md/raid1-10.c
> >> index 506299bd55cb..73cc3cb9154d 100644
> >> --- a/drivers/md/raid1-10.c
> >> +++ b/drivers/md/raid1-10.c
> >> @@ -131,9 +131,18 @@ static inline bool raid1_add_bio_to_plug(struct mddev *mddev, struct bio *bio,
> >> blk_plug_cb_fn unplug)
> >> {
> >> struct raid1_plug_cb *plug = NULL;
> >> - struct blk_plug_cb *cb = blk_check_plugged(unplug, mddev,
> >> - sizeof(*plug));
> >> + struct blk_plug_cb *cb;
> >> +
> >> + /*
> >> + * If bitmap is not enabled, it's safe to submit the io directly, and
> >> + * this can get optimal performance.
> >> + */
> >> + if (!md_bitmap_enabled(mddev->bitmap)) {
> >> + raid1_submit_write(bio);
> >> + return true;
> >> + }
> >
> > Can we check this out of raid1_add_bio_to_plug and call
> > raid1_submit_write directly in make_request function?
>
> Of course we can, I'm trying to avoid redundant code here...

I know. But it doesn't fit the name of the function.

Regards
Xiao
>
> Thanks,
> Kuai
> >
> > Regards
> > Xiao
> >>
> >> + cb = blk_check_plugged(unplug, mddev, sizeof(*plug));
> >> if (!cb)
> >> return false;
> >>
> >> --
> >> 2.39.2
> >>
> >
> > .
> >
>