From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=45614 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PhjeJ-0002Tl-3Q for qemu-devel@nongnu.org; Tue, 25 Jan 2011 09:13:47 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PhjeA-0003i4-13 for qemu-devel@nongnu.org; Tue, 25 Jan 2011 09:13:26 -0500 Received: from mx1.redhat.com ([209.132.183.28]:23180) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Phje9-0003hy-Oc for qemu-devel@nongnu.org; Tue, 25 Jan 2011 09:13:25 -0500 Date: Tue, 25 Jan 2011 16:13:01 +0200 From: "Michael S. Tsirkin" Message-ID: <20110125141301.GA15666@redhat.com> References: <1295963888-17275-1-git-send-email-stefanha@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1295963888-17275-1-git-send-email-stefanha@linux.vnet.ibm.com> Subject: [Qemu-devel] Re: [PATCH] virtio-pci: Disable virtio-ioeventfd when !CONFIG_IOTHREAD List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Stefan Hajnoczi Cc: Kevin Wolf , qemu-devel@nongnu.org On Tue, Jan 25, 2011 at 01:58:08PM +0000, Stefan Hajnoczi wrote: > It is not possible to use virtio-ioeventfd when building without an I/O > thread. We rely on a signal to kick us out of vcpu execution. Timers > and AIO use SIGALRM and SIGUSR2 respectively. Unfortunately eventfd > does not support O_ASYNC (SIGIO) so eventfd cannot be used in a signal > driven manner. > > Signed-off-by: Stefan Hajnoczi I'd rather have the CONFIG_ ... mess contained in kvm-all.c which tests CONFIG_IOTHREAD anyway, than spread out to devices. Can we make kvm_has_many_ioeventfds check this? > --- > hw/virtio-pci.c | 21 ++++++++++++++++++++- > 1 files changed, 20 insertions(+), 1 deletions(-) > > diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c > index d07ff97..e921eda 100644 > --- a/hw/virtio-pci.c > +++ b/hw/virtio-pci.c > @@ -640,6 +640,25 @@ static int virtio_pci_set_host_notifier(void *opaque, int n, bool assign) > return virtio_pci_set_host_notifier_internal(proxy, n, assign); > } > > +static bool virtio_pci_can_use_ioeventfd(void) > +{ > + if (!kvm_has_many_ioeventfds()) { > + return false; > + } > + > + /* Use ioeventfd for virtqueue kick only if we have an I/O thread to > + * perform out-of-line processing. Otherwise we might as well do > + * synchronous virtqueue kicks and in fact we have to since eventfd does > + * not support SIGIO. Without the I/O thread a signal would be required to > + * kick the vcpu out of guest code. > + */ > +#ifdef CONFIG_IOTHREAD > + return true; > +#else > + return false; > +#endif > +} > + > static void virtio_pci_vmstate_change(void *opaque, bool running) > { > VirtIOPCIProxy *proxy = opaque; > @@ -705,7 +724,7 @@ static void virtio_init_pci(VirtIOPCIProxy *proxy, VirtIODevice *vdev, > pci_register_bar(&proxy->pci_dev, 0, size, PCI_BASE_ADDRESS_SPACE_IO, > virtio_map); > > - if (!kvm_has_many_ioeventfds()) { > + if (!virtio_pci_can_use_ioeventfd()) { > proxy->flags &= ~VIRTIO_PCI_FLAG_USE_IOEVENTFD; > } > > -- > 1.7.2.3