[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] Enhanced concurrency support in blockstore.



ChangeSet 1.1372, 2005/03/25 15:39:09+00:00, jrb44@xxxxxxxxxxxxxxxxx

        Enhanced concurrency support in blockstore.
        
        Signed-off-by: James Bulpin <James.Bulpin@xxxxxxxxxxxx>



 Makefile            |   26 +++++-----
 blktaplib.c         |   15 ++++++
 blockstore.c        |  126 ++++++++++++++++++++++++++++++++++++++++++----------
 parallax-threaded.h |    3 -
 4 files changed, 132 insertions(+), 38 deletions(-)


diff -Nru a/tools/blktap/Makefile b/tools/blktap/Makefile
--- a/tools/blktap/Makefile     2005-03-25 18:03:07 -05:00
+++ b/tools/blktap/Makefile     2005-03-25 18:03:07 -05:00
@@ -58,7 +58,7 @@
 
 LIB      = libblktap.so libblktap.so.$(MAJOR) libblktap.so.$(MAJOR).$(MINOR)
 
-all: mk-symlinks blkdump blkcow blkimg blkcowimg blkgnbd blkcowgnbd 
$(VDI_TOOLS) parallax 
+all: mk-symlinks blkdump blkcow blkimg blkcowimg blkgnbd blkcowgnbd 
$(VDI_TOOLS) parallax parallax-threaded blockstored
        $(MAKE) $(LIB)
 
 LINUX_ROOT := $(wildcard $(XEN_ROOT)/linux-2.6.*-xen-sparse)
@@ -120,42 +120,42 @@
        $(CC) $(CFLAGS) -o blkaio -L$(XEN_LIBXC) -L$(XEN_LIBXUTIL) -L. -lblktap 
blkaio.c blkaiolib.c -laio -lpthread
 
 parallax: $(LIB) $(PLX_SRCS)
-       $(CC) $(CFLAGS) -o parallax -L$(XEN_LIBXC) -L$(XEN_LIBXUTIL) -L. 
-lblktap $(PLX_SRCS) libgnbd/libgnbd.a
+       $(CC) $(CFLAGS) -o parallax -L$(XEN_LIBXC) -L$(XEN_LIBXUTIL) -L. 
-lblktap -lpthread $(PLX_SRCS) libgnbd/libgnbd.a
 
 parallax-threaded: $(LIB) $(PLXT_SRCS)
        $(CC) $(CFLAGS) -o parallax-threaded -L$(XEN_LIBXC) -L$(XEN_LIBXUTIL) 
-L. -lpthread -lblktap $(PLXT_SRCS) libgnbd/libgnbd.a
 
 vdi_test: $(LIB) $(VDI_SRCS)
-       $(CC) $(CFLAGS) -g3 -o vdi_test -DVDI_STANDALONE $(VDI_SRCS)
+       $(CC) $(CFLAGS) -g3 -o vdi_test -DVDI_STANDALONE -lpthread $(VDI_SRCS)
 
 vdi_list: $(LIB) vdi_list.c $(VDI_SRCS)
-       $(CC) $(CFLAGS) -g3 -o vdi_list vdi_list.c $(VDI_SRCS)
+       $(CC) $(CFLAGS) -g3 -o vdi_list vdi_list.c -lpthread $(VDI_SRCS)
 
 vdi_create: $(LIB) vdi_create.c $(VDI_SRCS)
-       $(CC) $(CFLAGS) -g3 -o vdi_create vdi_create.c $(VDI_SRCS)
+       $(CC) $(CFLAGS) -g3 -o vdi_create vdi_create.c -lpthread $(VDI_SRCS)
 
 vdi_snap: $(LIB) vdi_snap.c $(VDI_SRCS)
-       $(CC) $(CFLAGS) -g3 -o vdi_snap vdi_snap.c $(VDI_SRCS)
+       $(CC) $(CFLAGS) -g3 -o vdi_snap vdi_snap.c -lpthread $(VDI_SRCS)
 
 vdi_snap_list: $(LIB) vdi_snap_list.c $(VDI_SRCS)
-       $(CC) $(CFLAGS) -g3 -o vdi_snap_list vdi_snap_list.c $(VDI_SRCS)
+       $(CC) $(CFLAGS) -g3 -o vdi_snap_list vdi_snap_list.c -lpthread 
$(VDI_SRCS)
 
 vdi_snap_delete: $(LIB) vdi_snap_delete.c $(VDI_SRCS)
-       $(CC) $(CFLAGS) -g3 -o vdi_snap_delete vdi_snap_delete.c $(VDI_SRCS)
+       $(CC) $(CFLAGS) -g3 -o vdi_snap_delete vdi_snap_delete.c -lpthread 
$(VDI_SRCS)
 
 vdi_tree: $(LIB) vdi_tree.c $(VDI_SRCS)
-       $(CC) $(CFLAGS) -g3 -o vdi_tree vdi_tree.c $(VDI_SRCS)
+       $(CC) $(CFLAGS) -g3 -o vdi_tree vdi_tree.c -lpthread $(VDI_SRCS)
 
 vdi_fill: $(LIB) vdi_fill.c $(VDI_SRCS)
-       $(CC) $(CFLAGS) -g3 -o vdi_fill vdi_fill.c $(VDI_SRCS)
+       $(CC) $(CFLAGS) -g3 -o vdi_fill vdi_fill.c -lpthread $(VDI_SRCS)
 
 vdi_validate: $(LIB) vdi_validate.c $(VDI_SRCS)
-       $(CC) $(CFLAGS) -g3 -o vdi_validate vdi_validate.c $(VDI_SRCS)
+       $(CC) $(CFLAGS) -g3 -o vdi_validate vdi_validate.c -lpthread $(VDI_SRCS)
 
 blockstored: blockstored.c
-       $(CC) $(CFLAGS) -g3 -o blockstored blockstored.c
+       $(CC) $(CFLAGS) -g3 -o blockstored -lpthread blockstored.c
 bstest: bstest.c blockstore.c
-       $(CC) $(CFLAGS) -g3 -o bstest bstest.c blockstore.c
+       $(CC) $(CFLAGS) -g3 -o bstest bstest.c -lpthread blockstore.c
 
 .PHONY: TAGS clean install mk-symlinks rpm
 TAGS:
diff -Nru a/tools/blktap/blktaplib.c b/tools/blktap/blktaplib.c
--- a/tools/blktap/blktaplib.c  2005-03-25 18:03:07 -05:00
+++ b/tools/blktap/blktaplib.c  2005-03-25 18:03:07 -05:00
@@ -248,12 +248,21 @@
     }
 }
 
+static pthread_mutex_t push_mutex = PTHREAD_MUTEX_INITIALIZER;
+
 void blktap_inject_response(blkif_response_t *rsp)
 {
+    
     apply_rsp_hooks(rsp);
+    
     write_rsp_to_fe_ring(rsp);
+    
+    pthread_mutex_lock(&push_mutex);
+    
     RING_PUSH_RESPONSES(&fe_ring);
     ioctl(fd, BLKTAP_IOCTL_KICK_FE);
+    
+    pthread_mutex_unlock(&push_mutex);
 }
 
 /*-----[ Polling fd listeners ]------------------------------------------*/
@@ -449,7 +458,9 @@
             }
             /* Using this as a unidirectional ring. */
             ctrl_ring.req_cons = ctrl_ring.rsp_prod_pvt = i;
+pthread_mutex_lock(&push_mutex);
             RING_PUSH_RESPONSES(&ctrl_ring);
+pthread_mutex_unlock(&push_mutex);
             
             /* empty the fe_ring */
             notify_fe = 0;
@@ -517,14 +528,18 @@
 
             if (notify_be) {
                 DPRINTF("notifying be\n");
+pthread_mutex_lock(&push_mutex);
                 RING_PUSH_REQUESTS(&be_ring);
                 ioctl(fd, BLKTAP_IOCTL_KICK_BE);
+pthread_mutex_unlock(&push_mutex);
             }
 
             if (notify_fe) {
                 DPRINTF("notifying fe\n");
+pthread_mutex_lock(&push_mutex);
                 RING_PUSH_RESPONSES(&fe_ring);
                 ioctl(fd, BLKTAP_IOCTL_KICK_FE);
+pthread_mutex_unlock(&push_mutex);
             }
         }        
     }
diff -Nru a/tools/blktap/blockstore.c b/tools/blktap/blockstore.c
--- a/tools/blktap/blockstore.c 2005-03-25 18:03:07 -05:00
+++ b/tools/blktap/blockstore.c 2005-03-25 18:03:07 -05:00
@@ -13,13 +13,16 @@
 #include <string.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/time.h>
 #include <stdarg.h>
 #include "blockstore.h"
 #include <pthread.h>
 #include "parallax-threaded.h"
 
 #define BLOCKSTORE_REMOTE
-#define BSDEBUG
+//#define BSDEBUG
+
+#define RETRY_TIMEOUT 1000000 /* microseconds */
 
 /*****************************************************************************
  * Debugging
@@ -63,6 +66,37 @@
 int bssock = 0;
 
 /*****************************************************************************
+ * Notification                                                              *
+ *****************************************************************************/
+
+typedef struct pool_thread_t_struct {
+    pthread_mutex_t ptmutex;
+    pthread_cond_t ptcv;
+    int newdata;
+} pool_thread_t;
+
+pool_thread_t pool_thread[READ_POOL_SIZE+1];
+
+#define RECV_NOTIFY(tid) { \
+    pthread_mutex_lock(&(pool_thread[tid].ptmutex)); \
+    pool_thread[tid].newdata = 1; \
+    DB("CV Waking %u", tid); \
+    pthread_cond_signal(&(pool_thread[tid].ptcv)); \
+    pthread_mutex_unlock(&(pool_thread[tid].ptmutex)); }
+#define RECV_AWAIT(tid) { \
+    pthread_mutex_lock(&(pool_thread[tid].ptmutex)); \
+    if (pool_thread[tid].newdata) { \
+        pool_thread[tid].newdata = 0; \
+        DB("CV Woken %u", tid); \
+    } \
+    else { \
+        DB("CV Waiting %u", tid); \
+        pthread_cond_wait(&(pool_thread[tid].ptcv), \
+                          &(pool_thread[tid].ptmutex)); \
+    } \
+    pthread_mutex_unlock(&(pool_thread[tid].ptmutex)); }
+
+/*****************************************************************************
  * Message queue management                                                  *
  *****************************************************************************/
 
@@ -76,23 +110,6 @@
 #define ENTER_RECV_CR pthread_mutex_lock(&ptmutex_recv)
 #define LEAVE_RECV_CR pthread_mutex_unlock(&ptmutex_recv)
 
-int notify = 0;
-pthread_mutex_t ptmutex_notify;
-pthread_cond_t ptcv_notify;
-#define RECV_NOTIFY { \
-    pthread_mutex_lock(&ptmutex_notify); \
-    notify = 1; \
-    pthread_cond_signal(&ptcv_notify); \
-    pthread_mutex_unlock(&ptmutex_notify); }
-#define RECV_AWAIT { \
-    pthread_mutex_lock(&ptmutex_notify); \
-    if (notify) \
-        notify = 0; \
-    else \
-        pthread_cond_wait(&ptcv_notify, &ptmutex_notify); \
-    pthread_mutex_unlock(&ptmutex_notify); }
-    
-
 /* A message queue entry. We allocate one of these for every request we send.
  * Asynchronous reply reception also used one of these.
  */
@@ -104,6 +121,8 @@
     int length;
     struct msghdr msghdr;
     struct iovec iov[2];
+    int tid;
+    struct timeval tv_sent;
     bshdr_t message;
     void *block;
 } bsq_t;
@@ -267,11 +286,13 @@
     qe->message.luid = new_luid();
 
     qe->status = 0;
+    qe->tid = (int)pthread_getspecific(tid_key);
     if (enqueue(qe) < 0) {
         fprintf(stderr, "Error enqueuing request.\n");
         return -1;
     }
 
+    gettimeofday(&(qe->tv_sent), NULL);
     DB("send_message to %d luid=%016llx\n", qe->server, qe->message.luid);
     rc = sendmsg(bssock, &(qe->msghdr), MSG_DONTWAIT);
     //rc = sendto(bssock, (void *)&(qe->message), qe->length, 0,
@@ -407,6 +428,7 @@
 int wait_recv(bsq_t **reqs, int numreqs) {
     bsq_t *q, *m;
     unsigned int x, i;
+    int tid = (int)pthread_getspecific(tid_key);
 
     DB("ENTER wait_recv %u\n", numreqs);
 
@@ -420,7 +442,7 @@
         return numreqs;
     }
 
-    RECV_AWAIT;
+    RECV_AWAIT(tid);
 
     /*
     rxagain:
@@ -442,6 +464,52 @@
 
 }
 
+/* retry
+ */


-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxxxx
https://lists.sourceforge.net/lists/listinfo/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.