[prev in list] [next in list] [prev in thread] [next in thread] 

List:       drbd-cvs
Subject:    [DRBD-cvs] svn commit by phil - r2648 - trunk/drbd - With this
From:       drbd-cvs () linbit ! com
Date:       2006-12-28 12:07:31
Message-ID: 20061228120731.EE1022DEACCF () mail ! linbit ! com
[Download RAW message or body]

Author: phil
Date: 2006-12-28 13:07:12 +0100 (Thu, 28 Dec 2006)
New Revision: 2648

Modified:
   trunk/drbd/drbd_int.h
   trunk/drbd/drbd_receiver.c
   trunk/drbd/drbd_worker.c
Log:
With this patch I try to make DRBD to send more big packets,
and less small packets. Somethimes I experienced that enabling
Jumbo frames decreased DRBD's preformance. Altough, I could
not reproduce this at time of writing the patch, I managed to
measure the distribution of the packet's sizes. This indicates
that the patch has the intended effect:

Distribution of packet sizen when writing 512MB of zeros:

      pkt           old-code        new-code
     sizes       send     recv   send     recv
    ----------  ------------------------------
     1 to  450:  42047   42259   38629   38784
   451 to  900:   4057    4230    2023    2176
   901 to 1350:    112    2919      54    2289
  1351 to 1800:   6697    7439    6698    7368
  1801 to 2250:     11      43       4       8
  2251 to 2700:   1643    1684    1838    2307
  2701 to 3150:      5      43       3      18
  3151 to 3600:      2      70       0      51
  3601 to 4050:     95     218       2     251
  4051 to 4500:   3159    3296       1      58
  4501 to 4950:     45     270       6     176
  4951 to 5400:     75     717      60     453
  5401 to 5850:    867     901    1376    1383
  5851 to 6300:    683     696     245     251
  6301 to 6750:    129     214      44      47
  6751 to 7200:     24      39     266     274
  7201 to 7650:    101     118     256     263
  7651 to 8100:     30    1829      70    2109
  8101 to 8550:     36      48      49      56
  8551 to 9000+: 14971   53657   15755   54992

-Phil


Modified: trunk/drbd/drbd_int.h
===================================================================
--- trunk/drbd/drbd_int.h	2006-12-27 15:45:41 UTC (rev 2647)
+++ trunk/drbd/drbd_int.h	2006-12-28 12:07:12 UTC (rev 2648)
@@ -35,6 +35,8 @@
 #include <linux/bitops.h>
 #include <linux/slab.h>
 #include <linux/crypto.h>
+#include <linux/tcp.h>
+#include <net/tcp.h>
 #include "lru_cache.h"
 
 // module parameter, defined in drbd_main.c
@@ -1336,6 +1338,35 @@
 extern void drbd_set_recv_tcq(drbd_dev *mdev, int tcq_enabled);
 extern void _drbd_clear_done_ee(drbd_dev *mdev);
 
+static inline void drbd_tcp_cork(struct socket *sock)
+{
+#if 1
+	mm_segment_t oldfs = get_fs();
+	int val = 1;
+
+	set_fs(KERNEL_DS);
+	tcp_setsockopt(sock->sk, SOL_TCP, TCP_CORK, (char*)&val, sizeof(val) );
+	set_fs(oldfs);
+#else
+	tcp_sk(sock->sk)->nonagle |= TCP_NAGLE_CORK;
+#endif
+}
+
+static inline void drbd_tcp_flush(struct socket *sock)
+{
+#if 1
+	mm_segment_t oldfs = get_fs();
+	int val = 0;
+
+	set_fs(KERNEL_DS);
+	tcp_setsockopt(sock->sk, SOL_TCP, TCP_CORK, (char*)&val, sizeof(val) );
+	set_fs(oldfs);
+#else
+	tcp_sk(sock->sk)->nonagle &= ~TCP_NAGLE_CORK;
+	tcp_push_pending_frames(sock->sk, tcp_sk(sock->sk));
+#endif
+}
+
 // drbd_proc.c
 extern struct proc_dir_entry *drbd_proc;
 extern struct file_operations drbd_proc_fops;

Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c	2006-12-27 15:45:41 UTC (rev 2647)
+++ trunk/drbd/drbd_receiver.c	2006-12-28 12:07:12 UTC (rev 2648)
@@ -31,8 +31,6 @@
 #include <asm/uaccess.h>
 #include <net/sock.h>
 
-#include <linux/tcp.h>
-
 #include <linux/version.h>
 #include <linux/fs.h>
 #include <linux/file.h>
@@ -764,7 +762,6 @@
 	msock->sk->sk_allocation = GFP_NOIO;
 
 	sock->sk->sk_priority=TC_PRIO_BULK;
-	tcp_sk(sock->sk)->nonagle = 0;
 	// FIXME fold to limits. should be done in drbd_ioctl
 	sock->sk->sk_sndbuf = mdev->net_conf->sndbuf_size;
 	sock->sk->sk_rcvbuf = mdev->net_conf->sndbuf_size;
@@ -777,7 +774,6 @@
 	sock->sk->sk_userlocks |= SOCK_SNDBUF_LOCK | SOCK_RCVBUF_LOCK;
 
 	msock->sk->sk_priority=TC_PRIO_INTERACTIVE;
-	tcp_sk(sock->sk)->nonagle = 1;
 	msock->sk->sk_sndbuf = 2*32767;
 	msock->sk->sk_sndtimeo = mdev->net_conf->timeout*HZ/10;
 	msock->sk->sk_rcvtimeo = mdev->net_conf->ping_int*HZ;
@@ -3279,12 +3275,16 @@
 			clear_bit(SIGNAL_ASENDER, &mdev->flags);
 			flush_signals(current);
 		}
+		drbd_tcp_flush(mdev->meta.socket);
+
 		rv = drbd_recv_short(mdev, mdev->meta.socket,
 				     buf,expect-received);
 		clear_bit(SIGNAL_ASENDER, &mdev->flags);
 
 		flush_signals(current);
 
+		drbd_tcp_cork(mdev->meta.socket);
+
 		/* Note:
 		 * -EINTR        (on meta) we got a signal
 		 * -EAGAIN       (on meta) rcvtimeo expired

Modified: trunk/drbd/drbd_worker.c
===================================================================
--- trunk/drbd/drbd_worker.c	2006-12-27 15:45:41 UTC (rev 2647)
+++ trunk/drbd/drbd_worker.c	2006-12-28 12:07:12 UTC (rev 2648)
@@ -850,13 +850,24 @@
 	drbd_dev *mdev = thi->mdev;
 	struct drbd_work *w = 0;
 	LIST_HEAD(work_list);
-	int intr,i;
+	int intr=0,i;
 
 	sprintf(current->comm, "drbd%d_worker", mdev_to_minor(mdev));
 
 	while (get_t_state(thi) == Running) {
-		intr = down_interruptible(&mdev->data.work.s);
 
+		if(down_trylock(&mdev->data.work.s)) {
+			down(&mdev->data.mutex);
+			if(mdev->data.socket)drbd_tcp_flush(mdev->data.socket);
+			up(&mdev->data.mutex);
+
+			intr = down_interruptible(&mdev->data.work.s);
+
+			down(&mdev->data.mutex);
+			if(mdev->data.socket) drbd_tcp_cork(mdev->data.socket);
+			up(&mdev->data.mutex);
+		}
+
 		if (intr) {
 			D_ASSERT(intr == -EINTR);
 			flush_signals(current);

_______________________________________________
drbd-cvs mailing list
drbd-cvs@lists.linbit.com
http://lists.linbit.com/mailman/listinfo/drbd-cvs
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic