WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] Added concurrency niceness to the bottom end of the bloc

To: xen-changelog@xxxxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] Added concurrency niceness to the bottom end of the blockstore.
From: BitKeeper Bot <riel@xxxxxxxxxxx>
Date: Thu, 24 Mar 2005 18:50:40 +0000
Delivery-date: Thu, 24 Mar 2005 22:03:43 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-archive: <http://sourceforge.net/mailarchive/forum.php?forum=xen-changelog>
List-help: <mailto:xen-changelog-request@lists.sourceforge.net?subject=help>
List-id: <xen-changelog.lists.sourceforge.net>
List-post: <mailto:xen-changelog@lists.sourceforge.net>
List-subscribe: <https://lists.sourceforge.net/lists/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.sourceforge.net?subject=subscribe>
List-unsubscribe: <https://lists.sourceforge.net/lists/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.sourceforge.net?subject=unsubscribe>
Reply-to: Xen Development List <xen-devel@xxxxxxxxxxxxxxxxxxxxx>
Sender: xen-changelog-admin@xxxxxxxxxxxxxxxxxxxxx
ChangeSet 1.1363, 2005/03/24 18:50:40+00:00, jrb44@xxxxxxxxxxxxxxxxxx

        Added concurrency niceness to the bottom end of the blockstore.
        
        Signed-off-by: James Bulpin <James.Bulpin@xxxxxxxxxxxx>



 blockstore.c |  120 +++++++++++++++++++++++++++++++++++++++++++++++++++++------
 blockstore.h |    4 -
 2 files changed, 111 insertions(+), 13 deletions(-)


diff -Nru a/tools/blktap/blockstore.c b/tools/blktap/blockstore.c
--- a/tools/blktap/blockstore.c 2005-03-24 17:02:36 -05:00
+++ b/tools/blktap/blockstore.c 2005-03-24 17:02:36 -05:00
@@ -15,10 +15,11 @@
 #include <sys/stat.h>
 #include <stdarg.h>
 #include "blockstore.h"
+#include <pthread.h>
 #include "parallax-threaded.h"
 
 #define BLOCKSTORE_REMOTE
-//#define BSDEBUG
+#define BSDEBUG
 
 /*****************************************************************************
  * Debugging
@@ -27,7 +28,7 @@
 void DB(char *format, ...)
 {
     va_list args;
-    
+    fprintf(stderr, "[%05u] ", (int)pthread_getspecific(tid_key));
     va_start(args, format);
     vfprintf(stderr, format, args);
     va_end(args);
@@ -44,10 +45,6 @@
 #include <netdb.h>
 
 /*****************************************************************************
- *                                                                           *
- *****************************************************************************/
-
-/*****************************************************************************
  * Network state                                                             *
  *****************************************************************************/
 
@@ -71,8 +68,30 @@
 
 /* Protects the queue manipulation critcal regions.
  */
-#define ENTER_QUEUE_CR (void)0
-#define LEAVE_QUEUE_CR (void)0
+pthread_mutex_t ptmutex_queue;
+#define ENTER_QUEUE_CR pthread_mutex_lock(&ptmutex_queue)
+#define LEAVE_QUEUE_CR pthread_mutex_unlock(&ptmutex_queue)
+
+pthread_mutex_t ptmutex_recv;
+#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.
@@ -91,8 +110,9 @@
 
 #define BSQ_STATUS_MATCHED 1
 
-#define ENTER_LUID_CR (void)0
-#define LEAVE_LUID_CR (void)0
+pthread_mutex_t ptmutex_luid;
+#define ENTER_LUID_CR pthread_mutex_lock(&ptmutex_luid)
+#define LEAVE_LUID_CR pthread_mutex_unlock(&ptmutex_luid)
 
 static u64 luid_cnt = 0x1000ULL;
 u64 new_luid(void) {
@@ -218,6 +238,10 @@
     return q;
 }
 
+/*****************************************************************************
+ * Network communication                                                     *
+ *****************************************************************************/
+
 int send_message(bsq_t *qe) {
     int rc;
 
@@ -331,7 +355,7 @@
 bsq_t *recv_any(void) {
     struct sockaddr_in from;
     int rc;
-
+    
     DB("ENTER recv_any\n");
 
     rx_qe.msghdr.msg_name = &from;
@@ -361,6 +385,7 @@
         perror("recv_any");
         return NULL;
     }
+
     rx_qe.length = rc;    
     rx_qe.server = get_server_number(&from);
 
@@ -395,8 +420,13 @@
         return numreqs;
     }
 
+    RECV_AWAIT;
+
+    /*
     rxagain:
+    ENTER_RECV_CR;
     q = recv_any();
+    LEAVE_RECV_CR;
     if (!q)
         return -1;
 
@@ -406,11 +436,42 @@
         fprintf(stderr, "Unmatched RX\n");
         goto rxagain;
     }
+    */
 
     goto checkmatch;
 
 }
 
+/* receive loop
+ */
+void *receive_loop(void *arg)
+{
+    bsq_t *q, *m;
+
+    for(;;) {
+        q = recv_any();
+        if (!q) {
+            fprintf(stderr, "recv_any error\n");
+        }
+        else {
+            m = queuesearch(q);
+            recv_recycle_buffer(q);
+            if (!m) {
+                fprintf(stderr, "Unmatched RX\n");
+            }
+            else {
+                DB("RX MATCH");
+                RECV_NOTIFY;
+            }
+        }
+    }
+}
+pthread_t pthread_recv;
+
+/*****************************************************************************
+ * Reading                                                                   *
+ *****************************************************************************/
+
 void *readblock_indiv(int server, u64 id) {
     void *block;
     bsq_t *qe;
@@ -538,6 +599,10 @@
     return block;
 }
 
+/*****************************************************************************
+ * Writing                                                                   *
+ *****************************************************************************/
+
 bsq_t *writeblock_indiv(int server, u64 id, void *block) {
 
     bsq_t *qe;
@@ -663,6 +728,10 @@
     return -1;
 }
 
+/*****************************************************************************
+ * Allocation                                                                *
+ *****************************************************************************/
+
 /**
  * allocblock: write a new block to disk
  *   @block: pointer to block
@@ -791,6 +860,9 @@
 
 #else /* /BLOCKSTORE_REMOTE */
 
+/*****************************************************************************
+ * Local storage version                                                     *
+ *****************************************************************************/
  
 /**
  * readblock: read a block from disk
@@ -923,6 +995,10 @@
 
 #endif /* BLOCKSTORE_REMOTE */
 
+/*****************************************************************************
+ * Memory management                                                         *
+ *****************************************************************************/
+
 /**
  * newblock: get a new in-memory block set to zeros
  *
@@ -1053,6 +1129,10 @@
     printf("Total of %Ld ids on freelist.\n", total);
 }
 
+/*****************************************************************************
+ * Initialisation                                                            *
+ *****************************************************************************/
+
 int __init_blockstore(void)
 {
     int i;
@@ -1062,6 +1142,13 @@
     
 #ifdef BLOCKSTORE_REMOTE
     struct hostent *addr;
+
+    pthread_mutex_init(&ptmutex_queue, NULL);
+    pthread_mutex_init(&ptmutex_luid, NULL);
+    pthread_mutex_init(&ptmutex_recv, NULL);
+    pthread_mutex_init(&ptmutex_notify, NULL);
+    pthread_cond_init(&ptcv_notify, NULL);
+
     bsservers[0].hostname = "firebug.cl.cam.ac.uk";
     bsservers[1].hostname = "planb.cl.cam.ac.uk";
     bsservers[2].hostname = "simcity.cl.cam.ac.uk";
@@ -1137,6 +1224,8 @@
         return -1;
     }
 
+    pthread_create(&pthread_recv, NULL, receive_loop, NULL);
+
 #else /* /BLOCKSTORE_REMOTE */
     block_fp = open("blockstore.dat", O_RDWR | O_CREAT | O_LARGEFILE, 0644);
 
@@ -1169,4 +1258,13 @@
         
 #endif /*  BLOCKSTORE_REMOTE */   
     return 0;
+}
+
+void __exit_blockstore(void)


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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] Added concurrency niceness to the bottom end of the blockstore., BitKeeper Bot <=