[DRBD-cvs] svn commit by phil - r2008 - trunk/drbd - Made the syncer to commulate adjacent bits into bigger

drbd-cvs at lists.linbit.com drbd-cvs at lists.linbit.com
Fri Nov 18 23:36:12 CET 2005


Author: phil
Date: 2005-11-18 23:36:10 +0100 (Fri, 18 Nov 2005)
New Revision: 2008

Modified:
   trunk/drbd/drbd_actlog.c
   trunk/drbd/drbd_bitmap.c
   trunk/drbd/drbd_int.h
   trunk/drbd/drbd_main.c
   trunk/drbd/drbd_receiver.c
   trunk/drbd/drbd_worker.c
Log:
Made the syncer to commulate adjacent bits into bigger requests.
This uncovered quite a few places where we still assumed that 
an requests is PAGE_SIZE at maximum. Fixed all this.

BTW, finding the issue with the __bio_for_each_segment() in
     _drbd_send_zc_bio() was quite time consuming.


Modified: trunk/drbd/drbd_actlog.c
===================================================================
--- trunk/drbd/drbd_actlog.c	2005-11-18 13:51:23 UTC (rev 2007)
+++ trunk/drbd/drbd_actlog.c	2005-11-18 22:36:10 UTC (rev 2008)
@@ -645,7 +645,7 @@
 	sector_t esector, nr_sectors;
 	int wake_up=0;
 
-	if (size <= 0 || (size & 0x1ff) != 0 || size > PAGE_SIZE) {
+	if (size <= 0 || (size & 0x1ff) != 0 || size > DRBD_MAX_SEGMENT_SIZE) {
 		ERR("drbd_set_in_sync: sector=%lu size=%d nonsense!\n",
 				(unsigned long)sector,size);
 		return;

Modified: trunk/drbd/drbd_bitmap.c
===================================================================
--- trunk/drbd/drbd_bitmap.c	2005-11-18 13:51:23 UTC (rev 2007)
+++ trunk/drbd/drbd_bitmap.c	2005-11-18 22:36:10 UTC (rev 2008)
@@ -782,6 +782,19 @@
 	return i;
 }
 
+void drbd_bm_set_find(drbd_dev *mdev, unsigned long i)
+{
+	struct drbd_bitmap *b = mdev->bitmap;
+
+	spin_lock_irq(&b->bm_lock);
+	BM_PARANOIA_CHECK();
+
+	b->bm_fo = i;
+
+	spin_unlock_irq(&b->bm_lock);
+}
+
+
 int drbd_bm_rs_done(drbd_dev *mdev)
 {
 	return mdev->bitmap->bm_fo == 0;

Modified: trunk/drbd/drbd_int.h
===================================================================
--- trunk/drbd/drbd_int.h	2005-11-18 13:51:23 UTC (rev 2007)
+++ trunk/drbd/drbd_int.h	2005-11-18 22:36:10 UTC (rev 2008)
@@ -955,6 +955,9 @@
 #define BM_WORDS_PER_AL_EXT (1 << (AL_EXTENT_SIZE_B-BM_BLOCK_SIZE_B-LN2_BPL))
 
 
+#define BM_BLOCKS_PER_BM_EXT_B ( BM_EXT_SIZE_B - BM_BLOCK_SIZE_B )
+#define BM_BLOCKS_PER_BM_EXT_MASK  ( (1<<BM_BLOCKS_PER_BM_EXT_B) - 1 )
+
 /* I want the packet to fit within one page
  * THINK maybe use a special bitmap header,
  * including offset and compression scheme and whatnot
@@ -995,7 +998,7 @@
  * With a value of 6 all IO in one 32K block make it to the same slot of the
  * hash table. */
 #define HT_SHIFT 6
-#define DRBD_MAX_SEGMENT_SIZE (1UL<<(9+HT_SHIFT))
+#define DRBD_MAX_SEGMENT_SIZE (1U<<(9+HT_SHIFT))
 
 /* Number of elements in the app_reads_hash */
 #define APP_R_HSIZE 15
@@ -1018,6 +1021,7 @@
 extern size_t        drbd_bm_words       (drbd_dev *mdev);
 extern sector_t      drbd_bm_capacity    (drbd_dev *mdev);
 extern unsigned long drbd_bm_find_next   (drbd_dev *mdev);
+extern void drbd_bm_set_find(drbd_dev *mdev, unsigned long i);
 extern unsigned long drbd_bm_total_weight(drbd_dev *mdev);
 extern int drbd_bm_rs_done(drbd_dev *mdev);
 // for receive_bitmap

Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c	2005-11-18 13:51:23 UTC (rev 2007)
+++ trunk/drbd/drbd_main.c	2005-11-18 22:36:10 UTC (rev 2008)
@@ -1362,8 +1362,7 @@
 {
 	struct bio_vec *bvec;
 	int i;
-
-	bio_for_each_segment(bvec, bio, i) {
+	__bio_for_each_segment(bvec, bio, i, 0) {
 		if (! _drbd_send_page(mdev, bvec->bv_page, bvec->bv_offset,
 				      bvec->bv_len) ) {
 			return 0;

Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c	2005-11-18 13:51:23 UTC (rev 2007)
+++ trunk/drbd/drbd_receiver.c	2005-11-18 22:36:10 UTC (rev 2008)
@@ -720,7 +720,7 @@
 	h->command = be16_to_cpu(h->command);
 	h->length  = be16_to_cpu(h->length);
 	if (unlikely( h->magic != BE_DRBD_MAGIC )) {
-		ERR("magic?? m: 0x%lx c: %d l: %d\n",
+		ERR("magic?? on data m: 0x%lx c: %d l: %d\n",
 		    (long)be32_to_cpu(h->magic),
 		    h->command, h->length);
 		return FALSE;
@@ -989,7 +989,7 @@
 	 */
 	ERR_IF(data_size == 0) return FALSE;
 	ERR_IF(data_size &  0x1ff) return FALSE;
-	ERR_IF(data_size >  PAGE_SIZE) return FALSE;
+	ERR_IF(data_size >  DRBD_MAX_SEGMENT_SIZE) return FALSE;
 
 	if (drbd_recv(mdev, h->payload, header_size) != header_size)
 		return FALSE;
@@ -1136,7 +1136,6 @@
 	header_size = sizeof(*p) - sizeof(*h);
 	data_size   = h->length  - header_size;
 
-	if( data_size > 4096 ) INFO("data_size=%d\n",data_size);
 	ERR_IF(data_size == 0) return FALSE;
 	ERR_IF(data_size &  0x1ff) return FALSE;
 	ERR_IF(data_size >  DRBD_MAX_SEGMENT_SIZE) return FALSE;
@@ -2910,7 +2909,7 @@
 			cmd = be16_to_cpu(h->command);
 			len = be16_to_cpu(h->length);
 			if (unlikely( h->magic != BE_DRBD_MAGIC )) {
-				ERR("magic?? m: 0x%lx c: %d l: %d\n",
+				ERR("magic?? on meta m: 0x%lx c: %d l: %d\n",
 				    (long)be32_to_cpu(h->magic),
 				    h->command, h->length);
 				goto err;

Modified: trunk/drbd/drbd_worker.c
===================================================================
--- trunk/drbd/drbd_worker.c	2005-11-18 13:51:23 UTC (rev 2007)
+++ trunk/drbd/drbd_worker.c	2005-11-18 22:36:10 UTC (rev 2008)
@@ -348,6 +348,20 @@
 			goto next_sector;
 		}
 
+#if DRBD_MAX_SEGMENT_SIZE > BM_BLOCK_SIZE
+		// try to find some adjacent bits...
+		while ( drbd_bm_test_bit(mdev,bit+1) ) {
+			// stop if we have the already the maximum req size
+			if(size == DRBD_MAX_SEGMENT_SIZE) break;
+			// do not leafe the current BM_EXTEND
+			if(( (bit+1) & BM_BLOCKS_PER_BM_EXT_MASK ) == 0) break;
+			bit++;
+			size += BM_BLOCK_SIZE;
+			i++;
+		}
+		drbd_bm_set_find(mdev,bit+1);
+#endif
+
 		if (sector + (size>>9) > capacity) size = (capacity-sector)<<9;
 		inc_rs_pending(mdev);
 		if(!drbd_send_drequest(mdev,RSDataRequest,



More information about the drbd-cvs mailing list