On Fri, Mar 16, 2012 at 04:59:35PM +0800, Amos Kong wrote: > On 14/03/12 19:46, Stefan Hajnoczi wrote: > >On Wed, Mar 14, 2012 at 10:46 AM, Avi Kivity<a...@redhat.com> wrote: > >>On 03/14/2012 12:39 PM, Stefan Hajnoczi wrote: > >>>On Wed, Mar 14, 2012 at 10:05 AM, Avi Kivity<a...@redhat.com> wrote: > >>>>On 03/14/2012 11:59 AM, Stefan Hajnoczi wrote: > >>>>>On Wed, Mar 14, 2012 at 9:22 AM, Avi Kivity<a...@redhat.com> wrote: > >>>>>>On 03/13/2012 12:42 PM, Amos Kong wrote: > >>>>>>>Boot up guest with 232 virtio-blk disk, qemu will abort for fail to > >>>>>>>allocate ioeventfd. This patchset changes kvm_has_many_ioeventfds(), > >>>>>>>and check if available ioeventfd exists. If not, virtio-pci will > >>>>>>>fallback to userspace, and don't use ioeventfd for io notification. > >>>>>> > >>>>>>How about an alternative way of solving this, within the memory core: > >>>>>>trap those writes in qemu and write to the ioeventfd yourself. This way > >>>>>>ioeventfds work even without kvm: > >>>>>> > >>>>>> > >>>>>> core: create eventfd > >>>>>> core: install handler for memory address that writes to ioeventfd > >>>>>> kvm (optional): install kernel handler for ioeventfd > > Can you give some detail about this? I'm not familiar with Memory API. > > > btw, can we fix this problem by replacing abort() by a error note? > virtio-pci will auto fallback to userspace. > > diff --git a/kvm-all.c b/kvm-all.c > index 3c6b4f0..cf23dbf 100644 > --- a/kvm-all.c > +++ b/kvm-all.c > @@ -749,7 +749,8 @@ static void > kvm_mem_ioeventfd_add(MemoryRegionSection *section, > r = kvm_set_ioeventfd_mmio_long(fd, > section->offset_within_address_space, > data, true); > if (r < 0) { > - abort(); > + fprintf(stderr, "%s: unable to map ioeventfd: %s.\nFallback to " > + "userspace (slower).\n", __func__, strerror(-r));
The challenge is propagating the error code. If virtio-pci.c doesn't know that ioeventfd has failed, then it's not possible to fall back to a userspace handler. I believe Avi's suggestion is to put the fallback code into the KVM memory API implementation so that virtio-pci.c doesn't need to know that ioeventfd failed at all. Stefan