2022-05-27 11:12:18

by Logan Gunthorpe

[permalink] [raw]
Subject: [PATCH v2 04/17] md/raid5-cache: Refactor r5l_flush_stripe_to_raid() to take a struct r5conf

All calls to r5l_flush_stripe_to_raid() have to dereference conf to
get the log. The log pointer should be protected by RCU, but isn't. Push
the dereference of conf->log into r5l_flush_stripe_to_raid() to reduce
the number of sites that dereference conf->log so this can be improved.

No functional changes intended.

Signed-off-by: Logan Gunthorpe <[email protected]>
Reviewed-by: Christoph Hellwig <[email protected]>
---
drivers/md/raid5-cache.c | 3 ++-
drivers/md/raid5-log.h | 4 ++--
drivers/md/raid5.c | 6 +++---
3 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c
index 7c5dc45b1ea8..edff4e8d07dc 100644
--- a/drivers/md/raid5-cache.c
+++ b/drivers/md/raid5-cache.c
@@ -1289,8 +1289,9 @@ static void r5l_log_flush_endio(struct bio *bio)
* only write stripes of an io_unit to raid disks till the io_unit is the first
* one whose data/parity is in log.
*/
-void r5l_flush_stripe_to_raid(struct r5l_log *log)
+void r5l_flush_stripe_to_raid(struct r5conf *conf)
{
+ struct r5l_log *log = conf->log;
bool do_flush;

if (!log || !log->need_cache_flush)
diff --git a/drivers/md/raid5-log.h b/drivers/md/raid5-log.h
index db4c1262b380..5ace25d11ea4 100644
--- a/drivers/md/raid5-log.h
+++ b/drivers/md/raid5-log.h
@@ -6,7 +6,7 @@ int r5l_init_log(struct r5conf *conf, struct md_rdev *rdev);
void r5l_exit_log(struct r5conf *conf);
int r5l_write_stripe(struct r5l_log *log, struct stripe_head *head_sh);
void r5l_write_stripe_run(struct r5l_log *log);
-void r5l_flush_stripe_to_raid(struct r5l_log *log);
+void r5l_flush_stripe_to_raid(struct r5conf *conf);
void r5l_stripe_write_finished(struct stripe_head *sh);
int r5l_handle_flush_request(struct r5l_log *log, struct bio *bio);
void r5l_quiesce(struct r5l_log *log, int quiesce);
@@ -96,7 +96,7 @@ static inline void log_write_stripe_run(struct r5conf *conf)
static inline void log_flush_stripe_to_raid(struct r5conf *conf)
{
if (conf->log)
- r5l_flush_stripe_to_raid(conf->log);
+ r5l_flush_stripe_to_raid(conf);
else if (raid5_has_ppl(conf))
ppl_write_stripe_run(conf);
}
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index 83911affcd88..f1b55495de53 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -6427,7 +6427,7 @@ static int handle_active_stripes(struct r5conf *conf, int group,
release_inactive_stripe_list(conf, temp_inactive_list,
NR_STRIPE_HASH_LOCKS);

- r5l_flush_stripe_to_raid(conf->log);
+ r5l_flush_stripe_to_raid(conf);
if (release_inactive) {
spin_lock_irq(&conf->device_lock);
return 0;
@@ -6483,7 +6483,7 @@ static void raid5_do_work(struct work_struct *work)

flush_deferred_bios(conf);

- r5l_flush_stripe_to_raid(conf->log);
+ r5l_flush_stripe_to_raid(conf);

async_tx_issue_pending_all();
blk_finish_plug(&plug);
@@ -6570,7 +6570,7 @@ static void raid5d(struct md_thread *thread)

flush_deferred_bios(conf);

- r5l_flush_stripe_to_raid(conf->log);
+ r5l_flush_stripe_to_raid(conf);

async_tx_issue_pending_all();
blk_finish_plug(&plug);
--
2.30.2