drbd: Load balancing method: striping
authorPhilipp Reisner <philipp.reisner@linbit.com>
Thu, 17 Nov 2011 09:12:31 +0000 (10:12 +0100)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Thu, 8 Nov 2012 15:58:11 +0000 (16:58 +0100)
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
drivers/block/drbd/drbd_req.c
include/linux/drbd.h

index 98251e2a7fb78a0a1ddcf519253380d6028fedfb..5b28de0c59600a7f61e1b61b436b84633c4a4023 100644 (file)
@@ -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;
index 157ba3d74dc76542a96a1ed3a14618b8ecc2e68f..1e86156c10f70ad06c2ae127e959978002ac7313 100644 (file)
@@ -108,6 +108,12 @@ enum drbd_read_balancing {
        RB_ROUND_ROBIN,
        RB_LEAST_PENDING,
        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. */