elapsed_time = qemu_clock_get_ns(QEMU_CLOCK_REALTIME) - start_time;
max_ns = qemu_soonest_timeout(*timeout, max_ns);
assert(!(max_ns && progress));
- } while (elapsed_time < max_ns && !ctx->fdmon_ops->need_wait(ctx));
+
+ if (ctx->fdmon_ops->need_wait(ctx)) {
+ if (fdmon_supports_polling(ctx)) {
+ *timeout = 0; /* stay in polling mode */
+ }
+ break;
+ }
+ } while (elapsed_time < max_ns);
if (remove_idle_poll_handlers(ctx, ready_list,
start_time + elapsed_time)) {
* up IO threads when some work becomes pending. It is essential to
* avoid hangs or unnecessary latency.
*/
- if (poll_set_started(ctx, &ready_list, false)) {
+ if (timeout && poll_set_started(ctx, &ready_list, false)) {
timeout = 0;
progress = true;
}