Skip to content
  • Stefan Hajnoczi's avatar
    coroutine: avoid co_queue_wakeup recursion · c40a2545
    Stefan Hajnoczi authored
    
    
    qemu_aio_coroutine_enter() is (indirectly) called recursively when
    processing co_queue_wakeup.  This can lead to stack exhaustion.
    
    This patch rewrites co_queue_wakeup in an iterative fashion (instead of
    recursive) with bounded memory usage to prevent stack exhaustion.
    
    qemu_co_queue_run_restart() is inlined into qemu_aio_coroutine_enter()
    and the qemu_coroutine_enter() call is turned into a loop to avoid
    recursion.
    
    There is one change that is worth mentioning:  Previously, when
    coroutine A queued coroutine B, qemu_co_queue_run_restart() entered
    coroutine B from coroutine A.  If A was terminating then it would still
    stay alive until B yielded.  After this patch B is entered by A's parent
    so that a A can be deleted immediately if it is terminating.
    
    It is safe to make this change since B could never interact with A if it
    was terminating anyway.
    
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    Reviewed-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    Message-id: 20180322152834.12656-3-stefanha@redhat.com
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    c40a2545