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 <stefa...@linux.vnet.ibm.com>
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