1 /*
2 * QEMU aio implementation
3 *
4 * Copyright IBM, Corp. 2008
5 *
6 * Authors:
7 * Anthony Liguori <aliguori@us.ibm.com>
8 *
9 * This work is licensed under the terms of the GNU GPL, version 2. See
10 * the COPYING file in the top-level directory.
11 *
12 * Contributions after 2012-01-13 are licensed under the terms of the
13 * GNU GPL, version 2 or (at your option) any later version.
14 */
15
16 #include "qemu/osdep.h"
17 #include "block/block.h"
18 #include "block/thread-pool.h"
19 #include "qemu/main-loop.h"
20 #include "qemu/lockcnt.h"
21 #include "qemu/rcu.h"
22 #include "qemu/rcu_queue.h"
23 #include "qemu/sockets.h"
24 #include "qemu/cutils.h"
25 #include "trace.h"
26 #include "aio-posix.h"
27
28 /* Stop userspace polling on a handler if it isn't active for some time */
29 #define POLL_IDLE_INTERVAL_NS (7 * NANOSECONDS_PER_SECOND)
30
aio_poll_disabled(AioContext * ctx)31 bool aio_poll_disabled(AioContext *ctx)
32 {
33 return qatomic_read(&ctx->poll_disable_cnt);
34 }
35
aio_add_ready_handler(AioHandlerList * ready_list,AioHandler * node,int revents)36 void aio_add_ready_handler(AioHandlerList *ready_list,
37 AioHandler *node,
38 int revents)
39 {
40 QLIST_SAFE_REMOVE(node, node_ready); /* remove from nested parent's list */
41 node->pfd.revents = revents;
42 QLIST_INSERT_HEAD(ready_list, node, node_ready);
43 }
44
aio_add_poll_ready_handler(AioHandlerList * ready_list,AioHandler * node)45 static void aio_add_poll_ready_handler(AioHandlerList *ready_list,
46 AioHandler *node)
47 {
48 QLIST_SAFE_REMOVE(node, node_ready); /* remove from nested parent's list */
49 node->poll_ready = true;
50 QLIST_INSERT_HEAD(ready_list, node, node_ready);
51 }
52
find_aio_handler(AioContext * ctx,int fd)53 static AioHandler *find_aio_handler(AioContext *ctx, int fd)
54 {
55 AioHandler *node;
56
57 QLIST_FOREACH(node, &ctx->aio_handlers, node) {
58 if (node->pfd.fd == fd) {
59 if (!QLIST_IS_INSERTED(node, node_deleted)) {
60 return node;
61 }
62 }
63 }
64
65 return NULL;
66 }
67
aio_remove_fd_handler(AioContext * ctx,AioHandler * node)68 static bool aio_remove_fd_handler(AioContext *ctx, AioHandler *node)
69 {
70 /* If the GSource is in the process of being destroyed then
71 * g_source_remove_poll() causes an assertion failure. Skip
72 * removal in that case, because glib cleans up its state during
73 * destruction anyway.
74 */
75 if (!g_source_is_destroyed(&ctx->source)) {
76 g_source_remove_poll(&ctx->source, &node->pfd);
77 }
78
79 node->pfd.revents = 0;
80 node->poll_ready = false;
81
82 /* If the fd monitor has already marked it deleted, leave it alone */
83 if (QLIST_IS_INSERTED(node, node_deleted)) {
84 return false;
85 }
86
87 /* If a read is in progress, just mark the node as deleted */
88 if (qemu_lockcnt_count(&ctx->list_lock)) {
89 QLIST_INSERT_HEAD_RCU(&ctx->deleted_aio_handlers, node, node_deleted);
90 return false;
91 }
92 /* Otherwise, delete it for real. We can't just mark it as
93 * deleted because deleted nodes are only cleaned up while
94 * no one is walking the handlers list.
95 */
96 QLIST_SAFE_REMOVE(node, node_poll);
97 QLIST_REMOVE(node, node);
98 return true;
99 }
100
aio_set_fd_handler(AioContext * ctx,int fd,IOHandler * io_read,IOHandler * io_write,AioPollFn * io_poll,IOHandler * io_poll_ready,void * opaque)101 void aio_set_fd_handler(AioContext *ctx,
102 int fd,
103 IOHandler *io_read,
104 IOHandler *io_write,
105 AioPollFn *io_poll,
106 IOHandler *io_poll_ready,
107 void *opaque)
108 {
109 AioHandler *node;
110 AioHandler *new_node = NULL;
111 bool is_new = false;
112 bool deleted = false;
113 int poll_disable_change;
114
115 if (io_poll && !io_poll_ready) {
116 io_poll = NULL; /* polling only makes sense if there is a handler */
117 }
118
119 qemu_lockcnt_lock(&ctx->list_lock);
120
121 node = find_aio_handler(ctx, fd);
122
123 /* Are we deleting the fd handler? */
124 if (!io_read && !io_write && !io_poll) {
125 if (node == NULL) {
126 qemu_lockcnt_unlock(&ctx->list_lock);
127 return;
128 }
129 /* Clean events in order to unregister fd from the ctx epoll. */
130 node->pfd.events = 0;
131
132 poll_disable_change = -!node->io_poll;
133 } else {
134 poll_disable_change = !io_poll - (node && !node->io_poll);
135 if (node == NULL) {
136 is_new = true;
137 }
138 /* Alloc and insert if it's not already there */
139 new_node = g_new0(AioHandler, 1);
140
141 /* Update handler with latest information */
142 new_node->io_read = io_read;
143 new_node->io_write = io_write;
144 new_node->io_poll = io_poll;
145 new_node->io_poll_ready = io_poll_ready;
146 new_node->opaque = opaque;
147
148 if (is_new) {
149 new_node->pfd.fd = fd;
150 } else {
151 new_node->pfd = node->pfd;
152 }
153 g_source_add_poll(&ctx->source, &new_node->pfd);
154
155 new_node->pfd.events = (io_read ? G_IO_IN | G_IO_HUP | G_IO_ERR : 0);
156 new_node->pfd.events |= (io_write ? G_IO_OUT | G_IO_ERR : 0);
157
158 QLIST_INSERT_HEAD_RCU(&ctx->aio_handlers, new_node, node);
159 }
160
161 /* No need to order poll_disable_cnt writes against other updates;
162 * the counter is only used to avoid wasting time and latency on
163 * iterated polling when the system call will be ultimately necessary.
164 * Changing handlers is a rare event, and a little wasted polling until
165 * the aio_notify below is not an issue.
166 */
167 qatomic_set(&ctx->poll_disable_cnt,
168 qatomic_read(&ctx->poll_disable_cnt) + poll_disable_change);
169
170 ctx->fdmon_ops->update(ctx, node, new_node);
171 if (node) {
172 deleted = aio_remove_fd_handler(ctx, node);
173 }
174 qemu_lockcnt_unlock(&ctx->list_lock);
175 aio_notify(ctx);
176
177 if (deleted) {
178 g_free(node);
179 }
180 }
181
aio_set_fd_poll(AioContext * ctx,int fd,IOHandler * io_poll_begin,IOHandler * io_poll_end)182 static void aio_set_fd_poll(AioContext *ctx, int fd,
183 IOHandler *io_poll_begin,
184 IOHandler *io_poll_end)
185 {
186 AioHandler *node = find_aio_handler(ctx, fd);
187
188 if (!node) {
189 return;
190 }
191
192 node->io_poll_begin = io_poll_begin;
193 node->io_poll_end = io_poll_end;
194 }
195
aio_set_event_notifier(AioContext * ctx,EventNotifier * notifier,EventNotifierHandler * io_read,AioPollFn * io_poll,EventNotifierHandler * io_poll_ready)196 void aio_set_event_notifier(AioContext *ctx,
197 EventNotifier *notifier,
198 EventNotifierHandler *io_read,
199 AioPollFn *io_poll,
200 EventNotifierHandler *io_poll_ready)
201 {
202 aio_set_fd_handler(ctx, event_notifier_get_fd(notifier),
203 (IOHandler *)io_read, NULL, io_poll,
204 (IOHandler *)io_poll_ready, notifier);
205 }
206
aio_set_event_notifier_poll(AioContext * ctx,EventNotifier * notifier,EventNotifierHandler * io_poll_begin,EventNotifierHandler * io_poll_end)207 void aio_set_event_notifier_poll(AioContext *ctx,
208 EventNotifier *notifier,
209 EventNotifierHandler *io_poll_begin,
210 EventNotifierHandler *io_poll_end)
211 {
212 aio_set_fd_poll(ctx, event_notifier_get_fd(notifier),
213 (IOHandler *)io_poll_begin,
214 (IOHandler *)io_poll_end);
215 }
216
poll_set_started(AioContext * ctx,AioHandlerList * ready_list,bool started)217 static bool poll_set_started(AioContext *ctx, AioHandlerList *ready_list,
218 bool started)
219 {
220 AioHandler *node;
221 bool progress = false;
222
223 if (started == ctx->poll_started) {
224 return false;
225 }
226
227 ctx->poll_started = started;
228
229 qemu_lockcnt_inc(&ctx->list_lock);
230 QLIST_FOREACH(node, &ctx->poll_aio_handlers, node_poll) {
231 IOHandler *fn;
232
233 if (QLIST_IS_INSERTED(node, node_deleted)) {
234 continue;
235 }
236
237 if (started) {
238 fn = node->io_poll_begin;
239 } else {
240 fn = node->io_poll_end;
241 }
242
243 if (fn) {
244 fn(node->opaque);
245 }
246
247 /* Poll one last time in case ->io_poll_end() raced with the event */
248 if (!started && node->io_poll(node->opaque)) {
249 aio_add_poll_ready_handler(ready_list, node);
250 progress = true;
251 }
252 }
253 qemu_lockcnt_dec(&ctx->list_lock);
254
255 return progress;
256 }
257
258
aio_prepare(AioContext * ctx)259 bool aio_prepare(AioContext *ctx)
260 {
261 AioHandlerList ready_list = QLIST_HEAD_INITIALIZER(ready_list);
262
263 /* Poll mode cannot be used with glib's event loop, disable it. */
264 poll_set_started(ctx, &ready_list, false);
265 /* TODO what to do with this list? */
266
267 return false;
268 }
269
aio_pending(AioContext * ctx)270 bool aio_pending(AioContext *ctx)
271 {
272 AioHandler *node;
273 bool result = false;
274
275 /*
276 * We have to walk very carefully in case aio_set_fd_handler is
277 * called while we're walking.
278 */
279 qemu_lockcnt_inc(&ctx->list_lock);
280
281 QLIST_FOREACH_RCU(node, &ctx->aio_handlers, node) {
282 int revents;
283
284 /* TODO should this check poll ready? */
285 revents = node->pfd.revents & node->pfd.events;
286 if (revents & (G_IO_IN | G_IO_HUP | G_IO_ERR) && node->io_read) {
287 result = true;
288 break;
289 }
290 if (revents & (G_IO_OUT | G_IO_ERR) && node->io_write) {
291 result = true;
292 break;
293 }
294 }
295 qemu_lockcnt_dec(&ctx->list_lock);
296
297 return result;
298 }
299
aio_free_deleted_handlers(AioContext * ctx)300 static void aio_free_deleted_handlers(AioContext *ctx)
301 {
302 AioHandler *node;
303
304 if (QLIST_EMPTY_RCU(&ctx->deleted_aio_handlers)) {
305 return;
306 }
307 if (!qemu_lockcnt_dec_if_lock(&ctx->list_lock)) {
308 return; /* we are nested, let the parent do the freeing */
309 }
310
311 while ((node = QLIST_FIRST_RCU(&ctx->deleted_aio_handlers))) {
312 QLIST_REMOVE(node, node);
313 QLIST_REMOVE(node, node_deleted);
314 QLIST_SAFE_REMOVE(node, node_poll);
315 g_free(node);
316 }
317
318 qemu_lockcnt_inc_and_unlock(&ctx->list_lock);
319 }
320
aio_dispatch_handler(AioContext * ctx,AioHandler * node)321 static bool aio_dispatch_handler(AioContext *ctx, AioHandler *node)
322 {
323 bool progress = false;
324 bool poll_ready;
325 int revents;
326
327 revents = node->pfd.revents & node->pfd.events;
328 node->pfd.revents = 0;
329
330 poll_ready = node->poll_ready;
331 node->poll_ready = false;
332
333 /*
334 * Start polling AioHandlers when they become ready because activity is
335 * likely to continue. Note that starvation is theoretically possible when
336 * fdmon_supports_polling(), but only until the fd fires for the first
337 * time.
338 */
339 if (!QLIST_IS_INSERTED(node, node_deleted) &&
340 !QLIST_IS_INSERTED(node, node_poll) &&
341 node->io_poll) {
342 trace_poll_add(ctx, node, node->pfd.fd, revents);
343 if (ctx->poll_started && node->io_poll_begin) {
344 node->io_poll_begin(node->opaque);
345 }
346 QLIST_INSERT_HEAD(&ctx->poll_aio_handlers, node, node_poll);
347 }
348 if (!QLIST_IS_INSERTED(node, node_deleted) &&
349 poll_ready && revents == 0 && node->io_poll_ready) {
350 /*
351 * Remove temporarily to avoid infinite loops when ->io_poll_ready()
352 * calls aio_poll() before clearing the condition that made the poll
353 * handler become ready.
354 */
355 QLIST_SAFE_REMOVE(node, node_poll);
356
357 node->io_poll_ready(node->opaque);
358
359 if (!QLIST_IS_INSERTED(node, node_poll)) {
360 QLIST_INSERT_HEAD(&ctx->poll_aio_handlers, node, node_poll);
361 }
362
363 /*
364 * Return early since revents was zero. aio_notify() does not count as
365 * progress.
366 */
367 return node->opaque != &ctx->notifier;
368 }
369
370 if (!QLIST_IS_INSERTED(node, node_deleted) &&
371 (revents & (G_IO_IN | G_IO_HUP | G_IO_ERR)) &&
372 node->io_read) {
373 node->io_read(node->opaque);
374
375 /* aio_notify() does not count as progress */
376 if (node->opaque != &ctx->notifier) {
377 progress = true;
378 }
379 }
380 if (!QLIST_IS_INSERTED(node, node_deleted) &&
381 (revents & (G_IO_OUT | G_IO_ERR)) &&
382 node->io_write) {
383 node->io_write(node->opaque);
384 progress = true;
385 }
386
387 return progress;
388 }
389
390 /*
391 * If we have a list of ready handlers then this is more efficient than
392 * scanning all handlers with aio_dispatch_handlers().
393 */
aio_dispatch_ready_handlers(AioContext * ctx,AioHandlerList * ready_list)394 static bool aio_dispatch_ready_handlers(AioContext *ctx,
395 AioHandlerList *ready_list)
396 {
397 bool progress = false;
398 AioHandler *node;
399
400 while ((node = QLIST_FIRST(ready_list))) {
401 QLIST_REMOVE(node, node_ready);
402 progress = aio_dispatch_handler(ctx, node) || progress;
403 }
404
405 return progress;
406 }
407
408 /* Slower than aio_dispatch_ready_handlers() but only used via glib */
aio_dispatch_handlers(AioContext * ctx)409 static bool aio_dispatch_handlers(AioContext *ctx)
410 {
411 AioHandler *node, *tmp;
412 bool progress = false;
413
414 QLIST_FOREACH_SAFE_RCU(node, &ctx->aio_handlers, node, tmp) {
415 progress = aio_dispatch_handler(ctx, node) || progress;
416 }
417
418 return progress;
419 }
420
aio_dispatch(AioContext * ctx)421 void aio_dispatch(AioContext *ctx)
422 {
423 qemu_lockcnt_inc(&ctx->list_lock);
424 aio_bh_poll(ctx);
425 aio_dispatch_handlers(ctx);
426 aio_free_deleted_handlers(ctx);
427 qemu_lockcnt_dec(&ctx->list_lock);
428
429 timerlistgroup_run_timers(&ctx->tlg);
430 }
431
run_poll_handlers_once(AioContext * ctx,AioHandlerList * ready_list,int64_t now,int64_t * timeout)432 static bool run_poll_handlers_once(AioContext *ctx,
433 AioHandlerList *ready_list,
434 int64_t now,
435 int64_t *timeout)
436 {
437 bool progress = false;
438 AioHandler *node;
439 AioHandler *tmp;
440
441 QLIST_FOREACH_SAFE(node, &ctx->poll_aio_handlers, node_poll, tmp) {
442 if (node->io_poll(node->opaque)) {
443 aio_add_poll_ready_handler(ready_list, node);
444
445 node->poll_idle_timeout = now + POLL_IDLE_INTERVAL_NS;
446
447 /*
448 * Polling was successful, exit try_poll_mode immediately
449 * to adjust the next polling time.
450 */
451 *timeout = 0;
452 if (node->opaque != &ctx->notifier) {
453 progress = true;
454 }
455 }
456
457 /* Caller handles freeing deleted nodes. Don't do it here. */
458 }
459
460 return progress;
461 }
462
fdmon_supports_polling(AioContext * ctx)463 static bool fdmon_supports_polling(AioContext *ctx)
464 {
465 return ctx->fdmon_ops->need_wait != aio_poll_disabled;
466 }
467
remove_idle_poll_handlers(AioContext * ctx,AioHandlerList * ready_list,int64_t now)468 static bool remove_idle_poll_handlers(AioContext *ctx,
469 AioHandlerList *ready_list,
470 int64_t now)
471 {
472 AioHandler *node;
473 AioHandler *tmp;
474 bool progress = false;
475
476 /*
477 * File descriptor monitoring implementations without userspace polling
478 * support suffer from starvation when a subset of handlers is polled
479 * because fds will not be processed in a timely fashion. Don't remove
480 * idle poll handlers.
481 */
482 if (!fdmon_supports_polling(ctx)) {
483 return false;
484 }
485
486 QLIST_FOREACH_SAFE(node, &ctx->poll_aio_handlers, node_poll, tmp) {
487 if (node->poll_idle_timeout == 0LL) {
488 node->poll_idle_timeout = now + POLL_IDLE_INTERVAL_NS;
489 } else if (now >= node->poll_idle_timeout) {
490 trace_poll_remove(ctx, node, node->pfd.fd);
491 node->poll_idle_timeout = 0LL;
492 QLIST_SAFE_REMOVE(node, node_poll);
493 if (ctx->poll_started && node->io_poll_end) {
494 node->io_poll_end(node->opaque);
495
496 /*
497 * Final poll in case ->io_poll_end() races with an event.
498 * Nevermind about re-adding the handler in the rare case where
499 * this causes progress.
500 */
501 if (node->io_poll(node->opaque)) {
502 aio_add_poll_ready_handler(ready_list, node);
503 progress = true;
504 }
505 }
506 }
507 }
508
509 return progress;
510 }
511
512 /* run_poll_handlers:
513 * @ctx: the AioContext
514 * @ready_list: the list to place ready handlers on
515 * @max_ns: maximum time to poll for, in nanoseconds
516 *
517 * Polls for a given time.
518 *
519 * Note that the caller must have incremented ctx->list_lock.
520 *
521 * Returns: true if progress was made, false otherwise
522 */
run_poll_handlers(AioContext * ctx,AioHandlerList * ready_list,int64_t max_ns,int64_t * timeout)523 static bool run_poll_handlers(AioContext *ctx, AioHandlerList *ready_list,
524 int64_t max_ns, int64_t *timeout)
525 {
526 bool progress;
527 int64_t start_time, elapsed_time;
528
529 assert(qemu_lockcnt_count(&ctx->list_lock) > 0);
530
531 trace_run_poll_handlers_begin(ctx, max_ns, *timeout);
532
533 /*
534 * Optimization: ->io_poll() handlers often contain RCU read critical
535 * sections and we therefore see many rcu_read_lock() -> rcu_read_unlock()
536 * -> rcu_read_lock() -> ... sequences with expensive memory
537 * synchronization primitives. Make the entire polling loop an RCU
538 * critical section because nested rcu_read_lock()/rcu_read_unlock() calls
539 * are cheap.
540 */
541 RCU_READ_LOCK_GUARD();
542
543 start_time = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
544 do {
545 progress = run_poll_handlers_once(ctx, ready_list,
546 start_time, timeout);
547 elapsed_time = qemu_clock_get_ns(QEMU_CLOCK_REALTIME) - start_time;
548 max_ns = qemu_soonest_timeout(*timeout, max_ns);
549 assert(!(max_ns && progress));
550 } while (elapsed_time < max_ns && !ctx->fdmon_ops->need_wait(ctx));
551
552 if (remove_idle_poll_handlers(ctx, ready_list,
553 start_time + elapsed_time)) {
554 *timeout = 0;
555 progress = true;
556 }
557
558 /* If time has passed with no successful polling, adjust *timeout to
559 * keep the same ending time.
560 */
561 if (*timeout != -1) {
562 *timeout -= MIN(*timeout, elapsed_time);
563 }
564
565 trace_run_poll_handlers_end(ctx, progress, *timeout);
566 return progress;
567 }
568
569 /* try_poll_mode:
570 * @ctx: the AioContext
571 * @ready_list: list to add handlers that need to be run
572 * @timeout: timeout for blocking wait, computed by the caller and updated if
573 * polling succeeds.
574 *
575 * Note that the caller must have incremented ctx->list_lock.
576 *
577 * Returns: true if progress was made, false otherwise
578 */
try_poll_mode(AioContext * ctx,AioHandlerList * ready_list,int64_t * timeout)579 static bool try_poll_mode(AioContext *ctx, AioHandlerList *ready_list,
580 int64_t *timeout)
581 {
582 int64_t max_ns;
583
584 if (QLIST_EMPTY_RCU(&ctx->poll_aio_handlers)) {
585 return false;
586 }
587
588 max_ns = qemu_soonest_timeout(*timeout, ctx->poll_ns);
589 if (max_ns && !ctx->fdmon_ops->need_wait(ctx)) {
590 /*
591 * Enable poll mode. It pairs with the poll_set_started() in
592 * aio_poll() which disables poll mode.
593 */
594 poll_set_started(ctx, ready_list, true);
595
596 if (run_poll_handlers(ctx, ready_list, max_ns, timeout)) {
597 return true;
598 }
599 }
600 return false;
601 }
602
aio_poll(AioContext * ctx,bool blocking)603 bool aio_poll(AioContext *ctx, bool blocking)
604 {
605 AioHandlerList ready_list = QLIST_HEAD_INITIALIZER(ready_list);
606 bool progress;
607 bool use_notify_me;
608 int64_t timeout;
609 int64_t start = 0;
610
611 /*
612 * There cannot be two concurrent aio_poll calls for the same AioContext (or
613 * an aio_poll concurrent with a GSource prepare/check/dispatch callback).
614 * We rely on this below to avoid slow locked accesses to ctx->notify_me.
615 *
616 * aio_poll() may only be called in the AioContext's thread. iohandler_ctx
617 * is special in that it runs in the main thread, but that thread's context
618 * is qemu_aio_context.
619 */
620 assert(in_aio_context_home_thread(ctx == iohandler_get_aio_context() ?
621 qemu_get_aio_context() : ctx));
622
623 qemu_lockcnt_inc(&ctx->list_lock);
624
625 if (ctx->poll_max_ns) {
626 start = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
627 }
628
629 timeout = blocking ? aio_compute_timeout(ctx) : 0;
630 progress = try_poll_mode(ctx, &ready_list, &timeout);
631 assert(!(timeout && progress));
632
633 /*
634 * aio_notify can avoid the expensive event_notifier_set if
635 * everything (file descriptors, bottom halves, timers) will
636 * be re-evaluated before the next blocking poll(). This is
637 * already true when aio_poll is called with blocking == false;
638 * if blocking == true, it is only true after poll() returns,
639 * so disable the optimization now.
640 */
641 use_notify_me = timeout != 0;
642 if (use_notify_me) {
643 qatomic_set(&ctx->notify_me, qatomic_read(&ctx->notify_me) + 2);
644 /*
645 * Write ctx->notify_me before reading ctx->notified. Pairs with
646 * smp_mb in aio_notify().
647 */
648 smp_mb();
649
650 /* Don't block if aio_notify() was called */
651 if (qatomic_read(&ctx->notified)) {
652 timeout = 0;
653 }
654 }
655
656 /* If polling is allowed, non-blocking aio_poll does not need the
657 * system call---a single round of run_poll_handlers_once suffices.
658 */
659 if (timeout || ctx->fdmon_ops->need_wait(ctx)) {
660 /*
661 * Disable poll mode. poll mode should be disabled before the call
662 * of ctx->fdmon_ops->wait() so that guest's notification can wake
663 * up IO threads when some work becomes pending. It is essential to
664 * avoid hangs or unnecessary latency.
665 */
666 if (poll_set_started(ctx, &ready_list, false)) {
667 timeout = 0;
668 progress = true;
669 }
670
671 ctx->fdmon_ops->wait(ctx, &ready_list, timeout);
672 }
673
674 if (use_notify_me) {
675 /* Finish the poll before clearing the flag. */
676 qatomic_store_release(&ctx->notify_me,
677 qatomic_read(&ctx->notify_me) - 2);
678 }
679
680 aio_notify_accept(ctx);
681
682 /* Adjust polling time */
683 if (ctx->poll_max_ns) {
684 int64_t block_ns = qemu_clock_get_ns(QEMU_CLOCK_REALTIME) - start;
685
686 if (block_ns <= ctx->poll_ns) {
687 /* This is the sweet spot, no adjustment needed */
688 } else if (block_ns > ctx->poll_max_ns) {
689 /* We'd have to poll for too long, poll less */
690 int64_t old = ctx->poll_ns;
691
692 if (ctx->poll_shrink) {
693 ctx->poll_ns /= ctx->poll_shrink;
694 } else {
695 ctx->poll_ns = 0;
696 }
697
698 trace_poll_shrink(ctx, old, ctx->poll_ns);
699 } else if (ctx->poll_ns < ctx->poll_max_ns &&
700 block_ns < ctx->poll_max_ns) {
701 /* There is room to grow, poll longer */
702 int64_t old = ctx->poll_ns;
703 int64_t grow = ctx->poll_grow;
704
705 if (grow == 0) {
706 grow = 2;
707 }
708
709 if (ctx->poll_ns) {
710 ctx->poll_ns *= grow;
711 } else {
712 ctx->poll_ns = 4000; /* start polling at 4 microseconds */
713 }
714
715 if (ctx->poll_ns > ctx->poll_max_ns) {
716 ctx->poll_ns = ctx->poll_max_ns;
717 }
718
719 trace_poll_grow(ctx, old, ctx->poll_ns);
720 }
721 }
722
723 progress |= aio_bh_poll(ctx);
724 progress |= aio_dispatch_ready_handlers(ctx, &ready_list);
725
726 aio_free_deleted_handlers(ctx);
727
728 qemu_lockcnt_dec(&ctx->list_lock);
729
730 progress |= timerlistgroup_run_timers(&ctx->tlg);
731
732 return progress;
733 }
734
aio_context_setup(AioContext * ctx)735 void aio_context_setup(AioContext *ctx)
736 {
737 ctx->fdmon_ops = &fdmon_poll_ops;
738 ctx->epollfd = -1;
739
740 /* Use the fastest fd monitoring implementation if available */
741 if (fdmon_io_uring_setup(ctx)) {
742 return;
743 }
744
745 fdmon_epoll_setup(ctx);
746 }
747
aio_context_destroy(AioContext * ctx)748 void aio_context_destroy(AioContext *ctx)
749 {
750 fdmon_io_uring_destroy(ctx);
751 fdmon_epoll_disable(ctx);
752 aio_free_deleted_handlers(ctx);
753 }
754
aio_context_use_g_source(AioContext * ctx)755 void aio_context_use_g_source(AioContext *ctx)
756 {
757 /*
758 * Disable io_uring when the glib main loop is used because it doesn't
759 * support mixed glib/aio_poll() usage. It relies on aio_poll() being
760 * called regularly so that changes to the monitored file descriptors are
761 * submitted, otherwise a list of pending fd handlers builds up.
762 */
763 fdmon_io_uring_destroy(ctx);
764 aio_free_deleted_handlers(ctx);
765 }
766
aio_context_set_poll_params(AioContext * ctx,int64_t max_ns,int64_t grow,int64_t shrink,Error ** errp)767 void aio_context_set_poll_params(AioContext *ctx, int64_t max_ns,
768 int64_t grow, int64_t shrink, Error **errp)
769 {
770 /* No thread synchronization here, it doesn't matter if an incorrect value
771 * is used once.
772 */
773 ctx->poll_max_ns = max_ns;
774 ctx->poll_ns = 0;
775 ctx->poll_grow = grow;
776 ctx->poll_shrink = shrink;
777
778 aio_notify(ctx);
779 }
780
aio_context_set_aio_params(AioContext * ctx,int64_t max_batch)781 void aio_context_set_aio_params(AioContext *ctx, int64_t max_batch)
782 {
783 /*
784 * No thread synchronization here, it doesn't matter if an incorrect value
785 * is used once.
786 */
787 ctx->aio_max_batch = max_batch;
788
789 aio_notify(ctx);
790 }
791