Hello Paolo Thanks for your kind reply.
Yes, aio_poll and aio_ctx_dispatch mostly run in different threads, though Sometimes they can run in a thread nested from Fam’s slides: →http://events17.linuxfoundation.org/sites/events/files/slides/Improving%20the%20QEMU%20Event%20Loop%20-%203.pdf So you mean we can poll the same fd in two threads? If so , the ‘fd’ in ‘qemu_aio_context’ will be run twice, I think there’s something I understand wrong. Let’s take an example. In the ‘v9fs_reset’. void v9fs_reset(V9fsState *s) { VirtfsCoResetData data = { .pdu = { .s = s }, .done = false }; Coroutine *co; while (!QLIST_EMPTY(&s->active_list)) { aio_poll(qemu_get_aio_context(), true); } co = qemu_coroutine_create(virtfs_co_reset, &data); qemu_coroutine_enter(co); while (!data.done) { aio_poll(qemu_get_aio_context(), true); } } Here we use aio_poll to wait the pending action to complete. Here aio_poll will poll the fds in ‘qemu_aio_context’ in vcpu thread, However, the main loop is also poll the fds in ‘qemu_aio_context’. If some ‘fd’ in ‘qemu_aio_context’ has events, the two thread will be wakeup? You say both will call aio_dispatch_handlers and timerlistgroup_run_timers. But the are the same fd, how can this happen? Thanks, Li Qiang 发件人: Paolo Bonzini 发送时间: 2018年12月20日 4:42 收件人: Li Qiang; stefa...@redhat.com; f...@euphon.net; Qemu Developers; 李强 主题: Re: Question about aio_poll and glib aio_ctx_dispatch On 19/12/18 11:05, Li Qiang wrote: > Sent it to qemu-devel. > > Li Qiang <liq...@gmail.com <mailto:liq...@gmail.com>> 于2018年12月19日周 > 三 下午6:04写道: > > Hello Paolo, Stefan, Fam and all, > > Here I have a question about 'aio_poll'. > IIUC the 'aio_poll' is (mostly) used for synchronous IO > as I see a lot of code like this: > while(condition) > aio_poll(); > > However it seems the 'aio_poll' and 'aio_ctx_dispatch' both poll the fd. > So what happened when the 'fd' has events, which function will be > wakeup? Roughly speaking, aio_poll is used for synchronous IO and within I/O threads; aio_ctx_dispatch is used within the main thread. Both end up calling aio_dispatch_handlers and timerlistgroup_run_timers. Paolo