@@ -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);
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(-)