From patchwork Wed Jul 18 15:07:41 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Hajnoczi X-Patchwork-Id: 1211761 Return-Path: X-Original-To: patchwork-kvm@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork1.kernel.org (Postfix) with ESMTP id D9BA73FCFC for ; Wed, 18 Jul 2012 15:09:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754878Ab2GRPJz (ORCPT ); Wed, 18 Jul 2012 11:09:55 -0400 Received: from e06smtp11.uk.ibm.com ([195.75.94.107]:49381 "EHLO e06smtp11.uk.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754785Ab2GRPIn (ORCPT ); Wed, 18 Jul 2012 11:08:43 -0400 Received: from /spool/local by e06smtp11.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 18 Jul 2012 16:08:42 +0100 Received: from d06nrmr1806.portsmouth.uk.ibm.com (9.149.39.193) by e06smtp11.uk.ibm.com (192.168.101.141) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 18 Jul 2012 16:08:39 +0100 Received: from d06av02.portsmouth.uk.ibm.com (d06av02.portsmouth.uk.ibm.com [9.149.37.228]) by d06nrmr1806.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q6IF8ctp2289880 for ; Wed, 18 Jul 2012 16:08:38 +0100 Received: from d06av02.portsmouth.uk.ibm.com (loopback [127.0.0.1]) by d06av02.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q6IF8aqs003694 for ; Wed, 18 Jul 2012 09:08:38 -0600 Received: from localhost (sig-9-145-185-169.de.ibm.com [9.145.185.169]) by d06av02.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id q6IF8Z14003659; Wed, 18 Jul 2012 09:08:35 -0600 From: Stefan Hajnoczi To: Cc: , Anthony Liguori , Kevin Wolf , Paolo Bonzini , "Michael S. Tsirkin" , Asias He , Khoa Huynh , Stefan Hajnoczi Subject: [RFC v9 14/27] virtio-blk: Use pthreads instead of qemu-thread Date: Wed, 18 Jul 2012 16:07:41 +0100 Message-Id: <1342624074-24650-15-git-send-email-stefanha@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1342624074-24650-1-git-send-email-stefanha@linux.vnet.ibm.com> References: <1342624074-24650-1-git-send-email-stefanha@linux.vnet.ibm.com> x-cbid: 12071815-5024-0000-0000-000003438AAD Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org 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 --- 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 #include #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);