qemu-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-commits] [qemu/qemu] ff4873: coroutine-win32.c: Add noinline attri


From: GitHub
Subject: [Qemu-commits] [qemu/qemu] ff4873: coroutine-win32.c: Add noinline attribute to work ...
Date: Thu, 26 Jun 2014 09:00:05 -0700

  Branch: refs/heads/master
  Home:   https://github.com/qemu/qemu
  Commit: ff4873cb8c81db89668d8b56e19e57b852edb5f5
      
https://github.com/qemu/qemu/commit/ff4873cb8c81db89668d8b56e19e57b852edb5f5
  Author: Peter Maydell <address@hidden>
  Date:   2014-06-26 (Thu, 26 Jun 2014)

  Changed paths:
    M coroutine-win32.c

  Log Message:
  -----------
  coroutine-win32.c: Add noinline attribute to work around gcc bug

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: Peter Maydell <address@hidden>
Message-id: address@hidden
Reviewed-by: Paolo Bonzini <address@hidden>
Reviewed-by: Richard Henderson <address@hidden>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]