[DRBD-cvs] drbd by phil; Implemented the IO-HINTS (unfortunately ...

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Sun, 25 Jan 2004 20:03:55 +0100 (CET)


DRBD CVS committal

Author  : phil
Module  : drbd

Dir     : drbd/drbd


Modified Files:
      Tag: rel-0_7-branch
	drbd_compat_wrappers.h drbd_fs.c drbd_int.h drbd_main.c 
	drbd_receiver.c drbd_req-2.4.c 


Log Message:
Implemented the IO-HINTS (unfortunately parially still called WRITE-HINTS
in some places) for Linux-2.6.

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_compat_wrappers.h,v
retrieving revision 1.1.2.6
retrieving revision 1.1.2.7
diff -u -3 -r1.1.2.6 -r1.1.2.7
--- drbd_compat_wrappers.h	25 Jan 2004 10:18:19 -0000	1.1.2.6
+++ drbd_compat_wrappers.h	25 Jan 2004 19:03:50 -0000	1.1.2.7
@@ -281,6 +281,11 @@
 	wait_on_buffer(bh);
 }
 
+static inline void drbd_kick_lo(drbd_dev *mdev)
+{
+	run_task_queue(&tq_disk);
+}
+
 static inline int _drbd_send_zc_bio(drbd_dev *mdev, struct buffer_head *bh)
 {
 	struct page *page = bh->b_page;
@@ -463,6 +468,11 @@
 
 static inline void drbd_generic_make_request_wait(int rw, struct bio *bio)
 {
+}
+
+static inline void drbd_kick_lo(drbd_dev *mdev)
+{
+	blk_run_queue(bdev_get_queue(mdev->backing_bdev)); 
 }
 
 static inline int _drbd_send_zc_bio(drbd_dev *mdev, struct bio *bio)
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_fs.c,v
retrieving revision 1.28.2.51
retrieving revision 1.28.2.52
diff -u -3 -r1.28.2.51 -r1.28.2.52
--- drbd_fs.c	25 Jan 2004 00:38:09 -0000	1.28.2.51
+++ drbd_fs.c	25 Jan 2004 19:03:50 -0000	1.28.2.52
@@ -142,8 +142,8 @@
 	struct file *filp = 0;
 	struct file *filp2 = 0;
 	struct inode *inode;
-	NOT_IN_26(kdev_t ll_dev);
-	ONLY_IN_26(struct block_device *bdev);
+	NOT_IN_26(kdev_t ll_dev;)
+	ONLY_IN_26(struct block_device *bdev;)
 
 	/*
 	if (!capable(CAP_SYS_ADMIN)) //MAYBE: Move this to the drbd_ioctl()
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.104
retrieving revision 1.58.2.105
diff -u -3 -r1.58.2.104 -r1.58.2.105
--- drbd_int.h	24 Jan 2004 18:28:26 -0000	1.58.2.104
+++ drbd_int.h	25 Jan 2004 19:03:50 -0000	1.58.2.105
@@ -920,39 +920,6 @@
 })
 #endif
 
-// the same, without timeout,
-// but with run_task_queue(&tq_disk) just before the schedule()
-// THINK whether we want to be interruptible or not
-#define __wait_disk_event_interruptible(wq, condition)			\
-do {									\
-	wait_queue_t __wait;						\
-	init_waitqueue_entry(&__wait, current);				\
-									\
-	add_wait_queue(&wq, &__wait);					\
-	for (;;) {							\
-		set_current_state(TASK_INTERRUPTIBLE);			\
-		if (condition)						\
-			break;						\
-		if (!signal_pending(current)) {				\
-			run_task_queue(&tq_disk);			\
-			schedule();					\
-			continue;					\
-		}							\
-		ret = -ERESTARTSYS;					\
-		break;							\
-	}								\
-	current->state = TASK_RUNNING;					\
-	remove_wait_queue(&wq, &__wait);				\
-} while (0)
-
-#define wait_disk_event_interruptible(wq, condition)			\
-do {									\
-	if (condition)							\
-		break;							\
-	__wait_disk_event_interruptible(wq, condition);			\
-} while (0)
-
-
 /*
  * inline helper functions
  *************************/
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.107
retrieving revision 1.73.2.108
diff -u -3 -r1.73.2.107 -r1.73.2.108
--- drbd_main.c	25 Jan 2004 10:18:19 -0000	1.73.2.107
+++ drbd_main.c	25 Jan 2004 19:03:50 -0000	1.73.2.108
@@ -942,6 +942,7 @@
 	return 0;
 }
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
 STATIC void drbd_send_write_hint(void *data)
 {
 	struct Drbd_Conf* mdev = (drbd_dev*)data;
@@ -963,8 +964,6 @@
 	   by one of our threads?
 	 */
 
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
 	for (i = 0; i < minor_count; i++) {
 		if(current == drbd_conf[i].receiver.task) {
 			queue_task(&mdev->write_hint_tq, &tq_disk);
@@ -980,11 +979,33 @@
 			clear_bit(WRITE_HINT_QUEUED, &mdev->flags);
 		} else queue_task(&mdev->write_hint_tq, &tq_disk);
 	}
+}
 #else
-# warning "FIXME"
-#endif
 
+STATIC void drbd_send_write_hint(void *data)
+{
+	request_queue_t *q = data;
+	drbd_dev *mdev = q->queuedata;
+	Drbd_Header h;
+
+	/* In order to avoid deadlocks the receiver should only
+	   use blk_run_queue(). It must not use blk_run_queues() to 
+	   avoid deadlocks. 
+	*/
+
+	if (drbd_send_cmd_dontwait(mdev,mdev->data.socket,WriteHint,&h,sizeof(h))==1){
+		spin_lock_irq(q->queue_lock);
+		blk_remove_plug(q);
+		spin_unlock_irq(q->queue_lock);
+	} else {
+		if(mdev->cstate < Connected) {
+			spin_lock_irq(q->queue_lock);
+			blk_remove_plug(q);
+			spin_unlock_irq(q->queue_lock);
+		}
+	}
 }
+#endif
 
 void drbd_init_set_defaults(drbd_dev *mdev)
 {
@@ -1263,6 +1284,9 @@
 
 		// THINK do we need this?
 		mdev->this_bdev = bdget(MKDEV(MAJOR_NR,i));
+
+		blk_queue_make_request(q,drbd_make_request);
+		q->unplug_fn = drbd_send_write_hint;
 	}
 #endif
 
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.94
retrieving revision 1.97.2.95
diff -u -3 -r1.97.2.94 -r1.97.2.95
--- drbd_receiver.c	25 Jan 2004 10:18:19 -0000	1.97.2.94
+++ drbd_receiver.c	25 Jan 2004 19:03:50 -0000	1.97.2.95
@@ -254,7 +254,7 @@
 			if(drbd_alloc_ee(mdev,GFP_TRY)) av = 1;
 		}
 	}
-	NOT_IN_26 ( if(!av) run_task_queue(&tq_disk); )
+	if(!av) drbd_kick_lo(mdev);
 	return av;
 }
 
@@ -267,7 +267,7 @@
 
 	if(mdev->ee_vacant == EE_MININUM / 2) {
 		spin_unlock_irq(&mdev->ee_lock);
-		NOT_IN_26( run_task_queue(&tq_disk); )
+		drbd_kick_lo(mdev);
 		spin_lock_irq(&mdev->ee_lock);
 	}
 
@@ -384,7 +384,7 @@
 	spin_lock_irq(&mdev->ee_lock);
 	rv = list_empty(head);
 	spin_unlock_irq(&mdev->ee_lock);
-	NOT_IN_26( if(!rv) run_task_queue(&tq_disk);)
+	if(!rv) drbd_kick_lo(mdev);
 	return rv;
 }
 
@@ -755,10 +755,8 @@
 
 	// DBG("got Barrier\n");
 
-NOT_IN_26(
 	if (mdev->conf.wire_protocol != DRBD_PROT_C)
-		run_task_queue(&tq_disk);
-)
+		drbd_kick_lo(mdev);
 
 	drbd_wait_ee(mdev,&mdev->active_ee);
 
@@ -813,11 +811,9 @@
 	 * This code is only with protocol C relevant.
 	 */
 #define NUMBER 24
-NOT_IN_26(
 	if(atomic_read(&mdev->unacked_cnt) >= NUMBER ) {
-		run_task_queue(&tq_disk);
+		drbd_kick_lo(mdev);
 	}
-)
 #undef NUMBER
 
 	mdev->writ_cnt+=data_size>>9;
@@ -1427,8 +1423,8 @@
 
 STATIC int receive_WriteHint(drbd_dev *mdev, Drbd_Header *h)
 {
-	NOT_IN_26(run_task_queue(&tq_disk);)
-	return TRUE; // cannot fail, only deadlock :)
+	drbd_kick_lo(mdev);
+	return TRUE; // cannot fail.
 }
 
 typedef int (*drbd_cmd_handler_f)(drbd_dev*,Drbd_Header*);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_req-2.4.c,v
retrieving revision 1.33.2.44
retrieving revision 1.33.2.45
diff -u -3 -r1.33.2.44 -r1.33.2.45
--- drbd_req-2.4.c	25 Jan 2004 10:18:19 -0000	1.33.2.44
+++ drbd_req-2.4.c	25 Jan 2004 19:03:50 -0000	1.33.2.45
@@ -182,11 +182,20 @@
 			return 0;
 		}
 
-NOT_IN_26(
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
 		if(!test_and_set_bit(WRITE_HINT_QUEUED,&mdev->flags)) {
 			queue_task(&mdev->write_hint_tq, &tq_disk); // IO HINT
 		}
-)
+#else
+		spin_lock_irq(q->queue_lock);
+		if(!blk_queue_plugged(q)) {
+			blk_plug_device(q);
+			del_timer(&q->unplug_timer);
+			// unplugging should not happen automatically...
+		}
+		spin_unlock_irq(q->queue_lock);
+#endif
+
 
 		// Fail READA ??
 		if( rw == WRITE ) {