• Peter Maydell's avatar
    coroutine-win32.c: Add noinline attribute to work around gcc bug · ff4873cb
    Peter Maydell authored
    A gcc codegen bug in x86_64-w64-mingw32-gcc (GCC) 4.6.3 means that
    non-debug builds of QEMU for Windows tend to assert when using
    coroutines. Work around this by marking qemu_coroutine_switch
    as noinline.
    
    If we allow gcc to inline qemu_coroutine_switch into
    coroutine_trampoline, then it hoists the code to get the
    address of the TLS variable "current" out of the while() loop.
    This is an invalid transformation because the SwitchToFiber()
    call may be called when running thread A but return in thread B,
    and so we might be in a different thread context each time
    round the loop. This can happen quite often.  Typically.
    a coroutine is started when a VCPU thread does bdrv_aio_readv:
    
         VCPU thread
    
         main VCPU thread coroutine      I/O coroutine
            bdrv_aio_readv ----->
                                         start I/O operation
                                           thread_pool_submit_co
                           <------------ yields
            back to emulation
    
    Then I/O finishes and the thread-pool.c event notifier triggers in
    the I/O thread.  event_notifier_ready calls thread_pool_co_cb, and
    the I/O coroutine now restarts *in another thread*:
    
         iothread
    
         main iothread coroutine         I/O coroutine (formerly in VCPU thread)
            event_notifier_ready
              thread_pool_co_cb ----->   current = I/O coroutine;
                                         call AIO callback
    
    But on Win32, because of the bug, the "current" being set here the
    current coroutine of the VCPU thread, not the iothread.
    
    noinline is a good-enough workaround, and quite unlikely to break in
    the future.
    
    (Thanks to Paolo Bonzini for assistance in diagnosing the problem
    and providing the detailed example/ascii art quoted above.)
    Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
    Message-id: 1403535303-14939-1-git-send-email-peter.maydell@linaro.org
    Reviewed-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    Reviewed-by: default avatarRichard Henderson <rth@twiddle.net>
    ff4873cb
coroutine-win32.c 3.01 KB