drbd: Actually allow BIOs up to 128k (was 32k).
authorPhilipp Reisner <philipp.reisner@linbit.com>
Mon, 23 Aug 2010 13:18:33 +0000 (15:18 +0200)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Thu, 14 Oct 2010 16:38:25 +0000 (18:38 +0200)
Now we have multiple BIOs per ee, packets with a 32 bit length field,
it gets time to use these goodies.

Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
drivers/block/drbd/drbd_int.h
drivers/block/drbd/drbd_main.c
drivers/block/drbd/drbd_nl.c
drivers/block/drbd/drbd_receiver.c

index db7e655..58dc02b 100644 (file)
@@ -1389,11 +1389,13 @@ struct bm_extent {
 #endif
 
 /* Sector shift value for the "hash" functions of tl_hash and ee_hash tables.
- * With a value of 6 all IO in one 32K block make it to the same slot of the
+ * With a value of 8 all IO in one 128K block make it to the same slot of the
  * hash table. */
-#define HT_SHIFT 6
+#define HT_SHIFT 8
 #define DRBD_MAX_SEGMENT_SIZE (1U<<(9+HT_SHIFT))
 
+#define DRBD_MAX_SIZE_H80_PACKET (1 << 15) /* The old header only allows packets up to 32Kib data */
+
 /* Number of elements in the app_reads_hash */
 #define APP_R_HSIZE 15
 
index f3f4ea9..71c4c26 100644 (file)
@@ -2447,7 +2447,7 @@ int drbd_send_dblock(struct drbd_conf *mdev, struct drbd_request *req)
        dgs = (mdev->agreed_pro_version >= 87 && mdev->integrity_w_tfm) ?
                crypto_hash_digestsize(mdev->integrity_w_tfm) : 0;
 
-       if (req->size <= (1 << 15)) {
+       if (req->size <= DRBD_MAX_SIZE_H80_PACKET) {
                p.head.h80.magic   = BE_DRBD_MAGIC;
                p.head.h80.command = cpu_to_be16(P_DATA);
                p.head.h80.length  =
@@ -2518,7 +2518,7 @@ int drbd_send_block(struct drbd_conf *mdev, enum drbd_packets cmd,
        dgs = (mdev->agreed_pro_version >= 87 && mdev->integrity_w_tfm) ?
                crypto_hash_digestsize(mdev->integrity_w_tfm) : 0;
 
-       if (e->size <= (1 << 15)) {
+       if (e->size <= DRBD_MAX_SIZE_H80_PACKET) {
                p.head.h80.magic   = BE_DRBD_MAGIC;
                p.head.h80.command = cpu_to_be16(cmd);
                p.head.h80.length  =
index 6b35d41..97fb2c2 100644 (file)
@@ -1063,7 +1063,9 @@ static int drbd_nl_disk_conf(struct drbd_conf *mdev, struct drbd_nl_cfg_req *nlp
        mdev->read_cnt = 0;
        mdev->writ_cnt = 0;
 
-       drbd_setup_queue_param(mdev, DRBD_MAX_SEGMENT_SIZE);
+       drbd_setup_queue_param(mdev, mdev->state.conn == C_CONNECTED &&
+                              mdev->agreed_pro_version < 95 ?
+                              DRBD_MAX_SIZE_H80_PACKET : DRBD_MAX_SEGMENT_SIZE);
 
        /* If I am currently not R_PRIMARY,
         * but meta data primary indicator is set,
index fe30864..4249117 100644 (file)
@@ -925,6 +925,11 @@ retry:
 
        drbd_thread_start(&mdev->asender);
 
+       if (mdev->agreed_pro_version < 95 && get_ldev(mdev)) {
+               drbd_setup_queue_param(mdev, DRBD_MAX_SIZE_H80_PACKET);
+               put_ldev(mdev);
+       }
+
        if (!drbd_send_protocol(mdev))
                return -1;
        drbd_send_sync_param(mdev, &mdev->sync_conf);