[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.