Stefan Hajnoczi c40a254570 coroutine: avoid co_queue_wakeup recursion
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: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Message-id: 20180322152834.12656-3-stefanha@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
2018-03-27 13:05:28 +01:00
..
2017-09-22 14:11:25 +02:00
2017-07-24 12:42:55 +01:00
2016-06-07 18:19:23 +03:00
2017-10-16 20:57:13 +03:00
2017-12-18 10:54:13 -05:00
2016-10-26 08:29:01 -07:00
2017-09-05 22:34:40 +02:00
2018-02-07 14:09:25 +01:00
2018-03-12 11:18:26 +01:00
2016-06-16 18:39:03 +02:00
2017-12-18 17:07:02 +03:00
2018-03-27 13:05:28 +01:00
2018-01-16 14:54:50 +01:00
2017-06-16 07:55:00 +08:00
2018-02-08 09:22:03 +08:00
2016-09-15 15:32:22 +03:00
2017-12-20 22:01:24 +08:00
2018-02-08 09:22:03 +08:00
2017-01-24 23:26:52 +03:00