From: Allison Henderson <allison.henderson@oracle.com>
To: linux-block@vger.kernel.org, linux-xfs@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org
Cc: martin.petersen@oracle.com, shirley.ma@oracle.com,
bob.liu@oracle.com, allison.henderson@oracle.com
Subject: [PATCH v1 3/7] md: raid1: handle bi_rw_hint accordingly
Date: Tue, 27 Nov 2018 20:49:47 -0700 [thread overview]
Message-ID: <1543376991-5764-4-git-send-email-allison.henderson@oracle.com> (raw)
In-Reply-To: <1543376991-5764-1-git-send-email-allison.henderson@oracle.com>
From: Bob Liu <bob.liu@oracle.com>
* nr_mirrors that raid1 device support should be @raid_disks, init it properly.
* Recording i/o went to which mirror in bio->bi_rw_hint.
* Read from specific real device if bi_rw_hint was set.
Todo:
* Support more drivers.
Signed-off-by: Bob Liu <bob.liu@oracle.com>
---
drivers/md/raid1.c | 31 ++++++++++++++++++++++++++++---
1 file changed, 28 insertions(+), 3 deletions(-)
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index fedf8c0..d2bdd0e 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -553,7 +553,8 @@ static sector_t align_to_barrier_unit_end(sector_t start_sector,
*
* The rdev for the device selected will have nr_pending incremented.
*/
-static int read_balance(struct r1conf *conf, struct r1bio *r1_bio, int *max_sectors)
+static int read_balance(struct r1conf *conf, struct r1bio *r1_bio, int *max_sectors,
+ unsigned short disk_hint)
{
const sector_t this_sector = r1_bio->sector;
int sectors;
@@ -566,6 +567,7 @@ static int read_balance(struct r1conf *conf, struct r1bio *r1_bio, int *max_sect
struct md_rdev *rdev;
int choose_first;
int choose_next_idle;
+ int max_disks;
rcu_read_lock();
/*
@@ -593,7 +595,20 @@ static int read_balance(struct r1conf *conf, struct r1bio *r1_bio, int *max_sect
else
choose_first = 0;
- for (disk = 0 ; disk < conf->raid_disks * 2 ; disk++) {
+ if (disk_hint) {
+ disk = disk_hint - 1;
+ /*
+ * Consider replacement as a special case, use original device to
+ * indicate which mirror this i/o was happened.
+ */
+ if (disk >= conf->raid_disks)
+ disk -= conf->raid_disks;
+ max_disks = disk + 1;
+ } else {
+ disk = 0;
+ max_disks = conf->raid_disks * 2;
+ }
+ for (; disk < max_disks; disk++) {
sector_t dist;
sector_t first_bad;
int bad_sectors;
@@ -1234,7 +1249,7 @@ static void raid1_read_request(struct mddev *mddev, struct bio *bio,
* make_request() can abort the operation when read-ahead is being
* used and no empty request is available.
*/
- rdisk = read_balance(conf, r1_bio, &max_sectors);
+ rdisk = read_balance(conf, r1_bio, &max_sectors, bio->bi_rw_hint);
if (rdisk < 0) {
/* couldn't find anywhere to read from */
@@ -1247,6 +1262,10 @@ static void raid1_read_request(struct mddev *mddev, struct bio *bio,
raid_end_bio_io(r1_bio);
return;
}
+
+ /* Recording i/o went to which real device. */
+ bio->bi_rw_hint = rdisk;
+
mirror = conf->mirrors + rdisk;
if (print_msg)
@@ -1279,6 +1298,11 @@ static void raid1_read_request(struct mddev *mddev, struct bio *bio,
r1_bio->read_disk = rdisk;
read_bio = bio_clone_fast(bio, gfp, &mddev->bio_set);
+ /*
+ * Clear bi_rw_hint, because it was set last i/o went to which real
+ * device.
+ */
+ read_bio->bi_rw_hint = 0;
r1_bio->bios[rdisk] = read_bio;
@@ -3078,6 +3102,7 @@ static int raid1_run(struct mddev *mddev)
if (mddev->queue) {
blk_queue_max_write_same_sectors(mddev->queue, 0);
blk_queue_max_write_zeroes_sectors(mddev->queue, 0);
+ blk_queue_set_mirrors(mddev->queue, mddev->raid_disks);
}
rdev_for_each(rdev, mddev) {
--
2.7.4
next prev parent reply other threads:[~2018-11-28 3:53 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-28 3:49 [RFC PATCH v1 0/7] Block/XFS: Support alternative mirror device retry Allison Henderson
2018-11-28 3:49 ` [PATCH v1 1/7] block: add nr_mirrors to request_queue Allison Henderson
2018-11-28 3:49 ` [PATCH v1 2/7] block: expand write_hint of bio/request to rw_hint Allison Henderson
2018-11-28 3:49 ` Allison Henderson [this message]
2018-11-28 3:49 ` [PATCH v1 4/7] xfs: Add b_rw_hint to xfs_buf Allison Henderson
2018-11-28 5:03 ` Dave Chinner
2018-11-28 3:49 ` [PATCH v1 5/7] xfs: Add device retry Allison Henderson
2018-11-28 5:08 ` Dave Chinner
2018-11-28 5:22 ` Darrick J. Wong
2018-11-28 5:38 ` Dave Chinner
2018-11-28 7:35 ` Christoph Hellwig
2018-11-28 12:41 ` Bob Liu
2018-11-28 16:47 ` Allison Henderson
2018-11-28 3:49 ` [PATCH v1 6/7] xfs: Rewrite retried read Allison Henderson
2018-11-28 5:17 ` Dave Chinner
2018-11-28 5:26 ` Darrick J. Wong
2018-11-28 5:40 ` Dave Chinner
2018-11-28 3:49 ` [PATCH v1 7/7] xfs: Add tracepoints and logging to alternate device retry Allison Henderson
2018-11-28 5:33 ` [RFC PATCH v1 0/7] Block/XFS: Support alternative mirror " Dave Chinner
2018-11-28 5:49 ` Darrick J. Wong
2018-11-28 6:30 ` Dave Chinner
2018-11-28 7:15 ` Darrick J. Wong
2018-11-28 19:38 ` Andreas Dilger
2018-11-28 7:37 ` Christoph Hellwig
2018-11-28 7:46 ` Dave Chinner
2018-11-28 7:51 ` Christoph Hellwig
2018-11-28 7:45 ` Christoph Hellwig
2018-12-08 14:49 ` Bob Liu
2018-12-10 4:30 ` Darrick J. Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1543376991-5764-4-git-send-email-allison.henderson@oracle.com \
--to=allison.henderson@oracle.com \
--cc=bob.liu@oracle.com \
--cc=linux-block@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-xfs@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=shirley.ma@oracle.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).