Paolo Bonzini 21a03d17f2 AioContext: fix broken placement of event_notifier_test_and_clear
event_notifier_test_and_clear must be called before processing events.
Otherwise, an aio_poll could "eat" the notification before the main
I/O thread invokes ppoll().  The main I/O thread then never wakes up.
This is an example of what could happen:

   i/o thread       vcpu thread                     worker thread
   ---------------------------------------------------------------------
   lock_iothread
   notify_me = 1
   ...
   unlock_iothread
                                                     bh->scheduled = 1
                                                     event_notifier_set
                    lock_iothread
                    notify_me = 3
                    ppoll
                    notify_me = 1
                    aio_dispatch
                     aio_bh_poll
                      thread_pool_completion_bh
                                                     bh->scheduled = 1
                                                     event_notifier_set
                     node->io_read(node->opaque)
                      event_notifier_test_and_clear
   ppoll
   *** hang ***

"Tracing" with qemu_clock_get_ns shows pretty much the same behavior as
in the previous bug, so there are no new tricks here---just stare more
at the code until it is apparent.

One could also use a formal model, of course.  The included one shows
this with three processes: notifier corresponds to a QEMU thread pool
worker, temporary_waiter to a VCPU thread that invokes aio_poll(),
waiter to the main I/O thread.  I would be happy to say that the
formal model found the bug for me, but actually I wrote it after the
fact.

This patch is a bit of a big hammer.  The next one optimizes it,
with help (this time for real rather than a posteriori :)) from
another, similar formal model.

Reported-by: Richard W. M. Jones <rjones@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Fam Zheng <famz@redhat.com>
Tested-by: Richard W.M. Jones <rjones@redhat.com>
Message-id: 1437487673-23740-6-git-send-email-pbonzini@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
2015-07-22 12:41:40 +01:00
2015-07-08 13:11:01 +02:00
2015-07-20 13:35:45 +02:00
2015-07-21 10:04:32 +01:00
2015-07-16 20:00:20 +02:00
2015-07-07 14:54:55 +02:00
2015-07-09 15:20:40 +02:00
2015-07-14 15:33:48 +02:00
2012-09-07 09:02:44 +03:00
2015-04-04 09:45:59 +03:00
2014-06-16 13:24:35 +02:00
2013-09-05 09:40:31 -05:00
2015-06-12 06:42:34 +02:00
2015-07-14 21:50:13 -04:00
2013-10-11 09:34:56 -07:00
2008-10-12 17:54:42 +00:00
2015-06-03 14:21:24 +03:00
2015-04-30 16:05:48 +03:00
2015-07-09 15:20:40 +02:00
2013-07-23 02:41:31 +02:00
2015-06-12 13:42:17 +01:00
2015-07-07 09:22:40 +01:00
2015-07-14 17:15:23 +02:00
2015-06-23 20:23:39 +03:00
2014-05-24 00:07:29 +04:00
2015-05-11 08:59:07 -04:00
2015-05-22 15:58:22 -04:00
2013-10-11 09:34:56 -07:00
2015-06-11 10:13:28 +01:00
2015-07-07 14:54:52 +02:00
2015-07-16 20:32:20 +01:00
2013-10-11 09:34:56 -07:00
2015-06-23 17:46:20 +01:00

Read the documentation in qemu-doc.html or on http://wiki.qemu-project.org

- QEMU team
Description
A fork of QEMU-Nyx which is better suited for my bachelors thesis
Readme 154 MiB
Languages
C 90.3%
Dylan 2.5%
Python 2.1%
C++ 2%
Shell 1.7%
Other 1.4%