md/raid10: optimize fix_read_error
authorLi Nan <linan122@huawei.com>
Fri, 23 Jun 2023 17:32:34 +0000 (01:32 +0800)
committerSong Liu <song@kernel.org>
Thu, 27 Jul 2023 07:13:30 +0000 (00:13 -0700)
We dereference r10_bio->read_slot too many times in fix_read_error().
Optimize it by using a variable to store read_slot.

Signed-off-by: Li Nan <linan122@huawei.com>
Reviewed-by: Yu Kuai <yukuai3@huawei.com>
Link: https://lore.kernel.org/r/20230623173236.2513554-2-linan666@huaweicloud.com
Signed-off-by: Song Liu <song@kernel.org>
drivers/md/raid10.c

index d42e9b7..abea91a 100644 (file)
@@ -2718,10 +2718,10 @@ static int r10_sync_page_io(struct md_rdev *rdev, sector_t sector,
 static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10bio *r10_bio)
 {
        int sect = 0; /* Offset from r10_bio->sector */
-       int sectors = r10_bio->sectors;
+       int sectors = r10_bio->sectors, slot = r10_bio->read_slot;
        struct md_rdev *rdev;
        int max_read_errors = atomic_read(&mddev->max_corr_read_errors);
-       int d = r10_bio->devs[r10_bio->read_slot].devnum;
+       int d = r10_bio->devs[slot].devnum;
 
        /* still own a reference to this rdev, so it cannot
         * have been cleared recently.
@@ -2742,13 +2742,13 @@ static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10
                pr_notice("md/raid10:%s: %pg: Failing raid device\n",
                          mdname(mddev), rdev->bdev);
                md_error(mddev, rdev);
-               r10_bio->devs[r10_bio->read_slot].bio = IO_BLOCKED;
+               r10_bio->devs[slot].bio = IO_BLOCKED;
                return;
        }
 
        while(sectors) {
                int s = sectors;
-               int sl = r10_bio->read_slot;
+               int sl = slot;
                int success = 0;
                int start;
 
@@ -2783,7 +2783,7 @@ static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10
                        sl++;
                        if (sl == conf->copies)
                                sl = 0;
-               } while (!success && sl != r10_bio->read_slot);
+               } while (!success && sl != slot);
                rcu_read_unlock();
 
                if (!success) {
@@ -2791,16 +2791,16 @@ static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10
                         * as bad on the first device to discourage future
                         * reads.
                         */
-                       int dn = r10_bio->devs[r10_bio->read_slot].devnum;
+                       int dn = r10_bio->devs[slot].devnum;
                        rdev = conf->mirrors[dn].rdev;
 
                        if (!rdev_set_badblocks(
                                    rdev,
-                                   r10_bio->devs[r10_bio->read_slot].addr
+                                   r10_bio->devs[slot].addr
                                    + sect,
                                    s, 0)) {
                                md_error(mddev, rdev);
-                               r10_bio->devs[r10_bio->read_slot].bio
+                               r10_bio->devs[slot].bio
                                        = IO_BLOCKED;
                        }
                        break;
@@ -2809,7 +2809,7 @@ static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10
                start = sl;
                /* write it back and re-read */
                rcu_read_lock();
-               while (sl != r10_bio->read_slot) {
+               while (sl != slot) {
                        if (sl==0)
                                sl = conf->copies;
                        sl--;
@@ -2843,7 +2843,7 @@ static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10
                        rcu_read_lock();
                }
                sl = start;
-               while (sl != r10_bio->read_slot) {
+               while (sl != slot) {
                        if (sl==0)
                                sl = conf->copies;
                        sl--;