drbd: Load balancing method: striping
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
This commit is contained in:
@@ -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)
|
|||||||
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
|
|||||||
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 {
|
|||||||
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. */
|
||||||
|
Reference in New Issue
Block a user