diff options
author | Philipp Reisner <philipp.reisner@linbit.com> | 2011-11-17 10:12:31 +0100 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2012-11-08 16:58:11 +0100 |
commit | d60de03a6694302b691bdf858ede9cbdfb7112d6 (patch) | |
tree | 030c1b5a84f5f23f9bad023b042391163be9bed5 /drivers/block/drbd/drbd_req.c | |
parent | 380207d08e7c4d1b19c0323777278992b4fbf9d6 (diff) | |
download | lwn-d60de03a6694302b691bdf858ede9cbdfb7112d6.tar.gz lwn-d60de03a6694302b691bdf858ede9cbdfb7112d6.zip |
drbd: Load balancing method: striping
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers/block/drbd/drbd_req.c')
-rw-r--r-- | drivers/block/drbd/drbd_req.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c index 98251e2a7fb7..5b28de0c5960 100644 --- a/drivers/block/drbd/drbd_req.c +++ b/drivers/block/drbd/drbd_req.c @@ -745,10 +745,11 @@ static bool drbd_may_do_local_read(struct drbd_conf *mdev, sector_t sector, int return drbd_bm_count_bits(mdev, sbnr, ebnr) == 0; } -static bool remote_due_to_read_balancing(struct drbd_conf *mdev) +static bool remote_due_to_read_balancing(struct drbd_conf *mdev, sector_t sector) { enum drbd_read_balancing rbm; struct backing_dev_info *bdi; + int stripe_shift; if (mdev->state.pdsk < D_UP_TO_DATE) return false; @@ -764,6 +765,14 @@ static bool remote_due_to_read_balancing(struct drbd_conf *mdev) case RB_LEAST_PENDING: return atomic_read(&mdev->local_cnt) > atomic_read(&mdev->ap_pending_cnt) + atomic_read(&mdev->rs_pending_cnt); + case RB_32K_STRIPING: /* stripe_shift = 15 */ + case RB_64K_STRIPING: + case RB_128K_STRIPING: + case RB_256K_STRIPING: + case RB_512K_STRIPING: + case RB_1M_STRIPING: /* stripe_shift = 20 */ + stripe_shift = (rbm - RB_32K_STRIPING + 15); + return (sector >> (stripe_shift - 9)) & 1; case RB_ROUND_ROBIN: return test_and_change_bit(READ_BALANCE_RR, &mdev->flags); case RB_PREFER_REMOTE: @@ -841,7 +850,7 @@ int __drbd_make_request(struct drbd_conf *mdev, struct bio *bio, unsigned long s bio_put(req->private_bio); req->private_bio = NULL; put_ldev(mdev); - } else if (remote_due_to_read_balancing(mdev)) { + } else if (remote_due_to_read_balancing(mdev, sector)) { /* Keep the private bio in case we need it for a local retry */ local = 0; |