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@xxxxxxxxxxxxxxxxxx> --- hw/virtio-blk.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) 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); -- 1.7.10.4 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html