[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