drbd: improve resync request throttling due to sendbuf size
authorLars Ellenberg <lars.ellenberg@linbit.com>
Fri, 31 Jan 2014 13:55:12 +0000 (14:55 +0100)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Thu, 10 Jul 2014 16:35:04 +0000 (18:35 +0200)
If we throttle resync because the socket sendbuffer is filling up,
tell TCP about it, so it may expand the sendbuffer for us.

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

index 6532a697cf497991847e95f45bcd9cdb16936073..0b5e4294acf983cc6b7d63353b70754d2d7df6f2 100644 (file)
@@ -592,7 +592,7 @@ static int make_resync_request(struct drbd_device *const device, int cancel)
        const sector_t capacity = drbd_get_capacity(device->this_bdev);
        int max_bio_size;
        int number, rollback_i, size;
-       int align, queued, sndbuf;
+       int align, requeue = 0;
        int i = 0;
 
        if (unlikely(cancel))
@@ -619,17 +619,22 @@ static int make_resync_request(struct drbd_device *const device, int cancel)
                goto requeue;
 
        for (i = 0; i < number; i++) {
-               /* Stop generating RS requests, when half of the send buffer is filled */
+               /* Stop generating RS requests when half of the send buffer is filled,
+                * but notify TCP that we'd like to have more space. */
                mutex_lock(&connection->data.mutex);
                if (connection->data.socket) {
-                       queued = connection->data.socket->sk->sk_wmem_queued;
-                       sndbuf = connection->data.socket->sk->sk_sndbuf;
-               } else {
-                       queued = 1;
-                       sndbuf = 0;
-               }
+                       struct sock *sk = connection->data.socket->sk;
+                       int queued = sk->sk_wmem_queued;
+                       int sndbuf = sk->sk_sndbuf;
+                       if (queued > sndbuf / 2) {
+                               requeue = 1;
+                               if (sk->sk_socket)
+                                       set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
+                       }
+               } else
+                       requeue = 1;
                mutex_unlock(&connection->data.mutex);
-               if (queued > sndbuf / 2)
+               if (requeue)
                        goto requeue;
 
 next_sector:
This page took 0.025381 seconds and 5 git commands to generate.