On 08/01/2012 07:05 AM, David Gibson wrote: > From: Alexey Kardashevskiy <a...@ozlabs.ru> > > QEMU uses IO handlers to run select() in the main loop. > The handlers list is managed by qemu_set_fd_handler() helper > which works fine when called from the main thread as it is > called when select() is not waiting. > > However IO handlers list can be changed in the thread other than > the main one doing os_host_main_loop_wait(), for example, as a result > of a hypercall which changes PCI config space (VFIO on POWER is the case) > and enables/disabled MSI/MSIX which creates eventfd handles. > As the main loop should be waiting on the newly created eventfds, > it has to be restarted. > > The patch adds the qemu_notify_event() call to interrupt select() > to make main_loop() restart select() with the updated IO handlers > list. > > Signed-off-by: Alexey Kardashevskiy <a...@ozlabs.ru> > Reviewed-by: Paolo Bonzini <pbonz...@redhat.com> > --- > iohandler.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/iohandler.c b/iohandler.c > index 3c74de6..dea4355 100644 > --- a/iohandler.c > +++ b/iohandler.c > @@ -77,6 +77,7 @@ int qemu_set_fd_handler2(int fd, > ioh->fd_write = fd_write; > ioh->opaque = opaque; > ioh->deleted = 0; > + qemu_notify_event(); > } > return 0; > }
Perhaps it's better to do this unconditionally (on the delete path too) so that removals are processed without delay and we don't have closed fds hanging around in select(). -- error compiling committee.c: too many arguments to function