Commit d60de03a authored by Philipp Reisner's avatar Philipp Reisner

drbd: Load balancing method: striping

Signed-off-by: default avatarPhilipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: default avatarLars Ellenberg <lars.ellenberg@linbit.com>
parent 380207d0
...@@ -745,10 +745,11 @@ static bool drbd_may_do_local_read(struct drbd_conf *mdev, sector_t sector, int ...@@ -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; 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; enum drbd_read_balancing rbm;
struct backing_dev_info *bdi; struct backing_dev_info *bdi;
int stripe_shift;
if (mdev->state.pdsk < D_UP_TO_DATE) if (mdev->state.pdsk < D_UP_TO_DATE)
return false; return false;
...@@ -764,6 +765,14 @@ static bool remote_due_to_read_balancing(struct drbd_conf *mdev) ...@@ -764,6 +765,14 @@ static bool remote_due_to_read_balancing(struct drbd_conf *mdev)
case RB_LEAST_PENDING: case RB_LEAST_PENDING:
return atomic_read(&mdev->local_cnt) > return atomic_read(&mdev->local_cnt) >
atomic_read(&mdev->ap_pending_cnt) + atomic_read(&mdev->rs_pending_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: case RB_ROUND_ROBIN:
return test_and_change_bit(READ_BALANCE_RR, &mdev->flags); return test_and_change_bit(READ_BALANCE_RR, &mdev->flags);
case RB_PREFER_REMOTE: case RB_PREFER_REMOTE:
...@@ -841,7 +850,7 @@ int __drbd_make_request(struct drbd_conf *mdev, struct bio *bio, unsigned long s ...@@ -841,7 +850,7 @@ int __drbd_make_request(struct drbd_conf *mdev, struct bio *bio, unsigned long s
bio_put(req->private_bio); bio_put(req->private_bio);
req->private_bio = NULL; req->private_bio = NULL;
put_ldev(mdev); 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 /* Keep the private bio in case we need it
for a local retry */ for a local retry */
local = 0; local = 0;
......
...@@ -108,6 +108,12 @@ enum drbd_read_balancing { ...@@ -108,6 +108,12 @@ enum drbd_read_balancing {
RB_ROUND_ROBIN, RB_ROUND_ROBIN,
RB_LEAST_PENDING, RB_LEAST_PENDING,
RB_CONGESTED_REMOTE, RB_CONGESTED_REMOTE,
RB_32K_STRIPING,
RB_64K_STRIPING,
RB_128K_STRIPING,
RB_256K_STRIPING,
RB_512K_STRIPING,
RB_1M_STRIPING,
}; };
/* KEEP the order, do not delete or insert. Only append. */ /* KEEP the order, do not delete or insert. Only append. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment