]> git.baikalelectronics.ru Git - kernel.git/commitdiff
md/raid5-cache: Drop RCU usage of conf->log
authorLogan Gunthorpe <logang@deltatee.com>
Wed, 8 Jun 2022 16:27:51 +0000 (10:27 -0600)
committerJens Axboe <axboe@kernel.dk>
Tue, 2 Aug 2022 23:14:31 +0000 (17:14 -0600)
The only place that uses RCU to access conf->log is in
r5l_log_disk_error(). This function is mostly used in the IO path
and once with mddev_lock() held in raid5_change_consistency_policy().

It is known that the IO will be suspended before the log is freed and
r5l_log_exit() is called with the mddev_lock() held.

This should mean that conf->log can not be freed while the function is
being called, so the RCU protection is not necessary. Drop the
rcu_read_lock() as well as the synchronize_rcu() and
rcu_assign_pointer() usage.

Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Song Liu <song@kernel.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/md/raid5-cache.c

index 4da88888fbfc20104de993e435dd81f0903706f4..d9b94e25e815f63aef3a92552811a01c5e2e169e 100644 (file)
@@ -1590,18 +1590,13 @@ void r5l_quiesce(struct r5l_log *log, int quiesce)
 
 bool r5l_log_disk_error(struct r5conf *conf)
 {
-       struct r5l_log *log;
-       bool ret;
-       /* don't allow write if journal disk is missing */
-       rcu_read_lock();
-       log = rcu_dereference(conf->log);
+       struct r5l_log *log = conf->log;
 
+       /* don't allow write if journal disk is missing */
        if (!log)
-               ret = test_bit(MD_HAS_JOURNAL, &conf->mddev->flags);
+               return test_bit(MD_HAS_JOURNAL, &conf->mddev->flags);
        else
-               ret = test_bit(Faulty, &log->rdev->flags);
-       rcu_read_unlock();
-       return ret;
+               return test_bit(Faulty, &log->rdev->flags);
 }
 
 #define R5L_RECOVERY_PAGE_POOL_SIZE 256
@@ -3148,7 +3143,7 @@ int r5l_init_log(struct r5conf *conf, struct md_rdev *rdev)
        spin_lock_init(&log->stripe_in_journal_lock);
        atomic_set(&log->stripe_in_journal_count, 0);
 
-       rcu_assign_pointer(conf->log, log);
+       conf->log = log;
 
        set_bit(MD_HAS_JOURNAL, &conf->mddev->flags);
        return 0;
@@ -3171,7 +3166,6 @@ void r5l_exit_log(struct r5conf *conf)
        struct r5l_log *log = conf->log;
 
        conf->log = NULL;
-       synchronize_rcu();
 
        /* Ensure disable_writeback_work wakes up and exits */
        wake_up(&conf->mddev->sb_wait);