[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