On Fri, Feb 14, 2020 at 05:17:12PM +0000, Stefan Hajnoczi wrote: > File descriptor monitoring is O(1) with epoll(7), but > aio_dispatch_handlers() still scans all AioHandlers instead of > dispatching just those that are ready. This makes aio_poll() O(n) with > respect to the total number of registered handlers. > > Add a local ready_list to aio_poll() so that each nested aio_poll() > builds a list of handlers ready to be dispatched. Since file descriptor > polling is level-triggered, nested aio_poll() calls also see fds that > were ready in the parent but not yet dispatched. This guarantees that > nested aio_poll() invocations will dispatch all fds, even those that > became ready before the nested invocation. > > Since only handlers ready to be dispatched are placed onto the > ready_list, the new aio_dispatch_ready_handlers() function provides O(1) > dispatch. > > Note that AioContext polling is still O(n) and currently cannot be fully > disabled. This still needs to be fixed before aio_poll() is fully O(1). > > Signed-off-by: Stefan Hajnoczi > --- > util/aio-posix.c | 106 +++++++++++++++++++++++++++++++++-------------- > 1 file changed, 76 insertions(+), 30 deletions(-) Reviewed-by: Sergio Lopez