[DRBD-cvs] r1600 - branches/drbd-0.7/drbd

svn at svn.drbd.org svn at svn.drbd.org
Tue Oct 19 11:11:52 CEST 2004


Author: lars
Date: 2004-10-19 11:11:49 +0200 (Tue, 19 Oct 2004)
New Revision: 1600

Modified:
   branches/drbd-0.7/drbd/drbd_int.h
   branches/drbd-0.7/drbd/drbd_main.c
   branches/drbd-0.7/drbd/drbd_receiver.c
   branches/drbd-0.7/drbd/drbd_req.c
   branches/drbd-0.7/drbd/drbd_worker.c
Log:
get rid of the HERE macro
provide (experimental) code for decreasing latency on 2.6 kernels by pushing the tcp stack

Modified: branches/drbd-0.7/drbd/drbd_int.h
===================================================================
--- branches/drbd-0.7/drbd/drbd_int.h	2004-10-19 08:09:02 UTC (rev 1599)
+++ branches/drbd-0.7/drbd/drbd_int.h	2004-10-19 09:11:49 UTC (rev 1600)
@@ -32,7 +32,8 @@
 #include <linux/list.h>
 #include <linux/sched.h>
 #include <linux/bitops.h>
-#include <linux/slab.h> 
+#include <linux/slab.h>
+
 #include "lru_cache.h"
 
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,8)
@@ -226,8 +227,6 @@
 	 _b; \
 	}))
 
-// to debug dec_*(), while we still have the <0!! issue
-// to debug dec_*(), while we still have the <0!! issue
 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,9)
 #include <linux/stringify.h>
 #else
@@ -236,8 +235,6 @@
 #define __stringify(x)		__stringify_1(x)
 #endif
 
-#define HERE __stringify(__FILE__ __LINE__) // __FUNCTION__
-
 // integer division, round _UP_ to the next integer
 #define div_ceil(A,B) ( (A)/(B) + ((A)%(B) ? 1 : 0) )
 // usual integer division
@@ -1317,47 +1314,84 @@
 	atomic_inc(&mdev->ap_pending_cnt);
 }
 
-static inline void dec_ap_pending(drbd_dev* mdev, const char* where)
-{
-	if(atomic_dec_and_test(&mdev->ap_pending_cnt))
-		wake_up(&mdev->cstate_wait);
+#define ERR_IF_CNT_IS_NEGATIVE(which)				\
+	if(atomic_read(&mdev->which)<0)				\
+		ERR("in %s:%d: " #which " = %d < 0 !\n",	\
+		    __func__ , __LINE__ ,			\
+		    atomic_read(&mdev->which))
 
-	if(atomic_read(&mdev->ap_pending_cnt)<0)
-		ERR("in %s: pending_cnt = %d < 0 !\n",
-		    where,
-		    atomic_read(&mdev->ap_pending_cnt));
-}
+#define dec_ap_pending(mdev)					\
+	typecheck(drbd_dev*,mdev);				\
+	if(atomic_dec_and_test(&mdev->ap_pending_cnt))		\
+		wake_up(&mdev->cstate_wait);			\
+	ERR_IF_CNT_IS_NEGATIVE(ap_pending_cnt)
 
 static inline void inc_rs_pending(drbd_dev* mdev)
 {
 	atomic_inc(&mdev->rs_pending_cnt);
 }
 
-static inline void dec_rs_pending(drbd_dev* mdev, const char* where)
-{
-	atomic_dec(&mdev->rs_pending_cnt);
+#define dec_rs_pending(mdev)					\
+	typecheck(drbd_dev*,mdev);				\
+	atomic_dec(&mdev->rs_pending_cnt);			\
+	ERR_IF_CNT_IS_NEGATIVE(rs_pending_cnt)
 
-	if(atomic_read(&mdev->rs_pending_cnt)<0) 
-		ERR("in %s: rs_pending_cnt = %d < 0 !\n",
-		    where,
-		    atomic_read(&mdev->unacked_cnt));
-}
-
 static inline void inc_unacked(drbd_dev* mdev)
 {
 	atomic_inc(&mdev->unacked_cnt);
 }
 
-static inline void dec_unacked(drbd_dev* mdev,const char* where)
+#if 0 && LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+/*
+ * idea was to forcefully push the tcp stack whenever the
+ * currently last pending packet is in the buffer.
+ * should be benchmarked on some real box to see if it has any
+ * effect on overall latency.
+ */
+
+/* this only works with 2.6 kernels because of some conflicting defines
+ * in header files included from net.tcp.h.
+ */
+
+#include <net/tcp.h>
+static inline void drbd_push_msock(drbd_dev* mdev)
 {
-	atomic_dec(&mdev->unacked_cnt);
-
-	if(atomic_read(&mdev->unacked_cnt)<0)
-		ERR("in %s: unacked_cnt = %d < 0 !\n",
-		    where,
-		    atomic_read(&mdev->unacked_cnt));
+	struct sock    *sk;
+	struct tcp_opt *tp;
+	if (mdev->meta.socket == NULL) return;
+	sk = mdev->meta.socket->sk;
+	tp = tcp_sk(sk);
+	lock_sock(sk);
+	__tcp_push_pending_frames(sk, tp, tcp_current_mss(sk, 1), TCP_NAGLE_PUSH);
+	release_sock(sk);
 }
 
+#define dec_unacked(mdev)					\
+	might_sleep();						\
+	typecheck(drbd_dev*,mdev);				\
+	if (atomic_dec_and_test(&mdev->unacked_cnt))		\
+		drbd_push_msock(mdev);				\
+	ERR_IF_CNT_IS_NEGATIVE(unacked_cnt);
+
+#define sub_unacked(mdev, n)					\
+	might_sleep();						\
+	typecheck(drbd_dev*,mdev);				\
+	if (atomic_sub_and_test(n, &mdev->unacked_cnt))		\
+		drbd_push_msock(mdev);				\
+	ERR_IF_CNT_IS_NEGATIVE(unacked_cnt);
+#else
+#define dec_unacked(mdev)					\
+	typecheck(drbd_dev*,mdev);				\
+	atomic_dec(&mdev->unacked_cnt);				\
+	ERR_IF_CNT_IS_NEGATIVE(unacked_cnt)
+
+#define sub_unacked(mdev, n)					\
+	typecheck(drbd_dev*,mdev);				\
+	atomic_sub(n, &mdev->unacked_cnt);			\
+	ERR_IF_CNT_IS_NEGATIVE(unacked_cnt)
+#endif
+
+
 /**
  * inc_local: Returns TRUE when local IO is possible. If it returns
  * TRUE you should call dec_local() after IO is completed.

Modified: branches/drbd-0.7/drbd/drbd_main.c
===================================================================
--- branches/drbd-0.7/drbd/drbd_main.c	2004-10-19 08:09:02 UTC (rev 1599)
+++ branches/drbd-0.7/drbd/drbd_main.c	2004-10-19 09:11:49 UTC (rev 1600)
@@ -341,7 +341,7 @@
 			size   = drbd_req_get_size(r);
 			if( !(r->rq_status & RQ_DRBD_SENT) ) {
 				if(mdev->conf.wire_protocol != DRBD_PROT_A )
-					dec_ap_pending(mdev,HERE);
+					dec_ap_pending(mdev);
 				drbd_end_req(r,RQ_DRBD_SENT,ERF_NOTLD|1, sector);
 				goto mark;
 			}
@@ -354,7 +354,7 @@
 		b=b->next;
 		list_del(&f->requests);
 		kfree(f);
-		dec_ap_pending(mdev,HERE); // for the barrier
+		dec_ap_pending(mdev); // for the barrier
 	}
 }
 
@@ -801,7 +801,7 @@
 	inc_ap_pending(mdev);
 	ok = _drbd_send_cmd(mdev,mdev->data.socket,Barrier,(Drbd_Header*)&p,sizeof(p),0);
 
-//	if (!ok) dec_ap_pending(mdev,HERE); // is done in tl_clear()
+//	if (!ok) dec_ap_pending(mdev); // is done in tl_clear()
 	return ok;
 }
 

Modified: branches/drbd-0.7/drbd/drbd_receiver.c
===================================================================
--- branches/drbd-0.7/drbd/drbd_receiver.c	2004-10-19 08:09:02 UTC (rev 1599)
+++ branches/drbd-0.7/drbd/drbd_receiver.c	2004-10-19 09:11:49 UTC (rev 1600)
@@ -441,6 +441,7 @@
 {
 	struct list_head *le;
 	struct Tl_epoch_entry *e;
+	int n = 0;
 
 	spin_lock_irq(&mdev->ee_lock);
 
@@ -452,12 +453,14 @@
 		e = list_entry(le, struct Tl_epoch_entry, w.list);
 		if(mdev->conf.wire_protocol == DRBD_PROT_C ||
 		   is_syncer_blk(mdev,e->block_id)) {
-			dec_unacked(mdev,HERE);
+			++n;
 		}
 		drbd_put_ee(mdev,e);
 	}
 
 	spin_unlock_irq(&mdev->ee_lock);
+
+	sub_unacked(mdev, n);
 }
 
 
@@ -809,7 +812,7 @@
 	spin_unlock_irq(&mdev->ee_lock);
 
 	rv &= drbd_send_b_ack(mdev, p->barrier, epoch_size);
-	dec_unacked(mdev,HERE);
+	dec_unacked(mdev);
 
 	return rv;
 }
@@ -877,7 +880,7 @@
 	drbd_bio_endio(bio,ok);
 	dec_ap_bio(mdev);
 
-	dec_ap_pending(mdev,HERE);
+	dec_ap_pending(mdev);
 	return ok;
 }
 
@@ -904,8 +907,8 @@
 		ok = drbd_send_ack(mdev,NegAck,e);
 		ok&= drbd_io_error(mdev);
 	}
+	dec_unacked(mdev);
 
-	dec_unacked(mdev,HERE);
 	return ok;
 }
 
@@ -916,7 +919,7 @@
 	e = read_in_block(mdev,data_size);
 	if(!e) return FALSE;
 
-	dec_rs_pending(mdev,HERE);
+	dec_rs_pending(mdev);
 
 	e->block_id = ID_SYNCER;
 	if(!inc_local(mdev)) {
@@ -1029,7 +1032,7 @@
 			 * maybe assert this?
 			 */
 		}
-		dec_unacked(mdev,HERE);
+		dec_unacked(mdev);
 
 		return ok;
 	}
@@ -1610,7 +1613,7 @@
 
 		drbd_bio_IO_error(bio);
 		dec_ap_bio(mdev);
-		dec_ap_pending(mdev,HERE);
+		dec_ap_pending(mdev);
 
 		INVALIDATE_MAGIC(req);
 		mempool_free(req,drbd_request_mempool);
@@ -2046,10 +2049,10 @@
 	}
 
 	if(is_syncer_blk(mdev,p->block_id)) {
-		dec_rs_pending(mdev,HERE);
+		dec_rs_pending(mdev);
 	} else {
 		D_ASSERT(mdev->conf.wire_protocol != DRBD_PROT_A);
-		dec_ap_pending(mdev,HERE);
+		dec_ap_pending(mdev);
 	}
 	return TRUE;
 }
@@ -2067,7 +2070,7 @@
 	 * and will do the cleanup then and there.
 	 */
 	if(is_syncer_blk(mdev,p->block_id)) {
-		dec_rs_pending(mdev,HERE);
+		dec_rs_pending(mdev);
 	}
 #if 0
 	else {
@@ -2132,7 +2135,7 @@
 	if(unlikely(test_bit(PARTNER_DISKLESS,&mdev->flags))) return TRUE;
 
 	tl_release(mdev,p->barrier,be32_to_cpu(p->set_size));
-	dec_ap_pending(mdev,HERE);
+	dec_ap_pending(mdev);
 
 	return TRUE;
 }

Modified: branches/drbd-0.7/drbd/drbd_req.c
===================================================================
--- branches/drbd-0.7/drbd/drbd_req.c	2004-10-19 08:09:02 UTC (rev 1599)
+++ branches/drbd-0.7/drbd/drbd_req.c	2004-10-19 09:11:49 UTC (rev 1600)
@@ -316,10 +316,10 @@
 			if (!drbd_send_dblock(mdev,req)) {
 				if (mdev->cstate >= Connected)
 					set_cstate(mdev,NetworkFailure);
-				dec_ap_pending(mdev,HERE);
+				dec_ap_pending(mdev);
 				drbd_thread_restart_nowait(&mdev->receiver);
 			} else if(mdev->conf.wire_protocol == DRBD_PROT_A) {
-				dec_ap_pending(mdev,HERE);
+				dec_ap_pending(mdev);
 				drbd_end_req(req, RQ_DRBD_SENT, 1, sector);
 			}
 		} else if (target_area_out_of_sync) {

Modified: branches/drbd-0.7/drbd/drbd_worker.c
===================================================================
--- branches/drbd-0.7/drbd/drbd_worker.c	2004-10-19 08:09:02 UTC (rev 1599)
+++ branches/drbd-0.7/drbd/drbd_worker.c	2004-10-19 09:11:49 UTC (rev 1600)
@@ -502,7 +502,7 @@
 		if(!drbd_send_drequest(mdev,RSDataRequest,
 				       sector,size,ID_SYNCER)) {
 			ERR("drbd_send_drequest() failed, aborting...");
-			dec_rs_pending(mdev,HERE);
+			dec_rs_pending(mdev);
 			return 0; // FAILED. worker will abort!
 		}
 	}
@@ -569,7 +569,7 @@
 		spin_lock_irq(&mdev->ee_lock);
 		drbd_put_ee(mdev,e);
 		spin_unlock_irq(&mdev->ee_lock);
-		dec_unacked(mdev,HERE);
+		dec_unacked(mdev);
 		return 1;
 	}
 
@@ -582,7 +582,7 @@
 		drbd_io_error(mdev);
 	}
 
-	dec_unacked(mdev,HERE);
+	dec_unacked(mdev);
 
 	spin_lock_irq(&mdev->ee_lock);
 	if( page_count(drbd_bio_get_page(&e->private_bio)) > 1 ) {
@@ -606,7 +606,7 @@
 		spin_lock_irq(&mdev->ee_lock);
 		drbd_put_ee(mdev,e);
 		spin_unlock_irq(&mdev->ee_lock);
-		dec_unacked(mdev,HERE);
+		dec_unacked(mdev);
 		return 1;
 	}
 
@@ -628,7 +628,7 @@
 		drbd_io_error(mdev);
 	}
 
-	dec_unacked(mdev,HERE);
+	dec_unacked(mdev);
 
 	spin_lock_irq(&mdev->ee_lock);
 	if( page_count(drbd_bio_get_page(&e->private_bio)) > 1 ) {



More information about the drbd-cvs mailing list