Patchwork [RFC,v9,14/27] virtio-blk: Use pthreads instead of qemu-thread

login
register
mail settings
Submitter Stefan Hajnoczi
Date July 18, 2012, 3:07 p.m.
Message ID <1342624074-24650-15-git-send-email-stefanha@linux.vnet.ibm.com>
Download mbox | patch
Permalink /patch/171730/
State New
Headers show

Comments

Stefan Hajnoczi - July 18, 2012, 3:07 p.m.
Using qemu-thread.h seemed like a nice idea but it has two limitations:

1. QEMU needs to be built with --enable-io-thread
2. qemu-kvm doesn't build with --enable-io-thread

For now just copy the pthread_create() code straight into virtio-blk.c.

Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
---
 hw/virtio-blk.c |   16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

Patch

diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c
index 7ae3c56..1616be5 100644
--- a/hw/virtio-blk.c
+++ b/hw/virtio-blk.c
@@ -11,6 +11,7 @@ 
  *
  */
 
+#include <pthread.h>
 #include <libaio.h>
 #include "qemu-common.h"
 #include "block_int.h"
@@ -47,7 +48,7 @@  typedef struct {
     DeviceState *qdev;
 
     bool data_plane_started;
-    QemuThread data_plane_thread;
+    pthread_t data_plane_thread;
 
     Vring vring;                    /* virtqueue vring */
 
@@ -268,7 +269,16 @@  static void data_plane_start(VirtIOBlock *s)
     }
     event_poll_add(&s->event_poll, &s->io_handler, ioq_get_notifier(&s->ioqueue), handle_io);
 
-    qemu_thread_create(&s->data_plane_thread, data_plane_thread, s, QEMU_THREAD_JOINABLE);
+    /* Create data plane thread */
+    sigset_t set, oldset;
+    sigfillset(&set);
+    pthread_sigmask(SIG_SETMASK, &set, &oldset);
+    if (pthread_create(&s->data_plane_thread, NULL, data_plane_thread, s) != 0)
+    {
+        fprintf(stderr, "pthread create failed: %m\n");
+        exit(1);
+    }
+    pthread_sigmask(SIG_SETMASK, &oldset, NULL);
 
     s->data_plane_started = true;
 }
@@ -279,7 +289,7 @@  static void data_plane_stop(VirtIOBlock *s)
 
     /* Tell data plane thread to stop and then wait for it to return */
     event_poll_stop(&s->event_poll);
-    pthread_join(s->data_plane_thread.thread, NULL);
+    pthread_join(s->data_plane_thread, NULL);
 
     ioq_cleanup(&s->ioqueue);