[DRBD-cvs] DRBD CVS: drbd by phil from

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Thu, 15 Jan 2004 11:55:27 +0100 (CET)


DRBD CVS committal

Author  : phil
Host    : 
Module  : drbd

Dir     : drbd/drbd


Modified Files:
      Tag: rel-0_7-branch
	drbd_int.h drbd_main.c drbd_receiver.c 


Log Message:
drbdd buffer no longer on stack

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.88
retrieving revision 1.58.2.89
diff -u -3 -r1.58.2.88 -r1.58.2.89
--- drbd_int.h	14 Jan 2004 16:05:36 -0000	1.58.2.88
+++ drbd_int.h	15 Jan 2004 10:55:26 -0000	1.58.2.89
@@ -637,11 +637,18 @@
 // TODO sort members for performance
 // MAYBE group them further
 
-/*
+/* If Philipp agrees, we remove the "mutex", and make_request will only
+ * (throttle on "queue full" condition and) queue it to the worker thread...
+ * which then is free to do whatever is needed, and has exclusive send access
+ * to the data socket ...
+ * 
+ * I want to see how this works first. I have the feeling in my guts that
+ * it will lead to OOM deadlock.
  */
 struct drbd_socket {
 	struct semaphore  mutex;
-	struct list_head  send_q;
+	struct semaphore  work;      // producers up it, worker down()s it
+	struct list_head  work_q;
 	struct socket    *socket;
 	Drbd_Polymorph_Packet sbuf;  // this way we get our
 	Drbd_Polymorph_Packet rbuf;  // send/receive buffers off the stack
@@ -658,6 +665,7 @@
 	struct drbd_socket data; // for data/barrier/cstate/parameter packets
 	struct drbd_socket meta; // for ping/ack (metadata) packets
 	volatile unsigned long last_received; // in jiffies, either socket
+	struct drbd_work  resync_work;
 	kdev_t lo_device;         // backing device
 	struct file *lo_file;
 	kdev_t md_device;         // device for meta-data.
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.95
retrieving revision 1.73.2.96
diff -u -3 -r1.73.2.95 -r1.73.2.96
--- drbd_main.c	14 Jan 2004 16:30:07 -0000	1.73.2.95
+++ drbd_main.c	15 Jan 2004 10:55:26 -0000	1.73.2.96
@@ -1021,9 +1021,11 @@
 	atomic_set(&mdev->unacked_cnt,0);
 
 	init_MUTEX(&mdev->device_mutex);
+	init_MUTEX(&mdev->md_io_mutex);
 	init_MUTEX(&mdev->data.mutex);
 	init_MUTEX(&mdev->meta.mutex);
-	init_MUTEX(&mdev->md_io_mutex);
+	sema_init(&mdev->data.work,0);
+	sema_init(&mdev->meta.work,0);
 
 	mdev->rs_lock        = SPIN_LOCK_UNLOCKED;
 	mdev->al_lock        = SPIN_LOCK_UNLOCKED;
@@ -1043,6 +1045,8 @@
 	INIT_LIST_HEAD(&mdev->busy_blocks);
 	INIT_LIST_HEAD(&mdev->app_reads);
 	INIT_LIST_HEAD(&mdev->resync_reads);
+	INIT_LIST_HEAD(&mdev->data.work_q);
+	INIT_LIST_HEAD(&mdev->meta.work_q);
 
 	init_waitqueue_head(&mdev->state_wait);
 	init_waitqueue_head(&mdev->cstate_wait);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.79
retrieving revision 1.97.2.80
diff -u -3 -r1.97.2.79 -r1.97.2.80
--- drbd_receiver.c	14 Jan 2004 16:05:36 -0000	1.97.2.79
+++ drbd_receiver.c	15 Jan 2004 10:55:26 -0000	1.97.2.80
@@ -1581,12 +1581,7 @@
 STATIC void drbdd(drbd_dev *mdev)
 {
 	drbd_cmd_handler_f handler;
-	/* now I have enough space on the stack for the biggest packet
-	 * (ReportParams). Data and Bitmap are handled different
-	 * anyways. Maybe this should be allocated nevertheless?
-	 */
-	Drbd_Polymorph_Packet packet;
-	Drbd_Header *header = (Drbd_Header*)&packet;
+	Drbd_Header *header = &mdev->data.rbuf.head;
 
 	for (;;) {
 		drbd_collect_zombies(mdev); // in case a syncer exited.