• Paolo Bonzini's avatar
    AioContext: fix broken placement of event_notifier_test_and_clear · 21a03d17
    Paolo Bonzini authored
    
    
    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: default avatarRichard W. M. Jones <rjones@redhat.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    Reviewed-by: default avatarFam Zheng <famz@redhat.com>
    Tested-by: default avatarRichard W.M. Jones <rjones@redhat.com>
    Message-id: 1437487673-23740-6-git-send-email-pbonzini@redhat.com
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    21a03d17