2022-02-28 12:07:23

by Christoph Hellwig

[permalink] [raw]
Subject: raid5 bio handling cleanups

Hi Song,

this series cleans up the raid5 bio handling to take advantage of
the bio allocation interface changes in Jens' for-5.18 branches.

Diffstat:
raid5-cache.c | 33 ++++++++++++++++-----------------
raid5-ppl.c | 5 ++---
raid5.c | 25 ++++++++-----------------
3 files changed, 26 insertions(+), 37 deletions(-)


2022-02-28 13:07:53

by Christoph Hellwig

[permalink] [raw]
Subject: [PATCH 4/4] raid5: initialize the stripe_head embeeded bios as needed

Use bio_init to initialize the bios when needed to the full state
instead of a partial initialization plus later setting of dev and op
and bio_reset.

Signed-off-by: Christoph Hellwig <[email protected]>
---
drivers/md/raid5.c | 25 ++++++++-----------------
1 file changed, 8 insertions(+), 17 deletions(-)

diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index 8891aaba65964..8bd5f06390ea1 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -1060,6 +1060,7 @@ static void ops_run_io(struct stripe_head *sh, struct stripe_head_state *s)
int i, disks = sh->disks;
struct stripe_head *head_sh = sh;
struct bio_list pending_bios = BIO_EMPTY_LIST;
+ struct r5dev *dev;
bool should_defer;

might_sleep();
@@ -1094,8 +1095,9 @@ static void ops_run_io(struct stripe_head *sh, struct stripe_head_state *s)
op_flags |= REQ_SYNC;

again:
- bi = &sh->dev[i].req;
- rbi = &sh->dev[i].rreq; /* For writing to replacement */
+ dev = &sh->dev[i];
+ bi = &dev->req;
+ rbi = &dev->rreq; /* For writing to replacement */

rcu_read_lock();
rrdev = rcu_dereference(conf->disks[i].replacement);
@@ -1171,8 +1173,7 @@ static void ops_run_io(struct stripe_head *sh, struct stripe_head_state *s)

set_bit(STRIPE_IO_STARTED, &sh->state);

- bio_set_dev(bi, rdev->bdev);
- bio_set_op_attrs(bi, op, op_flags);
+ bio_init(bi, rdev->bdev, &dev->vec, 1, op | op_flags);
bi->bi_end_io = op_is_write(op)
? raid5_end_write_request
: raid5_end_read_request;
@@ -1238,8 +1239,7 @@ static void ops_run_io(struct stripe_head *sh, struct stripe_head_state *s)

set_bit(STRIPE_IO_STARTED, &sh->state);

- bio_set_dev(rbi, rrdev->bdev);
- bio_set_op_attrs(rbi, op, op_flags);
+ bio_init(rbi, rrdev->bdev, &dev->rvec, 1, op | op_flags);
BUG_ON(!op_is_write(op));
rbi->bi_end_io = raid5_end_write_request;
rbi->bi_private = sh;
@@ -2294,7 +2294,6 @@ static struct stripe_head *alloc_stripe(struct kmem_cache *sc, gfp_t gfp,
int disks, struct r5conf *conf)
{
struct stripe_head *sh;
- int i;

sh = kmem_cache_zalloc(sc, gfp);
if (sh) {
@@ -2307,12 +2306,6 @@ static struct stripe_head *alloc_stripe(struct kmem_cache *sc, gfp_t gfp,
atomic_set(&sh->count, 1);
sh->raid_conf = conf;
sh->log_start = MaxSector;
- for (i = 0; i < disks; i++) {
- struct r5dev *dev = &sh->dev[i];
-
- bio_init(&dev->req, NULL, &dev->vec, 1, 0);
- bio_init(&dev->rreq, NULL, &dev->rvec, 1, 0);
- }

if (raid5_has_ppl(conf)) {
sh->ppl_page = alloc_page(gfp);
@@ -2677,7 +2670,6 @@ static void raid5_end_read_request(struct bio * bi)
(unsigned long long)sh->sector, i, atomic_read(&sh->count),
bi->bi_status);
if (i == disks) {
- bio_reset(bi, NULL, 0);
BUG();
return;
}
@@ -2785,7 +2777,7 @@ static void raid5_end_read_request(struct bio * bi)
}
}
rdev_dec_pending(rdev, conf->mddev);
- bio_reset(bi, NULL, 0);
+ bio_uninit(bi);
clear_bit(R5_LOCKED, &sh->dev[i].flags);
set_bit(STRIPE_HANDLE, &sh->state);
raid5_release_stripe(sh);
@@ -2823,7 +2815,6 @@ static void raid5_end_write_request(struct bio *bi)
(unsigned long long)sh->sector, i, atomic_read(&sh->count),
bi->bi_status);
if (i == disks) {
- bio_reset(bi, NULL, 0);
BUG();
return;
}
@@ -2860,7 +2851,7 @@ static void raid5_end_write_request(struct bio *bi)
if (sh->batch_head && bi->bi_status && !replacement)
set_bit(STRIPE_BATCH_ERR, &sh->batch_head->state);

- bio_reset(bi, NULL, 0);
+ bio_uninit(bi);
if (!test_and_clear_bit(R5_DOUBLE_LOCKED, &sh->dev[i].flags))
clear_bit(R5_LOCKED, &sh->dev[i].flags);
set_bit(STRIPE_HANDLE, &sh->state);
--
2.30.2

2022-02-28 17:50:53

by Christoph Hellwig

[permalink] [raw]
Subject: [PATCH 2/4] raid5-cache: fully initialize flush_bio when needed

Stop using bio_reset and just initialize the bio fully when needed.

Signed-off-by: Christoph Hellwig <[email protected]>
---
drivers/md/raid5-cache.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c
index 86e2bb89d9c7b..8907d18c225a9 100644
--- a/drivers/md/raid5-cache.c
+++ b/drivers/md/raid5-cache.c
@@ -1266,6 +1266,8 @@ static void r5l_log_flush_endio(struct bio *bio)
r5l_io_run_stripes(io);
list_splice_tail_init(&log->flushing_ios, &log->finished_ios);
spin_unlock_irqrestore(&log->io_list_lock, flags);
+
+ bio_uninit(bio);
}

/*
@@ -1301,7 +1303,7 @@ void r5l_flush_stripe_to_raid(struct r5l_log *log)

if (!do_flush)
return;
- bio_reset(&log->flush_bio, log->rdev->bdev,
+ bio_init(&log->flush_bio, log->rdev->bdev, NULL, 0,
REQ_OP_WRITE | REQ_PREFLUSH);
log->flush_bio.bi_end_io = r5l_log_flush_endio;
submit_bio(&log->flush_bio);
@@ -3105,7 +3107,6 @@ int r5l_init_log(struct r5conf *conf, struct md_rdev *rdev)
INIT_LIST_HEAD(&log->io_end_ios);
INIT_LIST_HEAD(&log->flushing_ios);
INIT_LIST_HEAD(&log->finished_ios);
- bio_init(&log->flush_bio, NULL, NULL, 0, 0);

log->io_kc = KMEM_CACHE(r5l_io_unit, 0);
if (!log->io_kc)
--
2.30.2

2022-03-03 00:51:30

by Song Liu

[permalink] [raw]
Subject: Re: raid5 bio handling cleanups

On Mon, Feb 28, 2022 at 3:25 AM Christoph Hellwig <[email protected]> wrote:
>
> Hi Song,
>
> this series cleans up the raid5 bio handling to take advantage of
> the bio allocation interface changes in Jens' for-5.18 branches.

Applied to md-next. Thanks!
Song

2022-03-09 06:15:35

by Christoph Hellwig

[permalink] [raw]
Subject: Re: raid5 bio handling cleanups

On Wed, Mar 02, 2022 at 04:14:40PM -0800, Song Liu wrote:
> On Mon, Feb 28, 2022 at 3:25 AM Christoph Hellwig <[email protected]> wrote:
> >
> > Hi Song,
> >
> > this series cleans up the raid5 bio handling to take advantage of
> > the bio allocation interface changes in Jens' for-5.18 branches.
>
> Applied to md-next. Thank

Unless I'm missing something these did not make it into the pull
request to Jens, right?

2022-03-09 07:01:23

by Song Liu

[permalink] [raw]
Subject: Re: raid5 bio handling cleanups

On Tue, Mar 8, 2022 at 10:08 PM Christoph Hellwig <[email protected]> wrote:
>
> On Wed, Mar 02, 2022 at 04:14:40PM -0800, Song Liu wrote:
> > On Mon, Feb 28, 2022 at 3:25 AM Christoph Hellwig <[email protected]> wrote:
> > >
> > > Hi Song,
> > >
> > > this series cleans up the raid5 bio handling to take advantage of
> > > the bio allocation interface changes in Jens' for-5.18 branches.
> >
> > Applied to md-next. Thank
>
> Unless I'm missing something these did not make it into the pull
> request to Jens, right?

I messed it up. I will send them in the next pull request.

Thanks,
Song

2022-03-09 07:55:16

by Song Liu

[permalink] [raw]
Subject: Re: raid5 bio handling cleanups

On Tue, Mar 8, 2022 at 10:50 PM Song Liu <[email protected]> wrote:
>
> On Tue, Mar 8, 2022 at 10:08 PM Christoph Hellwig <[email protected]> wrote:
> >
> > On Wed, Mar 02, 2022 at 04:14:40PM -0800, Song Liu wrote:
> > > On Mon, Feb 28, 2022 at 3:25 AM Christoph Hellwig <[email protected]> wrote:
> > > >
> > > > Hi Song,
> > > >
> > > > this series cleans up the raid5 bio handling to take advantage of
> > > > the bio allocation interface changes in Jens' for-5.18 branches.
> > >
> > > Applied to md-next. Thank
> >
> > Unless I'm missing something these did not make it into the pull
> > request to Jens, right?
>
> I messed it up. I will send them in the next pull request.

I just pushed it again to md-next. I will send the pull request tomorrow
or the day after.

Sorry for the confusion.

Song