qemu-e2k/util
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
..
acl.c
aio-posix.c async: use ARRAY_SIZE macro 2018-02-10 10:43:18 +03:00
aio-wait.c block: make BDRV_POLL_WHILE() re-entrancy safe 2018-03-12 11:07:37 +00:00
aio-win32.c iothread: fix breakage on windows 2018-03-26 14:37:15 +02:00
aiocb.c
async.c coroutine: abort if we try to schedule or enter a pending coroutine 2017-11-21 11:58:07 -05:00
base64.c
bitmap.c bitmap: provide to_le/from_le helpers 2017-09-22 14:11:25 +02:00
bitops.c bitmap: remove BITOP_WORD() 2017-09-22 14:11:23 +02:00
buffer.c
bufferiszero.c util: Introduce include/qemu/cpuid.h 2017-07-24 12:42:55 +01:00
cacheinfo.c configure: Drop AIX host support 2017-09-07 19:02:30 +01:00
compatfd.c
coroutine-sigaltstack.c
coroutine-ucontext.c build: try improve handling of clang warnings 2018-03-12 08:59:03 +01:00
coroutine-win32.c
crc32c.c
cutils.c cutils: add qemu_strtoi & qemu_strtoui parsers for int/unsigned int types 2018-03-13 18:06:05 +00:00
envlist.c
error.c
event_notifier-posix.c Revert "qemu: add a cleanup callback function to EventNotifier" 2018-01-24 19:20:19 +02:00
event_notifier-win32.c Revert "qemu: add a cleanup callback function to EventNotifier" 2018-01-24 19:20:19 +02:00
fifo8.c
getauxval.c
hbitmap.c hbitmap: fix missing restore count when finish deserialization 2018-02-07 11:35:49 -05:00
hexdump.c
host-utils.c
id.c
iohandler.c
iov.c
keyval.c qapi: Replace qobject_to_X(o) by qobject_to(X, o) 2018-03-19 14:58:36 -05:00
lockcnt.c
log.c
main-loop.c replay: push replay_mutex_lock up the call tree 2018-03-12 17:10:36 +01:00
Makefile.objs membarrier: add --enable-membarrier 2018-03-12 16:12:47 +01:00
memfd.c memfd: add hugetlbsize argument 2018-02-07 14:09:25 +01:00
mmap-alloc.c sparc: Make sure we mmap at SHMLBA alignment 2017-12-15 15:26:24 +00:00
module.c
notify.c
osdep.c osdep: Retry SETLK upon EINTR 2018-01-23 12:33:07 +01:00
oslib-posix.c mem: add share parameter to memory-backend-ram 2018-02-19 13:03:24 +02:00
oslib-win32.c mem: add share parameter to memory-backend-ram 2018-02-19 13:03:24 +02:00
pagesize.c util: move qemu_real_host_page_size/mask to osdep.h 2017-10-10 09:45:00 -07:00
path.c
qdist.c
qemu-config.c qapi: Replace qobject_to_X(o) by qobject_to(X, o) 2018-03-19 14:58:36 -05:00
qemu-coroutine-io.c
qemu-coroutine-lock.c coroutine: avoid co_queue_wakeup recursion 2018-03-27 13:05:28 +01:00
qemu-coroutine-sleep.c coroutine: simplify co_aio_sleep_ns() prototype 2017-12-19 09:25:27 +00:00
qemu-coroutine.c coroutine: avoid co_queue_wakeup recursion 2018-03-27 13:05:28 +01:00
qemu-error.c error: Revert unwanted change of warning messages 2017-07-24 14:16:29 +02:00
qemu-openpty.c
qemu-option.c qapi: Replace qobject_to_X(o) by qobject_to(X, o) 2018-03-19 14:58:36 -05:00
qemu-progress.c
qemu-sockets.c sockets: allow SocketAddress 'fd' to reference numeric file descriptors 2018-03-13 18:06:06 +00:00
qemu-thread-posix.c util/qemu-thread-*: add qemu_lock, locked and unlock trace events 2018-01-16 14:54:52 +01:00
qemu-thread-win32.c util/qemu-thread-*: add qemu_lock, locked and unlock trace events 2018-01-16 14:54:52 +01:00
qemu-timer-common.c
qemu-timer.c replay: save prior value of the host clock 2018-03-12 16:12:50 +01:00
qht.c
range.c
rcu.c membarrier: introduce qemu/sys_membarrier.h 2018-03-12 16:12:47 +01:00
readline.c readline: don't free completions in readline_free() 2018-02-05 13:54:39 +01:00
stats64.c util/stats64: Fix min/max comparisons 2017-11-15 09:34:51 +01:00
sys_membarrier.c membarrier: add --enable-membarrier 2018-03-12 16:12:47 +01:00
systemd.c
thread-pool.c
throttle.c throttle: Assert that bkt->max is valid in throttle_compute_wait() 2017-09-26 14:46:23 +02:00
timed-average.c
trace-events util: Introduce vfio helpers 2018-02-08 09:22:03 +08:00
unicode.c
uri.c util/uri.c: wrap single statement blocks with braces {} 2018-03-05 09:03:17 +00:00
uuid.c util: add is_equal to UUID API 2017-12-20 22:01:24 +08:00
vfio-helpers.c block/nvme: fix Coverity reports 2018-03-01 15:21:46 +08:00